Commit | Line | Data |
---|---|---|
de6d9b64 FB |
1 | /* |
2 | * utils for libavcodec | |
ff4ec49e | 3 | * Copyright (c) 2001 Fabrice Bellard. |
9b879566 | 4 | * Copyright (c) 2003 Michel Bardiaux for the av_log API |
8f2ab833 | 5 | * Copyright (c) 2002-2004 Michael Niedermayer <michaelni@gmx.at> |
de6d9b64 | 6 | * |
ff4ec49e FB |
7 | * This library is free software; you can redistribute it and/or |
8 | * modify it under the terms of the GNU Lesser General Public | |
9 | * License as published by the Free Software Foundation; either | |
10 | * version 2 of the License, or (at your option) any later version. | |
de6d9b64 | 11 | * |
ff4ec49e | 12 | * This library is distributed in the hope that it will be useful, |
de6d9b64 | 13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
ff4ec49e FB |
14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
15 | * Lesser General Public License for more details. | |
de6d9b64 | 16 | * |
ff4ec49e FB |
17 | * You should have received a copy of the GNU Lesser General Public |
18 | * License along with this library; if not, write to the Free Software | |
19 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
de6d9b64 | 20 | */ |
983e3246 MN |
21 | |
22 | /** | |
23 | * @file utils.c | |
24 | * utils. | |
25 | */ | |
26 | ||
de6d9b64 | 27 | #include "avcodec.h" |
3123dd79 | 28 | #include "dsputil.h" |
1c2a8c7f | 29 | #include "mpegvideo.h" |
4c263142 | 30 | #include "integer.h" |
9b879566 | 31 | #include <stdarg.h> |
4c263142 | 32 | #include <limits.h> |
de6d9b64 | 33 | |
eea8c08f MN |
34 | static void avcodec_default_free_buffers(AVCodecContext *s); |
35 | ||
18f77016 | 36 | void *av_mallocz(unsigned int size) |
3123dd79 FB |
37 | { |
38 | void *ptr; | |
5b20b732 | 39 | |
3123dd79 FB |
40 | ptr = av_malloc(size); |
41 | if (!ptr) | |
42 | return NULL; | |
43 | memset(ptr, 0, size); | |
44 | return ptr; | |
45 | } | |
46 | ||
8e1e6f31 FB |
47 | char *av_strdup(const char *s) |
48 | { | |
49 | char *ptr; | |
50 | int len; | |
51 | len = strlen(s) + 1; | |
52 | ptr = av_malloc(len); | |
53 | if (!ptr) | |
54 | return NULL; | |
55 | memcpy(ptr, s, len); | |
56 | return ptr; | |
57 | } | |
58 | ||
59 | /** | |
60 | * realloc which does nothing if the block is large enough | |
61 | */ | |
5c91a675 | 62 | void *av_fast_realloc(void *ptr, unsigned int *size, unsigned int min_size) |
8e1e6f31 FB |
63 | { |
64 | if(min_size < *size) | |
65 | return ptr; | |
66 | ||
4e39ab4c | 67 | *size= 17*min_size/16 + 32; |
8e1e6f31 FB |
68 | |
69 | return av_realloc(ptr, *size); | |
70 | } | |
71 | ||
72 | ||
855ea723 | 73 | static unsigned int last_static = 0; |
8d1f2ba5 MN |
74 | static unsigned int allocated_static = 0; |
75 | static void** array_static = NULL; | |
8d1f2ba5 MN |
76 | |
77 | /** | |
78 | * allocation of static arrays - do not use for normal allocation. | |
79 | */ | |
80 | void *av_mallocz_static(unsigned int size) | |
855ea723 | 81 | { |
855ea723 | 82 | void *ptr = av_mallocz(size); |
855ea723 | 83 | |
8d1f2ba5 | 84 | if(ptr){ |
4e39ab4c | 85 | array_static =av_fast_realloc(array_static, &allocated_static, sizeof(void*)*(last_static+1)); |
8d1f2ba5 | 86 | array_static[last_static++] = ptr; |
855ea723 | 87 | } |
8d1f2ba5 | 88 | |
855ea723 ZK |
89 | return ptr; |
90 | } | |
8d1f2ba5 MN |
91 | |
92 | /** | |
93 | * free all static arrays and reset pointers to 0. | |
94 | */ | |
4cfbf61b | 95 | void av_free_static(void) |
855ea723 | 96 | { |
8d1f2ba5 MN |
97 | while(last_static){ |
98 | av_freep(&array_static[--last_static]); | |
855ea723 | 99 | } |
8d1f2ba5 | 100 | av_freep(&array_static); |
855ea723 ZK |
101 | } |
102 | ||
81c5f887 MN |
103 | /** |
104 | * Frees memory and sets the pointer to NULL. | |
105 | * @param arg pointer to the pointer which should be freed | |
106 | */ | |
107 | void av_freep(void *arg) | |
4d7a0a05 | 108 | { |
81c5f887 | 109 | void **ptr= (void**)arg; |
4d7a0a05 FB |
110 | av_free(*ptr); |
111 | *ptr = NULL; | |
112 | } | |
113 | ||
de6d9b64 FB |
114 | /* encoder management */ |
115 | AVCodec *first_avcodec; | |
116 | ||
117 | void register_avcodec(AVCodec *format) | |
118 | { | |
119 | AVCodec **p; | |
120 | p = &first_avcodec; | |
121 | while (*p != NULL) p = &(*p)->next; | |
122 | *p = format; | |
123 | format->next = NULL; | |
124 | } | |
125 | ||
d90cf87b | 126 | typedef struct InternalBuffer{ |
1e491e29 | 127 | int last_pic_num; |
d90cf87b | 128 | uint8_t *base[4]; |
1e491e29 | 129 | uint8_t *data[4]; |
237e4938 | 130 | int linesize[4]; |
d90cf87b MN |
131 | }InternalBuffer; |
132 | ||
133 | #define INTERNAL_BUFFER_SIZE 32 | |
1e491e29 | 134 | |
f0bbfc4a MN |
135 | #define ALIGN(x, a) (((x)+(a)-1)&~((a)-1)) |
136 | ||
137 | void avcodec_align_dimensions(AVCodecContext *s, int *width, int *height){ | |
138 | int w_align= 1; | |
139 | int h_align= 1; | |
140 | ||
141 | switch(s->pix_fmt){ | |
142 | case PIX_FMT_YUV420P: | |
143 | case PIX_FMT_YUV422: | |
144 | case PIX_FMT_YUV422P: | |
145 | case PIX_FMT_YUV444P: | |
146 | case PIX_FMT_GRAY8: | |
147 | case PIX_FMT_YUVJ420P: | |
148 | case PIX_FMT_YUVJ422P: | |
149 | case PIX_FMT_YUVJ444P: | |
150 | w_align= 16; //FIXME check for non mpeg style codecs and use less alignment | |
151 | h_align= 16; | |
152 | break; | |
153 | case PIX_FMT_YUV411P: | |
154 | w_align=32; | |
155 | h_align=8; | |
156 | break; | |
157 | case PIX_FMT_YUV410P: | |
158 | if(s->codec_id == CODEC_ID_SVQ1){ | |
159 | w_align=64; | |
160 | h_align=64; | |
161 | } | |
162 | break; | |
163 | default: | |
164 | w_align= 1; | |
165 | h_align= 1; | |
166 | break; | |
167 | } | |
168 | ||
169 | *width = ALIGN(*width , w_align); | |
170 | *height= ALIGN(*height, h_align); | |
171 | } | |
172 | ||
492cd3a9 | 173 | int avcodec_default_get_buffer(AVCodecContext *s, AVFrame *pic){ |
1e491e29 | 174 | int i; |
f0bbfc4a MN |
175 | int w= s->width; |
176 | int h= s->height; | |
d90cf87b | 177 | InternalBuffer *buf; |
237e4938 | 178 | int *picture_number; |
4e00e76b MN |
179 | |
180 | assert(pic->data[0]==NULL); | |
d90cf87b | 181 | assert(INTERNAL_BUFFER_SIZE > s->internal_buffer_count); |
1e491e29 | 182 | |
d90cf87b MN |
183 | if(s->internal_buffer==NULL){ |
184 | s->internal_buffer= av_mallocz(INTERNAL_BUFFER_SIZE*sizeof(InternalBuffer)); | |
185 | } | |
186 | #if 0 | |
187 | s->internal_buffer= av_fast_realloc( | |
188 | s->internal_buffer, | |
189 | &s->internal_buffer_size, | |
190 | sizeof(InternalBuffer)*FFMAX(99, s->internal_buffer_count+1)/*FIXME*/ | |
191 | ); | |
192 | #endif | |
193 | ||
194 | buf= &((InternalBuffer*)s->internal_buffer)[s->internal_buffer_count]; | |
237e4938 MN |
195 | picture_number= &(((InternalBuffer*)s->internal_buffer)[INTERNAL_BUFFER_SIZE-1]).last_pic_num; //FIXME ugly hack |
196 | (*picture_number)++; | |
197 | ||
d90cf87b | 198 | if(buf->base[0]){ |
237e4938 MN |
199 | pic->age= *picture_number - buf->last_pic_num; |
200 | buf->last_pic_num= *picture_number; | |
1e491e29 | 201 | }else{ |
f0bbfc4a MN |
202 | int h_chroma_shift, v_chroma_shift; |
203 | int s_align, pixel_size; | |
1e491e29 MN |
204 | |
205 | avcodec_get_chroma_sub_sample(s->pix_fmt, &h_chroma_shift, &v_chroma_shift); | |
f0bbfc4a | 206 | |
1e491e29 | 207 | switch(s->pix_fmt){ |
ba88675b MN |
208 | case PIX_FMT_RGB555: |
209 | case PIX_FMT_RGB565: | |
1e491e29 MN |
210 | case PIX_FMT_YUV422: |
211 | pixel_size=2; | |
212 | break; | |
213 | case PIX_FMT_RGB24: | |
214 | case PIX_FMT_BGR24: | |
215 | pixel_size=3; | |
216 | break; | |
1e491e29 MN |
217 | case PIX_FMT_RGBA32: |
218 | pixel_size=4; | |
219 | break; | |
220 | default: | |
221 | pixel_size=1; | |
222 | } | |
f0bbfc4a MN |
223 | |
224 | avcodec_align_dimensions(s, &w, &h); | |
225 | #if defined(ARCH_POWERPC) || defined(HAVE_MMI) //FIXME some cleaner check | |
226 | s_align= 16; | |
227 | #else | |
228 | s_align= 8; | |
229 | #endif | |
230 | ||
1e491e29 MN |
231 | if(!(s->flags&CODEC_FLAG_EMU_EDGE)){ |
232 | w+= EDGE_WIDTH*2; | |
233 | h+= EDGE_WIDTH*2; | |
234 | } | |
235 | ||
d90cf87b | 236 | buf->last_pic_num= -256*256*256*64; |
1e491e29 MN |
237 | |
238 | for(i=0; i<3; i++){ | |
2c19981a MN |
239 | const int h_shift= i==0 ? 0 : h_chroma_shift; |
240 | const int v_shift= i==0 ? 0 : v_chroma_shift; | |
1e491e29 | 241 | |
7984082a MN |
242 | //FIXME next ensures that linesize= 2^x uvlinesize, thats needed because some MC code assumes it |
243 | buf->linesize[i]= ALIGN(pixel_size*w>>h_shift, s_align<<(h_chroma_shift-h_shift)); | |
1e491e29 | 244 | |
237e4938 | 245 | buf->base[i]= av_mallocz((buf->linesize[i]*h>>v_shift)+16); //FIXME 16 |
d90cf87b | 246 | if(buf->base[i]==NULL) return -1; |
237e4938 | 247 | memset(buf->base[i], 128, buf->linesize[i]*h>>v_shift); |
1e491e29 MN |
248 | |
249 | if(s->flags&CODEC_FLAG_EMU_EDGE) | |
d90cf87b | 250 | buf->data[i] = buf->base[i]; |
1e491e29 | 251 | else |
237e4938 | 252 | buf->data[i] = buf->base[i] + ALIGN((buf->linesize[i]*EDGE_WIDTH>>v_shift) + (EDGE_WIDTH>>h_shift), s_align); |
1e491e29 MN |
253 | } |
254 | pic->age= 256*256*256*64; | |
255 | } | |
237e4938 | 256 | pic->type= FF_BUFFER_TYPE_INTERNAL; |
1e491e29 | 257 | |
d90cf87b MN |
258 | for(i=0; i<4; i++){ |
259 | pic->base[i]= buf->base[i]; | |
260 | pic->data[i]= buf->data[i]; | |
237e4938 | 261 | pic->linesize[i]= buf->linesize[i]; |
d90cf87b MN |
262 | } |
263 | s->internal_buffer_count++; | |
264 | ||
1e491e29 MN |
265 | return 0; |
266 | } | |
267 | ||
492cd3a9 | 268 | void avcodec_default_release_buffer(AVCodecContext *s, AVFrame *pic){ |
1e491e29 | 269 | int i; |
d90cf87b MN |
270 | InternalBuffer *buf, *last, temp; |
271 | ||
4e00e76b | 272 | assert(pic->type==FF_BUFFER_TYPE_INTERNAL); |
59c673d5 | 273 | assert(s->internal_buffer_count); |
d90cf87b | 274 | |
b1609412 | 275 | buf = NULL; /* avoids warning */ |
d90cf87b MN |
276 | for(i=0; i<s->internal_buffer_count; i++){ //just 3-5 checks so is not worth to optimize |
277 | buf= &((InternalBuffer*)s->internal_buffer)[i]; | |
278 | if(buf->data[0] == pic->data[0]) | |
279 | break; | |
280 | } | |
281 | assert(i < s->internal_buffer_count); | |
282 | s->internal_buffer_count--; | |
283 | last = &((InternalBuffer*)s->internal_buffer)[s->internal_buffer_count]; | |
284 | ||
285 | temp= *buf; | |
286 | *buf= *last; | |
287 | *last= temp; | |
288 | ||
289 | for(i=0; i<3; i++){ | |
1e491e29 | 290 | pic->data[i]=NULL; |
d90cf87b MN |
291 | // pic->base[i]=NULL; |
292 | } | |
1e491e29 MN |
293 | //printf("R%X\n", pic->opaque); |
294 | } | |
295 | ||
e1c2a5a0 RT |
296 | int avcodec_default_reget_buffer(AVCodecContext *s, AVFrame *pic){ |
297 | AVFrame temp_pic; | |
298 | int i; | |
299 | ||
300 | /* If no picture return a new buffer */ | |
301 | if(pic->data[0] == NULL) { | |
302 | /* We will copy from buffer, so must be readable */ | |
303 | pic->buffer_hints |= FF_BUFFER_HINTS_READABLE; | |
304 | return s->get_buffer(s, pic); | |
305 | } | |
306 | ||
307 | /* If internal buffer type return the same buffer */ | |
308 | if(pic->type == FF_BUFFER_TYPE_INTERNAL) | |
309 | return 0; | |
310 | ||
311 | /* | |
312 | * Not internal type and reget_buffer not overridden, emulate cr buffer | |
313 | */ | |
314 | temp_pic = *pic; | |
315 | for(i = 0; i < 4; i++) | |
316 | pic->data[i] = pic->base[i] = NULL; | |
317 | pic->opaque = NULL; | |
318 | /* Allocate new frame */ | |
319 | if (s->get_buffer(s, pic)) | |
320 | return -1; | |
321 | /* Copy image data from old buffer to new buffer */ | |
322 | img_copy((AVPicture*)pic, (AVPicture*)&temp_pic, s->pix_fmt, s->width, | |
323 | s->height); | |
324 | s->release_buffer(s, &temp_pic); // Release old frame | |
325 | return 0; | |
326 | } | |
327 | ||
9c3d33d6 MN |
328 | int avcodec_default_execute(AVCodecContext *c, int (*func)(AVCodecContext *c2, void *arg2),void **arg, int *ret, int count){ |
329 | int i; | |
330 | ||
331 | for(i=0; i<count; i++){ | |
332 | int r= func(c, arg[i]); | |
333 | if(ret) ret[i]= r; | |
334 | } | |
335 | return 0; | |
336 | } | |
337 | ||
494c56d3 | 338 | enum PixelFormat avcodec_default_get_format(struct AVCodecContext *s, const enum PixelFormat * fmt){ |
a33c7159 MN |
339 | return fmt[0]; |
340 | } | |
341 | ||
43465395 MN |
342 | static const char* context_to_name(void* ptr) { |
343 | AVCodecContext *avc= ptr; | |
344 | ||
345 | if(avc && avc->codec && avc->codec->name) | |
346 | return avc->codec->name; | |
347 | else | |
348 | return "NULL"; | |
349 | } | |
350 | ||
351 | static AVClass av_codec_context_class = { "AVCodecContext", context_to_name }; | |
352 | ||
a949d72e | 353 | void avcodec_get_context_defaults(AVCodecContext *s){ |
9740beff MN |
354 | memset(s, 0, sizeof(AVCodecContext)); |
355 | ||
43465395 | 356 | s->av_class= &av_codec_context_class; |
e8b62df6 MN |
357 | s->bit_rate= 800*1000; |
358 | s->bit_rate_tolerance= s->bit_rate*10; | |
a949d72e MN |
359 | s->qmin= 2; |
360 | s->qmax= 31; | |
17a70fde MN |
361 | s->mb_qmin= 2; |
362 | s->mb_qmax= 31; | |
a949d72e MN |
363 | s->rc_eq= "tex^qComp"; |
364 | s->qcompress= 0.5; | |
e8b62df6 MN |
365 | s->max_qdiff= 3; |
366 | s->b_quant_factor=1.25; | |
367 | s->b_quant_offset=1.25; | |
b3a391e8 | 368 | s->i_quant_factor=-0.8; |
e8b62df6 | 369 | s->i_quant_offset=0.0; |
4d2858de | 370 | s->error_concealment= 3; |
8d0e42ca | 371 | s->error_resilience= 1; |
4d2858de | 372 | s->workaround_bugs= FF_BUG_AUTODETECT; |
14bea432 MN |
373 | s->frame_rate_base= 1; |
374 | s->frame_rate = 25; | |
8d0e42ca MN |
375 | s->gop_size= 50; |
376 | s->me_method= ME_EPZS; | |
1e491e29 MN |
377 | s->get_buffer= avcodec_default_get_buffer; |
378 | s->release_buffer= avcodec_default_release_buffer; | |
a33c7159 | 379 | s->get_format= avcodec_default_get_format; |
9c3d33d6 MN |
380 | s->execute= avcodec_default_execute; |
381 | s->thread_count=1; | |
826f429a | 382 | s->me_subpel_quality=8; |
158c7f05 MN |
383 | s->lmin= FF_QP2LAMBDA * s->qmin; |
384 | s->lmax= FF_QP2LAMBDA * s->qmax; | |
5ff85f1d | 385 | s->sample_aspect_ratio= (AVRational){0,1}; |
620fe604 | 386 | s->ildct_cmp= FF_CMP_VSAD; |
1984f635 MN |
387 | |
388 | s->intra_quant_bias= FF_DEFAULT_QUANT_BIAS; | |
389 | s->inter_quant_bias= FF_DEFAULT_QUANT_BIAS; | |
2a2bbcb0 | 390 | s->palctrl = NULL; |
e1c2a5a0 | 391 | s->reget_buffer= avcodec_default_reget_buffer; |
a949d72e MN |
392 | } |
393 | ||
394 | /** | |
395 | * allocates a AVCodecContext and set it to defaults. | |
396 | * this can be deallocated by simply calling free() | |
397 | */ | |
7ffbb60e | 398 | AVCodecContext *avcodec_alloc_context(void){ |
9740beff | 399 | AVCodecContext *avctx= av_malloc(sizeof(AVCodecContext)); |
a949d72e MN |
400 | |
401 | if(avctx==NULL) return NULL; | |
402 | ||
403 | avcodec_get_context_defaults(avctx); | |
404 | ||
405 | return avctx; | |
406 | } | |
407 | ||
9740beff MN |
408 | void avcodec_get_frame_defaults(AVFrame *pic){ |
409 | memset(pic, 0, sizeof(AVFrame)); | |
410 | ||
411 | pic->pts= AV_NOPTS_VALUE; | |
412 | } | |
413 | ||
1e491e29 | 414 | /** |
492cd3a9 | 415 | * allocates a AVPFrame and set it to defaults. |
1e491e29 MN |
416 | * this can be deallocated by simply calling free() |
417 | */ | |
492cd3a9 | 418 | AVFrame *avcodec_alloc_frame(void){ |
9740beff MN |
419 | AVFrame *pic= av_malloc(sizeof(AVFrame)); |
420 | ||
421 | if(pic==NULL) return NULL; | |
422 | ||
423 | avcodec_get_frame_defaults(pic); | |
1e491e29 MN |
424 | |
425 | return pic; | |
426 | } | |
427 | ||
de6d9b64 FB |
428 | int avcodec_open(AVCodecContext *avctx, AVCodec *codec) |
429 | { | |
430 | int ret; | |
431 | ||
09770af8 MN |
432 | if(avctx->codec) |
433 | return -1; | |
434 | ||
de6d9b64 | 435 | avctx->codec = codec; |
4cb3ca72 | 436 | avctx->codec_id = codec->id; |
de6d9b64 | 437 | avctx->frame_number = 0; |
0edf8a7a PG |
438 | if (codec->priv_data_size > 0) { |
439 | avctx->priv_data = av_mallocz(codec->priv_data_size); | |
440 | if (!avctx->priv_data) | |
441 | return -ENOMEM; | |
442 | } else { | |
443 | avctx->priv_data = NULL; | |
444 | } | |
de6d9b64 FB |
445 | ret = avctx->codec->init(avctx); |
446 | if (ret < 0) { | |
3123dd79 | 447 | av_freep(&avctx->priv_data); |
de6d9b64 FB |
448 | return ret; |
449 | } | |
450 | return 0; | |
451 | } | |
452 | ||
0c1a9eda | 453 | int avcodec_encode_audio(AVCodecContext *avctx, uint8_t *buf, int buf_size, |
de6d9b64 FB |
454 | const short *samples) |
455 | { | |
456 | int ret; | |
457 | ||
458 | ret = avctx->codec->encode(avctx, buf, buf_size, (void *)samples); | |
459 | avctx->frame_number++; | |
460 | return ret; | |
461 | } | |
462 | ||
0c1a9eda | 463 | int avcodec_encode_video(AVCodecContext *avctx, uint8_t *buf, int buf_size, |
492cd3a9 | 464 | const AVFrame *pict) |
de6d9b64 FB |
465 | { |
466 | int ret; | |
467 | ||
468 | ret = avctx->codec->encode(avctx, buf, buf_size, (void *)pict); | |
6bb925f4 MN |
469 | |
470 | emms_c(); //needed to avoid a emms_c() call before every return; | |
471 | ||
de6d9b64 FB |
472 | avctx->frame_number++; |
473 | return ret; | |
474 | } | |
475 | ||
f138f883 MN |
476 | /** |
477 | * decode a frame. | |
478 | * @param buf bitstream buffer, must be FF_INPUT_BUFFER_PADDING_SIZE larger then the actual read bytes | |
479 | * because some optimized bitstream readers read 32 or 64 bit at once and could read over the end | |
480 | * @param buf_size the size of the buffer in bytes | |
481 | * @param got_picture_ptr zero if no frame could be decompressed, Otherwise, it is non zero | |
482 | * @return -1 if error, otherwise return the number of | |
483 | * bytes used. | |
484 | */ | |
492cd3a9 | 485 | int avcodec_decode_video(AVCodecContext *avctx, AVFrame *picture, |
de6d9b64 | 486 | int *got_picture_ptr, |
0c1a9eda | 487 | uint8_t *buf, int buf_size) |
de6d9b64 FB |
488 | { |
489 | int ret; | |
1e491e29 | 490 | |
53db1cae | 491 | *got_picture_ptr= 0; |
de6d9b64 FB |
492 | ret = avctx->codec->decode(avctx, picture, got_picture_ptr, |
493 | buf, buf_size); | |
6bb925f4 MN |
494 | |
495 | emms_c(); //needed to avoid a emms_c() call before every return; | |
1e491e29 | 496 | |
1cb0edb4 J |
497 | if (*got_picture_ptr) |
498 | avctx->frame_number++; | |
de6d9b64 FB |
499 | return ret; |
500 | } | |
501 | ||
502 | /* decode an audio frame. return -1 if error, otherwise return the | |
503 | *number of bytes used. If no frame could be decompressed, | |
504 | *frame_size_ptr is zero. Otherwise, it is the decompressed frame | |
505 | *size in BYTES. */ | |
0c1a9eda | 506 | int avcodec_decode_audio(AVCodecContext *avctx, int16_t *samples, |
de6d9b64 | 507 | int *frame_size_ptr, |
0c1a9eda | 508 | uint8_t *buf, int buf_size) |
de6d9b64 FB |
509 | { |
510 | int ret; | |
511 | ||
53db1cae | 512 | *frame_size_ptr= 0; |
de6d9b64 FB |
513 | ret = avctx->codec->decode(avctx, samples, frame_size_ptr, |
514 | buf, buf_size); | |
515 | avctx->frame_number++; | |
516 | return ret; | |
517 | } | |
518 | ||
519 | int avcodec_close(AVCodecContext *avctx) | |
520 | { | |
521 | if (avctx->codec->close) | |
522 | avctx->codec->close(avctx); | |
eea8c08f | 523 | avcodec_default_free_buffers(avctx); |
3123dd79 | 524 | av_freep(&avctx->priv_data); |
de6d9b64 FB |
525 | avctx->codec = NULL; |
526 | return 0; | |
527 | } | |
528 | ||
529 | AVCodec *avcodec_find_encoder(enum CodecID id) | |
530 | { | |
531 | AVCodec *p; | |
532 | p = first_avcodec; | |
533 | while (p) { | |
534 | if (p->encode != NULL && p->id == id) | |
535 | return p; | |
536 | p = p->next; | |
537 | } | |
538 | return NULL; | |
539 | } | |
540 | ||
98f3b098 A |
541 | AVCodec *avcodec_find_encoder_by_name(const char *name) |
542 | { | |
543 | AVCodec *p; | |
544 | p = first_avcodec; | |
545 | while (p) { | |
546 | if (p->encode != NULL && strcmp(name,p->name) == 0) | |
547 | return p; | |
548 | p = p->next; | |
549 | } | |
550 | return NULL; | |
551 | } | |
552 | ||
de6d9b64 FB |
553 | AVCodec *avcodec_find_decoder(enum CodecID id) |
554 | { | |
555 | AVCodec *p; | |
556 | p = first_avcodec; | |
557 | while (p) { | |
558 | if (p->decode != NULL && p->id == id) | |
559 | return p; | |
560 | p = p->next; | |
561 | } | |
562 | return NULL; | |
563 | } | |
564 | ||
565 | AVCodec *avcodec_find_decoder_by_name(const char *name) | |
566 | { | |
567 | AVCodec *p; | |
568 | p = first_avcodec; | |
569 | while (p) { | |
570 | if (p->decode != NULL && strcmp(name,p->name) == 0) | |
571 | return p; | |
572 | p = p->next; | |
573 | } | |
574 | return NULL; | |
575 | } | |
576 | ||
50071f0b | 577 | static AVCodec *avcodec_find(enum CodecID id) |
de6d9b64 FB |
578 | { |
579 | AVCodec *p; | |
580 | p = first_avcodec; | |
581 | while (p) { | |
582 | if (p->id == id) | |
583 | return p; | |
584 | p = p->next; | |
585 | } | |
586 | return NULL; | |
587 | } | |
588 | ||
589 | void avcodec_string(char *buf, int buf_size, AVCodecContext *enc, int encode) | |
590 | { | |
591 | const char *codec_name; | |
592 | AVCodec *p; | |
593 | char buf1[32]; | |
623563c0 | 594 | char channels_str[100]; |
a96b68b7 | 595 | int bitrate; |
de6d9b64 FB |
596 | |
597 | if (encode) | |
598 | p = avcodec_find_encoder(enc->codec_id); | |
599 | else | |
600 | p = avcodec_find_decoder(enc->codec_id); | |
601 | ||
602 | if (p) { | |
603 | codec_name = p->name; | |
98ce5991 FB |
604 | if (!encode && enc->codec_id == CODEC_ID_MP3) { |
605 | if (enc->sub_id == 2) | |
606 | codec_name = "mp2"; | |
607 | else if (enc->sub_id == 1) | |
608 | codec_name = "mp1"; | |
609 | } | |
985180a1 FB |
610 | } else if (enc->codec_id == CODEC_ID_MPEG2TS) { |
611 | /* fake mpeg2 transport stream codec (currently not | |
612 | registered) */ | |
613 | codec_name = "mpeg2ts"; | |
de6d9b64 FB |
614 | } else if (enc->codec_name[0] != '\0') { |
615 | codec_name = enc->codec_name; | |
616 | } else { | |
617 | /* output avi tags */ | |
618 | if (enc->codec_type == CODEC_TYPE_VIDEO) { | |
619 | snprintf(buf1, sizeof(buf1), "%c%c%c%c", | |
620 | enc->codec_tag & 0xff, | |
621 | (enc->codec_tag >> 8) & 0xff, | |
622 | (enc->codec_tag >> 16) & 0xff, | |
623 | (enc->codec_tag >> 24) & 0xff); | |
624 | } else { | |
625 | snprintf(buf1, sizeof(buf1), "0x%04x", enc->codec_tag); | |
626 | } | |
627 | codec_name = buf1; | |
628 | } | |
629 | ||
630 | switch(enc->codec_type) { | |
631 | case CODEC_TYPE_VIDEO: | |
632 | snprintf(buf, buf_size, | |
633 | "Video: %s%s", | |
7d1c3fc1 | 634 | codec_name, enc->mb_decision ? " (hq)" : ""); |
cf087595 FB |
635 | if (enc->codec_id == CODEC_ID_RAWVIDEO) { |
636 | snprintf(buf + strlen(buf), buf_size - strlen(buf), | |
637 | ", %s", | |
9bbffbb1 | 638 | avcodec_get_pix_fmt_name(enc->pix_fmt)); |
cf087595 | 639 | } |
de6d9b64 FB |
640 | if (enc->width) { |
641 | snprintf(buf + strlen(buf), buf_size - strlen(buf), | |
642 | ", %dx%d, %0.2f fps", | |
643 | enc->width, enc->height, | |
14bea432 | 644 | (float)enc->frame_rate / enc->frame_rate_base); |
de6d9b64 | 645 | } |
4bfad535 FB |
646 | if (encode) { |
647 | snprintf(buf + strlen(buf), buf_size - strlen(buf), | |
648 | ", q=%d-%d", enc->qmin, enc->qmax); | |
649 | } | |
a96b68b7 | 650 | bitrate = enc->bit_rate; |
de6d9b64 FB |
651 | break; |
652 | case CODEC_TYPE_AUDIO: | |
653 | snprintf(buf, buf_size, | |
654 | "Audio: %s", | |
655 | codec_name); | |
e0d2714a J |
656 | switch (enc->channels) { |
657 | case 1: | |
623563c0 | 658 | strcpy(channels_str, "mono"); |
e0d2714a J |
659 | break; |
660 | case 2: | |
623563c0 | 661 | strcpy(channels_str, "stereo"); |
e0d2714a J |
662 | break; |
663 | case 6: | |
623563c0 | 664 | strcpy(channels_str, "5:1"); |
e0d2714a J |
665 | break; |
666 | default: | |
667 | sprintf(channels_str, "%d channels", enc->channels); | |
668 | break; | |
669 | } | |
de6d9b64 FB |
670 | if (enc->sample_rate) { |
671 | snprintf(buf + strlen(buf), buf_size - strlen(buf), | |
672 | ", %d Hz, %s", | |
673 | enc->sample_rate, | |
e0d2714a | 674 | channels_str); |
de6d9b64 | 675 | } |
e0d2714a | 676 | |
a96b68b7 FB |
677 | /* for PCM codecs, compute bitrate directly */ |
678 | switch(enc->codec_id) { | |
679 | case CODEC_ID_PCM_S16LE: | |
680 | case CODEC_ID_PCM_S16BE: | |
681 | case CODEC_ID_PCM_U16LE: | |
682 | case CODEC_ID_PCM_U16BE: | |
a190b7e9 | 683 | bitrate = enc->sample_rate * enc->channels * 16; |
a96b68b7 FB |
684 | break; |
685 | case CODEC_ID_PCM_S8: | |
686 | case CODEC_ID_PCM_U8: | |
687 | case CODEC_ID_PCM_ALAW: | |
688 | case CODEC_ID_PCM_MULAW: | |
a190b7e9 | 689 | bitrate = enc->sample_rate * enc->channels * 8; |
a96b68b7 FB |
690 | break; |
691 | default: | |
692 | bitrate = enc->bit_rate; | |
693 | break; | |
694 | } | |
de6d9b64 | 695 | break; |
985180a1 FB |
696 | case CODEC_TYPE_DATA: |
697 | snprintf(buf, buf_size, "Data: %s", codec_name); | |
698 | bitrate = enc->bit_rate; | |
699 | break; | |
de6d9b64 | 700 | default: |
b71472eb | 701 | av_abort(); |
de6d9b64 | 702 | } |
4bfad535 FB |
703 | if (encode) { |
704 | if (enc->flags & CODEC_FLAG_PASS1) | |
705 | snprintf(buf + strlen(buf), buf_size - strlen(buf), | |
706 | ", pass 1"); | |
707 | if (enc->flags & CODEC_FLAG_PASS2) | |
708 | snprintf(buf + strlen(buf), buf_size - strlen(buf), | |
709 | ", pass 2"); | |
710 | } | |
a96b68b7 | 711 | if (bitrate != 0) { |
de6d9b64 | 712 | snprintf(buf + strlen(buf), buf_size - strlen(buf), |
a96b68b7 | 713 | ", %d kb/s", bitrate / 1000); |
de6d9b64 FB |
714 | } |
715 | } | |
716 | ||
156e5023 NK |
717 | unsigned avcodec_version( void ) |
718 | { | |
719 | return LIBAVCODEC_VERSION_INT; | |
720 | } | |
cf087595 | 721 | |
8bceb6af NK |
722 | unsigned avcodec_build( void ) |
723 | { | |
724 | return LIBAVCODEC_BUILD; | |
725 | } | |
726 | ||
de6d9b64 FB |
727 | /* must be called before any other functions */ |
728 | void avcodec_init(void) | |
729 | { | |
0344cd0a AB |
730 | static int inited = 0; |
731 | ||
732 | if (inited != 0) | |
733 | return; | |
734 | inited = 1; | |
735 | ||
59cf08ce | 736 | dsputil_static_init(); |
de6d9b64 FB |
737 | } |
738 | ||
7a06ff14 MN |
739 | /** |
740 | * Flush buffers, should be called when seeking or when swicthing to a different stream. | |
741 | */ | |
1c2a8c7f MN |
742 | void avcodec_flush_buffers(AVCodecContext *avctx) |
743 | { | |
7a06ff14 MN |
744 | if(avctx->codec->flush) |
745 | avctx->codec->flush(avctx); | |
1c2a8c7f MN |
746 | } |
747 | ||
eea8c08f | 748 | static void avcodec_default_free_buffers(AVCodecContext *s){ |
d90cf87b MN |
749 | int i, j; |
750 | ||
751 | if(s->internal_buffer==NULL) return; | |
752 | ||
753 | for(i=0; i<INTERNAL_BUFFER_SIZE; i++){ | |
754 | InternalBuffer *buf= &((InternalBuffer*)s->internal_buffer)[i]; | |
755 | for(j=0; j<4; j++){ | |
756 | av_freep(&buf->base[j]); | |
757 | buf->data[j]= NULL; | |
758 | } | |
759 | } | |
760 | av_freep(&s->internal_buffer); | |
761 | ||
762 | s->internal_buffer_count=0; | |
763 | } | |
764 | ||
d8085ea7 MN |
765 | char av_get_pict_type_char(int pict_type){ |
766 | switch(pict_type){ | |
767 | case I_TYPE: return 'I'; | |
768 | case P_TYPE: return 'P'; | |
769 | case B_TYPE: return 'B'; | |
770 | case S_TYPE: return 'S'; | |
771 | case SI_TYPE:return 'i'; | |
772 | case SP_TYPE:return 'p'; | |
773 | default: return '?'; | |
774 | } | |
775 | } | |
776 | ||
14bea432 MN |
777 | int av_reduce(int *dst_nom, int *dst_den, int64_t nom, int64_t den, int64_t max){ |
778 | int exact=1, sign=0; | |
5ed9f2e5 | 779 | int64_t gcd; |
14bea432 MN |
780 | |
781 | assert(den != 0); | |
782 | ||
d01dbeb8 MN |
783 | if(den < 0) |
784 | return av_reduce(dst_nom, dst_den, -nom, -den, max); | |
14bea432 | 785 | |
d01dbeb8 MN |
786 | sign= nom < 0; |
787 | nom= ABS(nom); | |
14bea432 | 788 | |
5ed9f2e5 MN |
789 | gcd = ff_gcd(nom, den); |
790 | nom /= gcd; | |
791 | den /= gcd; | |
14bea432 | 792 | |
5ed9f2e5 MN |
793 | if(nom > max || den > max){ |
794 | AVRational a0={0,1}, a1={1,0}; | |
795 | exact=0; | |
796 | ||
797 | for(;;){ | |
798 | int64_t x= nom / den; | |
799 | int64_t a2n= x*a1.num + a0.num; | |
800 | int64_t a2d= x*a1.den + a0.den; | |
801 | ||
802 | if(a2n > max || a2d > max) break; | |
803 | ||
804 | nom %= den; | |
805 | ||
806 | a0= a1; | |
807 | a1= (AVRational){a2n, a2d}; | |
808 | if(nom==0) break; | |
809 | x= nom; nom=den; den=x; | |
810 | } | |
811 | nom= a1.num; | |
812 | den= a1.den; | |
14bea432 MN |
813 | } |
814 | ||
5ed9f2e5 MN |
815 | assert(ff_gcd(nom, den) == 1); |
816 | ||
d01dbeb8 | 817 | *dst_nom = sign ? -nom : nom; |
14bea432 MN |
818 | *dst_den = den; |
819 | ||
820 | return exact; | |
821 | } | |
822 | ||
4c263142 MN |
823 | int64_t av_rescale(int64_t a, int64_t b, int64_t c){ |
824 | AVInteger ai, ci; | |
14bea432 MN |
825 | assert(c > 0); |
826 | assert(b >=0); | |
827 | ||
828 | if(a<0) return -av_rescale(-a, b, c); | |
829 | ||
4c263142 MN |
830 | if(b<=INT_MAX && c<=INT_MAX){ |
831 | if(a<=INT_MAX) | |
832 | return (a * b + c/2)/c; | |
833 | else | |
834 | return a/c*b + (a%c*b + c/2)/c; | |
835 | } | |
14bea432 | 836 | |
4c263142 MN |
837 | ai= av_mul_i(av_int2i(a), av_int2i(b)); |
838 | ci= av_int2i(c); | |
839 | ai= av_add_i(ai, av_shr_i(ci,1)); | |
840 | ||
841 | return av_i2int(av_div_i(ai, ci)); | |
14bea432 | 842 | } |
9b879566 MB |
843 | |
844 | /* av_log API */ | |
845 | ||
9b879566 MB |
846 | static int av_log_level = AV_LOG_DEBUG; |
847 | ||
bc874dae | 848 | static void av_log_default_callback(void* ptr, int level, const char* fmt, va_list vl) |
9b879566 | 849 | { |
89b9441a | 850 | static int print_prefix=1; |
43465395 | 851 | AVClass* avc= ptr ? *(AVClass**)ptr : NULL; |
9b879566 | 852 | if(level>av_log_level) |
bc874dae | 853 | return; |
d705e4a6 | 854 | #undef fprintf |
43465395 MN |
855 | if(print_prefix && avc) { |
856 | fprintf(stderr, "[%s @ %p]", avc->item_name(ptr), avc); | |
bc874dae | 857 | } |
d705e4a6 | 858 | #define fprintf please_use_av_log |
89b9441a | 859 | |
95ba2c8f | 860 | print_prefix= strstr(fmt, "\n") != NULL; |
89b9441a | 861 | |
9b879566 MB |
862 | vfprintf(stderr, fmt, vl); |
863 | } | |
864 | ||
bc874dae | 865 | static void (*av_log_callback)(void*, int, const char*, va_list) = av_log_default_callback; |
9b879566 | 866 | |
bc874dae | 867 | void av_log(void* avcl, int level, const char *fmt, ...) |
9b879566 MB |
868 | { |
869 | va_list vl; | |
870 | va_start(vl, fmt); | |
bc874dae | 871 | av_vlog(avcl, level, fmt, vl); |
9b879566 MB |
872 | va_end(vl); |
873 | } | |
874 | ||
bc874dae | 875 | void av_vlog(void* avcl, int level, const char *fmt, va_list vl) |
9b879566 | 876 | { |
bc874dae | 877 | av_log_callback(avcl, level, fmt, vl); |
9b879566 MB |
878 | } |
879 | ||
880 | int av_log_get_level(void) | |
881 | { | |
882 | return av_log_level; | |
883 | } | |
884 | ||
885 | void av_log_set_level(int level) | |
886 | { | |
887 | av_log_level = level; | |
888 | } | |
889 | ||
bc874dae | 890 | void av_log_set_callback(void (*callback)(void*, int, const char*, va_list)) |
9b879566 MB |
891 | { |
892 | av_log_callback = callback; | |
893 | } | |
894 | ||
ca8ad847 MN |
895 | #if !defined(HAVE_PTHREADS) && !defined(HAVE_W32THREADS) |
896 | int avcodec_thread_init(AVCodecContext *s, int thread_count){ | |
897 | return -1; | |
898 | } | |
899 | #endif |