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