3 * Copyright (c) 2001 Fabrice Bellard
4 * Copyright (c) 2002-2004 Michael Niedermayer <michaelni@gmx.at>
6 * This file is part of FFmpeg.
8 * FFmpeg is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either
11 * version 2.1 of the License, or (at your option) any later version.
13 * FFmpeg is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with FFmpeg; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
28 #include "libavutil/avstring.h"
29 #include "libavutil/integer.h"
30 #include "libavutil/crc.h"
31 #include "libavutil/pixdesc.h"
32 #include "libavcore/imgutils.h"
35 #include "libavutil/opt.h"
36 #include "imgconvert.h"
37 #include "audioconvert.h"
44 static int volatile entangled_thread_counter
=0;
45 int (*ff_lockmgr_cb
)(void **mutex
, enum AVLockOp op
);
46 static void *codec_mutex
;
48 void *av_fast_realloc(void *ptr
, unsigned int *size
, unsigned int min_size
)
53 *size
= FFMAX(17*min_size
/16 + 32, min_size
);
55 ptr
= av_realloc(ptr
, *size
);
56 if(!ptr
) //we could set this to the unmodified min_size but this is safer if the user lost the ptr and uses NULL now
62 void av_fast_malloc(void *ptr
, unsigned int *size
, unsigned int min_size
)
67 *size
= FFMAX(17*min_size
/16 + 32, min_size
);
69 *p
= av_malloc(*size
);
73 /* encoder management */
74 static AVCodec
*first_avcodec
= NULL
;
76 AVCodec
*av_codec_next(AVCodec
*c
){
78 else return first_avcodec
;
81 void avcodec_register(AVCodec
*codec
)
86 while (*p
!= NULL
) p
= &(*p
)->next
;
91 #if LIBAVCODEC_VERSION_MAJOR < 53
92 void register_avcodec(AVCodec
*codec
)
94 avcodec_register(codec
);
98 unsigned avcodec_get_edge_width(void)
103 void avcodec_set_dimensions(AVCodecContext
*s
, int width
, int height
){
104 s
->coded_width
= width
;
105 s
->coded_height
= height
;
106 s
->width
= -((-width
)>>s
->lowres
);
107 s
->height
= -((-height
)>>s
->lowres
);
110 typedef struct InternalBuffer
{
116 enum PixelFormat pix_fmt
;
119 #define INTERNAL_BUFFER_SIZE 32
121 void avcodec_align_dimensions2(AVCodecContext
*s
, int *width
, int *height
, int linesize_align
[4]){
126 case PIX_FMT_YUV420P
:
127 case PIX_FMT_YUYV422
:
128 case PIX_FMT_UYVY422
:
129 case PIX_FMT_YUV422P
:
130 case PIX_FMT_YUV440P
:
131 case PIX_FMT_YUV444P
:
133 case PIX_FMT_GRAY16BE
:
134 case PIX_FMT_GRAY16LE
:
135 case PIX_FMT_YUVJ420P
:
136 case PIX_FMT_YUVJ422P
:
137 case PIX_FMT_YUVJ440P
:
138 case PIX_FMT_YUVJ444P
:
139 case PIX_FMT_YUVA420P
:
140 w_align
= 16; //FIXME check for non mpeg style codecs and use less alignment
142 if(s
->codec_id
== CODEC_ID_MPEG2VIDEO
|| s
->codec_id
== CODEC_ID_MJPEG
|| s
->codec_id
== CODEC_ID_AMV
|| s
->codec_id
== CODEC_ID_THP
)
143 h_align
= 32; // interlaced is rounded up to 2 MBs
145 case PIX_FMT_YUV411P
:
146 case PIX_FMT_UYYVYY411
:
150 case PIX_FMT_YUV410P
:
151 if(s
->codec_id
== CODEC_ID_SVQ1
){
156 if(s
->codec_id
== CODEC_ID_RPZA
){
163 if(s
->codec_id
== CODEC_ID_SMC
){
169 if((s
->codec_id
== CODEC_ID_MSZH
) || (s
->codec_id
== CODEC_ID_ZLIB
)){
180 *width
= FFALIGN(*width
, w_align
);
181 *height
= FFALIGN(*height
, h_align
);
182 if(s
->codec_id
== CODEC_ID_H264
)
183 *height
+=2; // some of the optimized chroma MC reads one line too much
188 linesize_align
[3] = STRIDE_ALIGN
;
189 //STRIDE_ALIGN is 8 for SSE* but this does not work for SVQ1 chroma planes
190 //we could change STRIDE_ALIGN to 16 for x86/sse but it would increase the
191 //picture size unneccessarily in some cases. The solution here is not
192 //pretty and better ideas are welcome!
194 if(s
->codec_id
== CODEC_ID_SVQ1
|| s
->codec_id
== CODEC_ID_VP5
||
195 s
->codec_id
== CODEC_ID_VP6
|| s
->codec_id
== CODEC_ID_VP6F
||
196 s
->codec_id
== CODEC_ID_VP6A
) {
199 linesize_align
[2] = 16;
204 void avcodec_align_dimensions(AVCodecContext
*s
, int *width
, int *height
){
205 int chroma_shift
= av_pix_fmt_descriptors
[s
->pix_fmt
].log2_chroma_w
;
206 int linesize_align
[4];
208 avcodec_align_dimensions2(s
, width
, height
, linesize_align
);
209 align
= FFMAX(linesize_align
[0], linesize_align
[3]);
210 linesize_align
[1] <<= chroma_shift
;
211 linesize_align
[2] <<= chroma_shift
;
212 align
= FFMAX3(align
, linesize_align
[1], linesize_align
[2]);
213 *width
=FFALIGN(*width
, align
);
216 #if LIBAVCODEC_VERSION_MAJOR < 53
217 int avcodec_check_dimensions(void *av_log_ctx
, unsigned int w
, unsigned int h
){
218 return av_image_check_size(w
, h
, 0, av_log_ctx
);
222 int avcodec_default_get_buffer(AVCodecContext
*s
, AVFrame
*pic
){
229 if(pic
->data
[0]!=NULL
) {
230 av_log(s
, AV_LOG_ERROR
, "pic->data[0]!=NULL in avcodec_default_get_buffer\n");
233 if(s
->internal_buffer_count
>= INTERNAL_BUFFER_SIZE
) {
234 av_log(s
, AV_LOG_ERROR
, "internal_buffer_count overflow (missing release_buffer?)\n");
238 if(av_image_check_size(w
, h
, 0, s
))
241 if(s
->internal_buffer
==NULL
){
242 s
->internal_buffer
= av_mallocz((INTERNAL_BUFFER_SIZE
+1)*sizeof(InternalBuffer
));
245 s
->internal_buffer
= av_fast_realloc(
247 &s
->internal_buffer_size
,
248 sizeof(InternalBuffer
)*FFMAX(99, s
->internal_buffer_count
+1)/*FIXME*/
252 buf
= &((InternalBuffer
*)s
->internal_buffer
)[s
->internal_buffer_count
];
253 picture_number
= &(((InternalBuffer
*)s
->internal_buffer
)[INTERNAL_BUFFER_SIZE
]).last_pic_num
; //FIXME ugly hack
256 if(buf
->base
[0] && (buf
->width
!= w
|| buf
->height
!= h
|| buf
->pix_fmt
!= s
->pix_fmt
)){
258 av_freep(&buf
->base
[i
]);
264 pic
->age
= *picture_number
- buf
->last_pic_num
;
265 buf
->last_pic_num
= *picture_number
;
267 int h_chroma_shift
, v_chroma_shift
;
274 avcodec_get_chroma_sub_sample(s
->pix_fmt
, &h_chroma_shift
, &v_chroma_shift
);
276 avcodec_align_dimensions2(s
, &w
, &h
, stride_align
);
278 if(!(s
->flags
&CODEC_FLAG_EMU_EDGE
)){
284 // NOTE: do not align linesizes individually, this breaks e.g. assumptions
285 // that linesize[0] == 2*linesize[1] in the MPEG-encoder for 4:2:2
286 av_image_fill_linesizes(picture
.linesize
, s
->pix_fmt
, w
);
287 // increase alignment of w for next try (rhs gives the lowest bit set in w)
292 unaligned
|= picture
.linesize
[i
] % stride_align
[i
];
296 tmpsize
= av_image_fill_pointers(picture
.data
, s
->pix_fmt
, h
, NULL
, picture
.linesize
);
300 for (i
=0; i
<3 && picture
.data
[i
+1]; i
++)
301 size
[i
] = picture
.data
[i
+1] - picture
.data
[i
];
302 size
[i
] = tmpsize
- (picture
.data
[i
] - picture
.data
[0]);
304 buf
->last_pic_num
= -256*256*256*64;
305 memset(buf
->base
, 0, sizeof(buf
->base
));
306 memset(buf
->data
, 0, sizeof(buf
->data
));
308 for(i
=0; i
<4 && size
[i
]; i
++){
309 const int h_shift
= i
==0 ?
0 : h_chroma_shift
;
310 const int v_shift
= i
==0 ?
0 : v_chroma_shift
;
312 buf
->linesize
[i
]= picture
.linesize
[i
];
314 buf
->base
[i
]= av_malloc(size
[i
]+16); //FIXME 16
315 if(buf
->base
[i
]==NULL
) return -1;
316 memset(buf
->base
[i
], 128, size
[i
]);
318 // no edge if EDGE EMU or not planar YUV
319 if((s
->flags
&CODEC_FLAG_EMU_EDGE
) || !size
[2])
320 buf
->data
[i
] = buf
->base
[i
];
322 buf
->data
[i
] = buf
->base
[i
] + FFALIGN((buf
->linesize
[i
]*EDGE_WIDTH
>>v_shift
) + (EDGE_WIDTH
>>h_shift
), stride_align
[i
]);
324 if(size
[1] && !size
[2])
325 ff_set_systematic_pal((uint32_t*)buf
->data
[1], s
->pix_fmt
);
326 buf
->width
= s
->width
;
327 buf
->height
= s
->height
;
328 buf
->pix_fmt
= s
->pix_fmt
;
329 pic
->age
= 256*256*256*64;
331 pic
->type
= FF_BUFFER_TYPE_INTERNAL
;
334 pic
->base
[i
]= buf
->base
[i
];
335 pic
->data
[i
]= buf
->data
[i
];
336 pic
->linesize
[i
]= buf
->linesize
[i
];
338 s
->internal_buffer_count
++;
340 pic
->reordered_opaque
= s
->reordered_opaque
;
342 if(s
->debug
&FF_DEBUG_BUFFERS
)
343 av_log(s
, AV_LOG_DEBUG
, "default_get_buffer called on pic %p, %d buffers used\n", pic
, s
->internal_buffer_count
);
348 void avcodec_default_release_buffer(AVCodecContext
*s
, AVFrame
*pic
){
350 InternalBuffer
*buf
, *last
;
352 assert(pic
->type
==FF_BUFFER_TYPE_INTERNAL
);
353 assert(s
->internal_buffer_count
);
355 buf
= NULL
; /* avoids warning */
356 for(i
=0; i
<s
->internal_buffer_count
; i
++){ //just 3-5 checks so is not worth to optimize
357 buf
= &((InternalBuffer
*)s
->internal_buffer
)[i
];
358 if(buf
->data
[0] == pic
->data
[0])
361 assert(i
< s
->internal_buffer_count
);
362 s
->internal_buffer_count
--;
363 last
= &((InternalBuffer
*)s
->internal_buffer
)[s
->internal_buffer_count
];
365 FFSWAP(InternalBuffer
, *buf
, *last
);
369 // pic->base[i]=NULL;
371 //printf("R%X\n", pic->opaque);
373 if(s
->debug
&FF_DEBUG_BUFFERS
)
374 av_log(s
, AV_LOG_DEBUG
, "default_release_buffer called on pic %p, %d buffers used\n", pic
, s
->internal_buffer_count
);
377 int avcodec_default_reget_buffer(AVCodecContext
*s
, AVFrame
*pic
){
381 /* If no picture return a new buffer */
382 if(pic
->data
[0] == NULL
) {
383 /* We will copy from buffer, so must be readable */
384 pic
->buffer_hints
|= FF_BUFFER_HINTS_READABLE
;
385 return s
->get_buffer(s
, pic
);
388 /* If internal buffer type return the same buffer */
389 if(pic
->type
== FF_BUFFER_TYPE_INTERNAL
) {
390 pic
->reordered_opaque
= s
->reordered_opaque
;
395 * Not internal type and reget_buffer not overridden, emulate cr buffer
398 for(i
= 0; i
< 4; i
++)
399 pic
->data
[i
] = pic
->base
[i
] = NULL
;
401 /* Allocate new frame */
402 if (s
->get_buffer(s
, pic
))
404 /* Copy image data from old buffer to new buffer */
405 av_picture_copy((AVPicture
*)pic
, (AVPicture
*)&temp_pic
, s
->pix_fmt
, s
->width
,
407 s
->release_buffer(s
, &temp_pic
); // Release old frame
411 int avcodec_default_execute(AVCodecContext
*c
, int (*func
)(AVCodecContext
*c2
, void *arg2
),void *arg
, int *ret
, int count
, int size
){
414 for(i
=0; i
<count
; i
++){
415 int r
= func(c
, (char*)arg
+ i
*size
);
421 int avcodec_default_execute2(AVCodecContext
*c
, int (*func
)(AVCodecContext
*c2
, void *arg2
, int jobnr
, int threadnr
),void *arg
, int *ret
, int count
){
424 for(i
=0; i
<count
; i
++){
425 int r
= func(c
, arg
, i
, 0);
431 enum PixelFormat
avcodec_default_get_format(struct AVCodecContext
*s
, const enum PixelFormat
*fmt
){
432 while (*fmt
!= PIX_FMT_NONE
&& ff_is_hwaccel_pix_fmt(*fmt
))
437 void avcodec_get_frame_defaults(AVFrame
*pic
){
438 memset(pic
, 0, sizeof(AVFrame
));
440 pic
->pts
= AV_NOPTS_VALUE
;
444 AVFrame
*avcodec_alloc_frame(void){
445 AVFrame
*pic
= av_malloc(sizeof(AVFrame
));
447 if(pic
==NULL
) return NULL
;
449 avcodec_get_frame_defaults(pic
);
454 int attribute_align_arg
avcodec_open(AVCodecContext
*avctx
, AVCodec
*codec
)
458 /* If there is a user-supplied mutex locking routine, call it. */
460 if ((*ff_lockmgr_cb
)(&codec_mutex
, AV_LOCK_OBTAIN
))
464 entangled_thread_counter
++;
465 if(entangled_thread_counter
!= 1){
466 av_log(avctx
, AV_LOG_ERROR
, "insufficient thread locking around avcodec_open/close()\n");
470 if(avctx
->codec
|| !codec
)
473 if (codec
->priv_data_size
> 0) {
474 avctx
->priv_data
= av_mallocz(codec
->priv_data_size
);
475 if (!avctx
->priv_data
) {
476 ret
= AVERROR(ENOMEM
);
480 avctx
->priv_data
= NULL
;
483 if(avctx
->coded_width
&& avctx
->coded_height
)
484 avcodec_set_dimensions(avctx
, avctx
->coded_width
, avctx
->coded_height
);
485 else if(avctx
->width
&& avctx
->height
)
486 avcodec_set_dimensions(avctx
, avctx
->width
, avctx
->height
);
488 if ((avctx
->coded_width
|| avctx
->coded_height
|| avctx
->width
|| avctx
->height
)
489 && ( av_image_check_size(avctx
->coded_width
, avctx
->coded_height
, 0, avctx
) < 0
490 || av_image_check_size(avctx
->width
, avctx
->height
, 0, avctx
) < 0)) {
491 av_log(avctx
, AV_LOG_WARNING
, "ignoring invalid width/height values\n");
492 avcodec_set_dimensions(avctx
, 0, 0);
495 #define SANE_NB_CHANNELS 128U
496 if (avctx
->channels
> SANE_NB_CHANNELS
) {
497 ret
= AVERROR(EINVAL
);
501 avctx
->codec
= codec
;
502 if ((avctx
->codec_type
== AVMEDIA_TYPE_UNKNOWN
|| avctx
->codec_type
== codec
->type
) &&
503 avctx
->codec_id
== CODEC_ID_NONE
) {
504 avctx
->codec_type
= codec
->type
;
505 avctx
->codec_id
= codec
->id
;
507 if(avctx
->codec_id
!= codec
->id
|| avctx
->codec_type
!= codec
->type
){
508 av_log(avctx
, AV_LOG_ERROR
, "codec type or id mismatches\n");
511 avctx
->frame_number
= 0;
512 if (avctx
->codec
->max_lowres
< avctx
->lowres
) {
513 av_log(avctx
, AV_LOG_ERROR
, "The maximum value for lowres supported by the decoder is %d\n",
514 avctx
->codec
->max_lowres
);
518 if(avctx
->codec
->init
){
519 ret
= avctx
->codec
->init(avctx
);
526 entangled_thread_counter
--;
528 /* Release any user-supplied mutex. */
530 (*ff_lockmgr_cb
)(&codec_mutex
, AV_LOCK_RELEASE
);
534 av_freep(&avctx
->priv_data
);
539 int attribute_align_arg
avcodec_encode_audio(AVCodecContext
*avctx
, uint8_t *buf
, int buf_size
,
540 const short *samples
)
542 if(buf_size
< FF_MIN_BUFFER_SIZE
&& 0){
543 av_log(avctx
, AV_LOG_ERROR
, "buffer smaller than minimum size\n");
546 if((avctx
->codec
->capabilities
& CODEC_CAP_DELAY
) || samples
){
547 int ret
= avctx
->codec
->encode(avctx
, buf
, buf_size
, samples
);
548 avctx
->frame_number
++;
554 int attribute_align_arg
avcodec_encode_video(AVCodecContext
*avctx
, uint8_t *buf
, int buf_size
,
557 if(buf_size
< FF_MIN_BUFFER_SIZE
){
558 av_log(avctx
, AV_LOG_ERROR
, "buffer smaller than minimum size\n");
561 if(av_image_check_size(avctx
->width
, avctx
->height
, 0, avctx
))
563 if((avctx
->codec
->capabilities
& CODEC_CAP_DELAY
) || pict
){
564 int ret
= avctx
->codec
->encode(avctx
, buf
, buf_size
, pict
);
565 avctx
->frame_number
++;
566 emms_c(); //needed to avoid an emms_c() call before every return;
573 int avcodec_encode_subtitle(AVCodecContext
*avctx
, uint8_t *buf
, int buf_size
,
574 const AVSubtitle
*sub
)
577 if(sub
->start_display_time
) {
578 av_log(avctx
, AV_LOG_ERROR
, "start_display_time must be 0.\n");
581 if(sub
->num_rects
== 0 || !sub
->rects
)
583 ret
= avctx
->codec
->encode(avctx
, buf
, buf_size
, sub
);
584 avctx
->frame_number
++;
588 #if LIBAVCODEC_VERSION_MAJOR < 53
589 int attribute_align_arg
avcodec_decode_video(AVCodecContext
*avctx
, AVFrame
*picture
,
590 int *got_picture_ptr
,
591 const uint8_t *buf
, int buf_size
)
594 av_init_packet(&avpkt
);
596 avpkt
.size
= buf_size
;
597 // HACK for CorePNG to decode as normal PNG by default
598 avpkt
.flags
= AV_PKT_FLAG_KEY
;
600 return avcodec_decode_video2(avctx
, picture
, got_picture_ptr
, &avpkt
);
604 int attribute_align_arg
avcodec_decode_video2(AVCodecContext
*avctx
, AVFrame
*picture
,
605 int *got_picture_ptr
,
611 if((avctx
->coded_width
||avctx
->coded_height
) && av_image_check_size(avctx
->coded_width
, avctx
->coded_height
, 0, avctx
))
613 if((avctx
->codec
->capabilities
& CODEC_CAP_DELAY
) || avpkt
->size
){
614 ret
= avctx
->codec
->decode(avctx
, picture
, got_picture_ptr
,
617 emms_c(); //needed to avoid an emms_c() call before every return;
619 if (*got_picture_ptr
)
620 avctx
->frame_number
++;
627 #if LIBAVCODEC_VERSION_MAJOR < 53
628 int attribute_align_arg
avcodec_decode_audio2(AVCodecContext
*avctx
, int16_t *samples
,
630 const uint8_t *buf
, int buf_size
)
633 av_init_packet(&avpkt
);
635 avpkt
.size
= buf_size
;
637 return avcodec_decode_audio3(avctx
, samples
, frame_size_ptr
, &avpkt
);
641 int attribute_align_arg
avcodec_decode_audio3(AVCodecContext
*avctx
, int16_t *samples
,
647 if((avctx
->codec
->capabilities
& CODEC_CAP_DELAY
) || avpkt
->size
){
648 //FIXME remove the check below _after_ ensuring that all audio check that the available space is enough
649 if(*frame_size_ptr
< AVCODEC_MAX_AUDIO_FRAME_SIZE
){
650 av_log(avctx
, AV_LOG_ERROR
, "buffer smaller than AVCODEC_MAX_AUDIO_FRAME_SIZE\n");
653 if(*frame_size_ptr
< FF_MIN_BUFFER_SIZE
||
654 *frame_size_ptr
< avctx
->channels
* avctx
->frame_size
* sizeof(int16_t)){
655 av_log(avctx
, AV_LOG_ERROR
, "buffer %d too small\n", *frame_size_ptr
);
659 ret
= avctx
->codec
->decode(avctx
, samples
, frame_size_ptr
, avpkt
);
660 avctx
->frame_number
++;
668 #if LIBAVCODEC_VERSION_MAJOR < 53
669 int avcodec_decode_subtitle(AVCodecContext
*avctx
, AVSubtitle
*sub
,
671 const uint8_t *buf
, int buf_size
)
674 av_init_packet(&avpkt
);
676 avpkt
.size
= buf_size
;
678 return avcodec_decode_subtitle2(avctx
, sub
, got_sub_ptr
, &avpkt
);
682 int avcodec_decode_subtitle2(AVCodecContext
*avctx
, AVSubtitle
*sub
,
689 ret
= avctx
->codec
->decode(avctx
, sub
, got_sub_ptr
, avpkt
);
691 avctx
->frame_number
++;
695 void avsubtitle_free(AVSubtitle
*sub
)
699 for (i
= 0; i
< sub
->num_rects
; i
++)
701 av_freep(&sub
->rects
[i
]->pict
.data
[0]);
702 av_freep(&sub
->rects
[i
]->pict
.data
[1]);
703 av_freep(&sub
->rects
[i
]->pict
.data
[2]);
704 av_freep(&sub
->rects
[i
]->pict
.data
[3]);
705 av_freep(&sub
->rects
[i
]->text
);
706 av_freep(&sub
->rects
[i
]->ass
);
707 av_freep(&sub
->rects
[i
]);
710 av_freep(&sub
->rects
);
712 memset(sub
, 0, sizeof(AVSubtitle
));
715 av_cold
int avcodec_close(AVCodecContext
*avctx
)
717 /* If there is a user-supplied mutex locking routine, call it. */
719 if ((*ff_lockmgr_cb
)(&codec_mutex
, AV_LOCK_OBTAIN
))
723 entangled_thread_counter
++;
724 if(entangled_thread_counter
!= 1){
725 av_log(avctx
, AV_LOG_ERROR
, "insufficient thread locking around avcodec_open/close()\n");
726 entangled_thread_counter
--;
730 if (HAVE_THREADS
&& avctx
->thread_opaque
)
731 avcodec_thread_free(avctx
);
732 if (avctx
->codec
&& avctx
->codec
->close
)
733 avctx
->codec
->close(avctx
);
734 avcodec_default_free_buffers(avctx
);
735 avctx
->coded_frame
= NULL
;
736 av_freep(&avctx
->priv_data
);
737 if(avctx
->codec
&& avctx
->codec
->encode
)
738 av_freep(&avctx
->extradata
);
740 entangled_thread_counter
--;
742 /* Release any user-supplied mutex. */
744 (*ff_lockmgr_cb
)(&codec_mutex
, AV_LOCK_RELEASE
);
749 AVCodec
*avcodec_find_encoder(enum CodecID id
)
751 AVCodec
*p
, *experimental
=NULL
;
754 if (p
->encode
!= NULL
&& p
->id
== id
) {
755 if (p
->capabilities
& CODEC_CAP_EXPERIMENTAL
&& !experimental
) {
765 AVCodec
*avcodec_find_encoder_by_name(const char *name
)
772 if (p
->encode
!= NULL
&& strcmp(name
,p
->name
) == 0)
779 AVCodec
*avcodec_find_decoder(enum CodecID id
)
784 if (p
->decode
!= NULL
&& p
->id
== id
)
791 AVCodec
*avcodec_find_decoder_by_name(const char *name
)
798 if (p
->decode
!= NULL
&& strcmp(name
,p
->name
) == 0)
805 static int get_bit_rate(AVCodecContext
*ctx
)
810 switch(ctx
->codec_type
) {
811 case AVMEDIA_TYPE_VIDEO
:
812 case AVMEDIA_TYPE_DATA
:
813 case AVMEDIA_TYPE_SUBTITLE
:
814 case AVMEDIA_TYPE_ATTACHMENT
:
815 bit_rate
= ctx
->bit_rate
;
817 case AVMEDIA_TYPE_AUDIO
:
818 bits_per_sample
= av_get_bits_per_sample(ctx
->codec_id
);
819 bit_rate
= bits_per_sample ? ctx
->sample_rate
* ctx
->channels
* bits_per_sample
: ctx
->bit_rate
;
828 size_t av_get_codec_tag_string(char *buf
, size_t buf_size
, unsigned int codec_tag
)
832 for (i
= 0; i
< 4; i
++) {
833 len
= snprintf(buf
, buf_size
,
834 isprint(codec_tag
&0xFF) ?
"%c" : "[%d]", codec_tag
&0xFF);
836 buf_size
= buf_size
> len ? buf_size
- len
: 0;
843 void avcodec_string(char *buf
, int buf_size
, AVCodecContext
*enc
, int encode
)
845 const char *codec_name
;
849 AVRational display_aspect_ratio
;
852 p
= avcodec_find_encoder(enc
->codec_id
);
854 p
= avcodec_find_decoder(enc
->codec_id
);
857 codec_name
= p
->name
;
858 } else if (enc
->codec_id
== CODEC_ID_MPEG2TS
) {
859 /* fake mpeg2 transport stream codec (currently not
861 codec_name
= "mpeg2ts";
862 } else if (enc
->codec_name
[0] != '\0') {
863 codec_name
= enc
->codec_name
;
865 /* output avi tags */
867 av_get_codec_tag_string(tag_buf
, sizeof(tag_buf
), enc
->codec_tag
);
868 snprintf(buf1
, sizeof(buf1
), "%s / 0x%04X", tag_buf
, enc
->codec_tag
);
872 switch(enc
->codec_type
) {
873 case AVMEDIA_TYPE_VIDEO
:
874 snprintf(buf
, buf_size
,
876 codec_name
, enc
->mb_decision ?
" (hq)" : "");
877 if (enc
->pix_fmt
!= PIX_FMT_NONE
) {
878 snprintf(buf
+ strlen(buf
), buf_size
- strlen(buf
),
880 avcodec_get_pix_fmt_name(enc
->pix_fmt
));
883 snprintf(buf
+ strlen(buf
), buf_size
- strlen(buf
),
885 enc
->width
, enc
->height
);
886 if (enc
->sample_aspect_ratio
.num
) {
887 av_reduce(&display_aspect_ratio
.num
, &display_aspect_ratio
.den
,
888 enc
->width
*enc
->sample_aspect_ratio
.num
,
889 enc
->height
*enc
->sample_aspect_ratio
.den
,
891 snprintf(buf
+ strlen(buf
), buf_size
- strlen(buf
),
892 " [PAR %d:%d DAR %d:%d]",
893 enc
->sample_aspect_ratio
.num
, enc
->sample_aspect_ratio
.den
,
894 display_aspect_ratio
.num
, display_aspect_ratio
.den
);
896 if(av_log_get_level() >= AV_LOG_DEBUG
){
897 int g
= av_gcd(enc
->time_base
.num
, enc
->time_base
.den
);
898 snprintf(buf
+ strlen(buf
), buf_size
- strlen(buf
),
900 enc
->time_base
.num
/g
, enc
->time_base
.den
/g
);
904 snprintf(buf
+ strlen(buf
), buf_size
- strlen(buf
),
905 ", q=%d-%d", enc
->qmin
, enc
->qmax
);
908 case AVMEDIA_TYPE_AUDIO
:
909 snprintf(buf
, buf_size
,
912 if (enc
->sample_rate
) {
913 snprintf(buf
+ strlen(buf
), buf_size
- strlen(buf
),
914 ", %d Hz", enc
->sample_rate
);
916 av_strlcat(buf
, ", ", buf_size
);
917 avcodec_get_channel_layout_string(buf
+ strlen(buf
), buf_size
- strlen(buf
), enc
->channels
, enc
->channel_layout
);
918 if (enc
->sample_fmt
!= SAMPLE_FMT_NONE
) {
919 snprintf(buf
+ strlen(buf
), buf_size
- strlen(buf
),
920 ", %s", avcodec_get_sample_fmt_name(enc
->sample_fmt
));
923 case AVMEDIA_TYPE_DATA
:
924 snprintf(buf
, buf_size
, "Data: %s", codec_name
);
926 case AVMEDIA_TYPE_SUBTITLE
:
927 snprintf(buf
, buf_size
, "Subtitle: %s", codec_name
);
929 case AVMEDIA_TYPE_ATTACHMENT
:
930 snprintf(buf
, buf_size
, "Attachment: %s", codec_name
);
933 snprintf(buf
, buf_size
, "Invalid Codec type %d", enc
->codec_type
);
937 if (enc
->flags
& CODEC_FLAG_PASS1
)
938 snprintf(buf
+ strlen(buf
), buf_size
- strlen(buf
),
940 if (enc
->flags
& CODEC_FLAG_PASS2
)
941 snprintf(buf
+ strlen(buf
), buf_size
- strlen(buf
),
944 bitrate
= get_bit_rate(enc
);
946 snprintf(buf
+ strlen(buf
), buf_size
- strlen(buf
),
947 ", %d kb/s", bitrate
/ 1000);
951 unsigned avcodec_version( void )
953 return LIBAVCODEC_VERSION_INT
;
956 const char *avcodec_configuration(void)
958 return FFMPEG_CONFIGURATION
;
961 const char *avcodec_license(void)
963 #define LICENSE_PREFIX "libavcodec license: "
964 return LICENSE_PREFIX FFMPEG_LICENSE
+ sizeof(LICENSE_PREFIX
) - 1;
967 void avcodec_init(void)
969 static int initialized
= 0;
971 if (initialized
!= 0)
975 dsputil_static_init();
978 void avcodec_flush_buffers(AVCodecContext
*avctx
)
980 if(avctx
->codec
->flush
)
981 avctx
->codec
->flush(avctx
);
984 void avcodec_default_free_buffers(AVCodecContext
*s
){
987 if(s
->internal_buffer
==NULL
) return;
989 if (s
->internal_buffer_count
)
990 av_log(s
, AV_LOG_WARNING
, "Found %i unreleased buffers!\n", s
->internal_buffer_count
);
991 for(i
=0; i
<INTERNAL_BUFFER_SIZE
; i
++){
992 InternalBuffer
*buf
= &((InternalBuffer
*)s
->internal_buffer
)[i
];
994 av_freep(&buf
->base
[j
]);
998 av_freep(&s
->internal_buffer
);
1000 s
->internal_buffer_count
=0;
1003 char av_get_pict_type_char(int pict_type
){
1005 case FF_I_TYPE
: return 'I';
1006 case FF_P_TYPE
: return 'P';
1007 case FF_B_TYPE
: return 'B';
1008 case FF_S_TYPE
: return 'S';
1009 case FF_SI_TYPE
:return 'i';
1010 case FF_SP_TYPE
:return 'p';
1011 case FF_BI_TYPE
:return 'b';
1012 default: return '?';
1016 int av_get_bits_per_sample(enum CodecID codec_id
){
1018 case CODEC_ID_ADPCM_SBPRO_2
:
1020 case CODEC_ID_ADPCM_SBPRO_3
:
1022 case CODEC_ID_ADPCM_SBPRO_4
:
1023 case CODEC_ID_ADPCM_CT
:
1024 case CODEC_ID_ADPCM_IMA_WAV
:
1025 case CODEC_ID_ADPCM_MS
:
1026 case CODEC_ID_ADPCM_YAMAHA
:
1028 case CODEC_ID_PCM_ALAW
:
1029 case CODEC_ID_PCM_MULAW
:
1030 case CODEC_ID_PCM_S8
:
1031 case CODEC_ID_PCM_U8
:
1032 case CODEC_ID_PCM_ZORK
:
1034 case CODEC_ID_PCM_S16BE
:
1035 case CODEC_ID_PCM_S16LE
:
1036 case CODEC_ID_PCM_S16LE_PLANAR
:
1037 case CODEC_ID_PCM_U16BE
:
1038 case CODEC_ID_PCM_U16LE
:
1040 case CODEC_ID_PCM_S24DAUD
:
1041 case CODEC_ID_PCM_S24BE
:
1042 case CODEC_ID_PCM_S24LE
:
1043 case CODEC_ID_PCM_U24BE
:
1044 case CODEC_ID_PCM_U24LE
:
1046 case CODEC_ID_PCM_S32BE
:
1047 case CODEC_ID_PCM_S32LE
:
1048 case CODEC_ID_PCM_U32BE
:
1049 case CODEC_ID_PCM_U32LE
:
1050 case CODEC_ID_PCM_F32BE
:
1051 case CODEC_ID_PCM_F32LE
:
1053 case CODEC_ID_PCM_F64BE
:
1054 case CODEC_ID_PCM_F64LE
:
1061 int av_get_bits_per_sample_format(enum SampleFormat sample_fmt
) {
1062 switch (sample_fmt
) {
1065 case SAMPLE_FMT_S16
:
1067 case SAMPLE_FMT_S32
:
1068 case SAMPLE_FMT_FLT
:
1070 case SAMPLE_FMT_DBL
:
1078 int avcodec_thread_init(AVCodecContext
*s
, int thread_count
){
1079 s
->thread_count
= thread_count
;
1084 unsigned int av_xiphlacing(unsigned char *s
, unsigned int v
)
1098 #if LIBAVCODEC_VERSION_MAJOR < 53
1099 #include "libavcore/parseutils.h"
1101 int av_parse_video_frame_size(int *width_ptr
, int *height_ptr
, const char *str
)
1103 return av_parse_video_size(width_ptr
, height_ptr
, str
);
1106 int av_parse_video_frame_rate(AVRational
*frame_rate
, const char *arg
)
1108 return av_parse_video_rate(frame_rate
, arg
);
1112 int ff_match_2uint16(const uint16_t (*tab
)[2], int size
, int a
, int b
){
1114 for(i
=0; i
<size
&& !(tab
[i
][0]==a
&& tab
[i
][1]==b
); i
++);
1118 void av_log_missing_feature(void *avc
, const char *feature
, int want_sample
)
1120 av_log(avc
, AV_LOG_WARNING
, "%s not implemented. Update your FFmpeg "
1121 "version to the newest one from SVN. If the problem still "
1122 "occurs, it means that your file has a feature which has not "
1123 "been implemented.", feature
);
1125 av_log_ask_for_sample(avc
, NULL
);
1127 av_log(avc
, AV_LOG_WARNING
, "\n");
1130 void av_log_ask_for_sample(void *avc
, const char *msg
)
1133 av_log(avc
, AV_LOG_WARNING
, "%s ", msg
);
1134 av_log(avc
, AV_LOG_WARNING
, "If you want to help, upload a sample "
1135 "of this file to ftp://upload.ffmpeg.org/MPlayer/incoming/ "
1136 "and contact the ffmpeg-devel mailing list.\n");
1139 static AVHWAccel
*first_hwaccel
= NULL
;
1141 void av_register_hwaccel(AVHWAccel
*hwaccel
)
1143 AVHWAccel
**p
= &first_hwaccel
;
1147 hwaccel
->next
= NULL
;
1150 AVHWAccel
*av_hwaccel_next(AVHWAccel
*hwaccel
)
1152 return hwaccel ? hwaccel
->next
: first_hwaccel
;
1155 AVHWAccel
*ff_find_hwaccel(enum CodecID codec_id
, enum PixelFormat pix_fmt
)
1157 AVHWAccel
*hwaccel
=NULL
;
1159 while((hwaccel
= av_hwaccel_next(hwaccel
))){
1160 if ( hwaccel
->id
== codec_id
1161 && hwaccel
->pix_fmt
== pix_fmt
)
1167 int av_lockmgr_register(int (*cb
)(void **mutex
, enum AVLockOp op
))
1169 if (ff_lockmgr_cb
) {
1170 if (ff_lockmgr_cb(&codec_mutex
, AV_LOCK_DESTROY
))
1176 if (ff_lockmgr_cb
) {
1177 if (ff_lockmgr_cb(&codec_mutex
, AV_LOCK_CREATE
))
1183 unsigned int ff_toupper4(unsigned int x
)
1185 return toupper( x
&0xFF)
1186 + (toupper((x
>>8 )&0xFF)<<8 )
1187 + (toupper((x
>>16)&0xFF)<<16)
1188 + (toupper((x
>>24)&0xFF)<<24);