]> git.sesse.net Git - ffmpeg/blob - libavcodec/utils.c
sse16 & pix_norm1 optimization patch by (Felix von Leitner <felix-ffmpeg at fefe...
[ffmpeg] / libavcodec / utils.c
1 /*
2  * utils for libavcodec
3  * Copyright (c) 2001 Fabrice Bellard.
4  *
5  * This library is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU Lesser General Public
7  * License as published by the Free Software Foundation; either
8  * version 2 of the License, or (at your option) any later version.
9  *
10  * This library is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  * Lesser General Public License for more details.
14  *
15  * You should have received a copy of the GNU Lesser General Public
16  * License along with this library; if not, write to the Free Software
17  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
18  */
19 #include "avcodec.h"
20 #include "dsputil.h"
21 #include "mpegvideo.h"
22
23 void *av_mallocz(unsigned int size)
24 {
25     void *ptr;
26     
27     if(size == 0) fprintf(stderr, "Warning, allocating 0 bytes\n");
28     
29     ptr = av_malloc(size);
30     if (!ptr)
31         return NULL;
32     memset(ptr, 0, size);
33     return ptr;
34 }
35
36 /* allocation of static arrays - do not use for normal allocation */
37 static unsigned int last_static = 0;
38 static char*** array_static = NULL;
39 static const unsigned int grow_static = 64; // ^2
40 void *__av_mallocz_static(void** location, unsigned int size)
41 {
42     int l = (last_static + grow_static) & ~(grow_static - 1);
43     void *ptr = av_mallocz(size);
44     if (!ptr)
45         return NULL;
46
47     if (location)
48     {
49         if (l > last_static)
50             array_static = realloc(array_static, l);
51         array_static[last_static++] = (char**) location;
52         *location = ptr;
53     }
54     return ptr;
55 }
56 /* free all static arrays and reset pointers to 0 */
57 void av_free_static()
58 {
59     if (array_static)
60     {
61         unsigned i;
62         for (i = 0; i < last_static; i++)
63         {
64             free(*array_static[i]);
65             *array_static[i] = NULL;
66         }
67         free(array_static);
68         array_static = 0;
69     }
70     last_static = 0;
71 }
72
73 /* cannot call it directly because of 'void **' casting is not automatic */
74 void __av_freep(void **ptr)
75 {
76     av_free(*ptr);
77     *ptr = NULL;
78 }
79
80 /* encoder management */
81 AVCodec *first_avcodec;
82
83 void register_avcodec(AVCodec *format)
84 {
85     AVCodec **p;
86     p = &first_avcodec;
87     while (*p != NULL) p = &(*p)->next;
88     *p = format;
89     format->next = NULL;
90 }
91
92 typedef struct DefaultPicOpaque{
93     int last_pic_num;
94     uint8_t *data[4];
95 }DefaultPicOpaque;
96
97 int avcodec_default_get_buffer(AVCodecContext *s, AVFrame *pic){
98     int i;
99     const int width = s->width;
100     const int height= s->height;
101     DefaultPicOpaque *opaque;
102     
103     assert(pic->data[0]==NULL);
104     assert(pic->type==0 || pic->type==FF_TYPE_INTERNAL);
105
106     if(pic->opaque){
107         opaque= (DefaultPicOpaque *)pic->opaque;
108         for(i=0; i<3; i++)
109             pic->data[i]= opaque->data[i];
110
111 //    printf("get_buffer %X coded_pic_num:%d last:%d\n", pic->opaque, pic->coded_picture_number, opaque->last_pic_num);    
112         pic->age= pic->coded_picture_number - opaque->last_pic_num;
113         opaque->last_pic_num= pic->coded_picture_number;
114 //printf("age: %d %d %d\n", pic->age, c->picture_number, pic->coded_picture_number);
115     }else{
116         int align, h_chroma_shift, v_chroma_shift;
117         int w, h, pixel_size;
118         
119         avcodec_get_chroma_sub_sample(s->pix_fmt, &h_chroma_shift, &v_chroma_shift);
120         
121         switch(s->pix_fmt){
122         case PIX_FMT_YUV422:
123             pixel_size=2;
124             break;
125         case PIX_FMT_RGB24:
126         case PIX_FMT_BGR24:
127             pixel_size=3;
128             break;
129         case PIX_FMT_RGBA32:
130             pixel_size=4;
131             break;
132         default:
133             pixel_size=1;
134         }
135         
136         if(s->codec_id==CODEC_ID_SVQ1) align=63;
137         else                           align=15;
138     
139         w= (width +align)&~align;
140         h= (height+align)&~align;
141     
142         if(!(s->flags&CODEC_FLAG_EMU_EDGE)){
143             w+= EDGE_WIDTH*2;
144             h+= EDGE_WIDTH*2;
145         }
146         
147         opaque= av_mallocz(sizeof(DefaultPicOpaque));
148         if(opaque==NULL) return -1;
149
150         pic->opaque= opaque;
151         opaque->last_pic_num= -256*256*256*64;
152
153         for(i=0; i<3; i++){
154             int h_shift= i==0 ? 0 : h_chroma_shift;
155             int v_shift= i==0 ? 0 : v_chroma_shift;
156
157             pic->linesize[i]= pixel_size*w>>h_shift;
158
159             pic->base[i]= av_mallocz((pic->linesize[i]*h>>v_shift)+16); //FIXME 16
160             if(pic->base[i]==NULL) return -1;
161
162             memset(pic->base[i], 128, pic->linesize[i]*h>>v_shift);
163         
164             if(s->flags&CODEC_FLAG_EMU_EDGE)
165                 pic->data[i] = pic->base[i] + 16; //FIXME 16
166             else
167                 pic->data[i] = pic->base[i] + (pic->linesize[i]*EDGE_WIDTH>>v_shift) + (EDGE_WIDTH>>h_shift) + 16; //FIXME 16
168             
169             opaque->data[i]= pic->data[i];
170         }
171         pic->age= 256*256*256*64;
172         pic->type= FF_BUFFER_TYPE_INTERNAL;
173     }
174
175     return 0;
176 }
177
178 void avcodec_default_release_buffer(AVCodecContext *s, AVFrame *pic){
179     int i;
180     
181     assert(pic->type==FF_BUFFER_TYPE_INTERNAL);
182     
183     for(i=0; i<3; i++)
184         pic->data[i]=NULL;
185 //printf("R%X\n", pic->opaque);
186 }
187
188 void avcodec_get_context_defaults(AVCodecContext *s){
189     s->bit_rate= 800*1000;
190     s->bit_rate_tolerance= s->bit_rate*10;
191     s->qmin= 2;
192     s->qmax= 31;
193     s->mb_qmin= 2;
194     s->mb_qmax= 31;
195     s->rc_eq= "tex^qComp";
196     s->qcompress= 0.5;
197     s->max_qdiff= 3;
198     s->b_quant_factor=1.25;
199     s->b_quant_offset=1.25;
200     s->i_quant_factor=-0.8;
201     s->i_quant_offset=0.0;
202     s->error_concealment= 3;
203     s->error_resilience= 1;
204     s->workaround_bugs= FF_BUG_AUTODETECT;
205     s->frame_rate = 25 * FRAME_RATE_BASE;
206     s->gop_size= 50;
207     s->me_method= ME_EPZS;
208     s->get_buffer= avcodec_default_get_buffer;
209     s->release_buffer= avcodec_default_release_buffer;
210     s->me_subpel_quality=8;
211 }
212
213 /**
214  * allocates a AVCodecContext and set it to defaults.
215  * this can be deallocated by simply calling free() 
216  */
217 AVCodecContext *avcodec_alloc_context(void){
218     AVCodecContext *avctx= av_mallocz(sizeof(AVCodecContext));
219     
220     if(avctx==NULL) return NULL;
221     
222     avcodec_get_context_defaults(avctx);
223     
224     return avctx;
225 }
226
227 /**
228  * allocates a AVPFrame and set it to defaults.
229  * this can be deallocated by simply calling free() 
230  */
231 AVFrame *avcodec_alloc_frame(void){
232     AVFrame *pic= av_mallocz(sizeof(AVFrame));
233     
234     return pic;
235 }
236
237 int avcodec_open(AVCodecContext *avctx, AVCodec *codec)
238 {
239     int ret;
240
241     avctx->codec = codec;
242     avctx->codec_id = codec->id;
243     avctx->frame_number = 0;
244     if (codec->priv_data_size > 0) {
245         avctx->priv_data = av_mallocz(codec->priv_data_size);
246         if (!avctx->priv_data) 
247             return -ENOMEM;
248     } else {
249         avctx->priv_data = NULL;
250     }
251     ret = avctx->codec->init(avctx);
252     if (ret < 0) {
253         av_freep(&avctx->priv_data);
254         return ret;
255     }
256     return 0;
257 }
258
259 int avcodec_encode_audio(AVCodecContext *avctx, UINT8 *buf, int buf_size, 
260                          const short *samples)
261 {
262     int ret;
263
264     ret = avctx->codec->encode(avctx, buf, buf_size, (void *)samples);
265     avctx->frame_number++;
266     return ret;
267 }
268
269 int avcodec_encode_video(AVCodecContext *avctx, UINT8 *buf, int buf_size, 
270                          const AVFrame *pict)
271 {
272     int ret;
273
274     ret = avctx->codec->encode(avctx, buf, buf_size, (void *)pict);
275     
276     emms_c(); //needed to avoid a emms_c() call before every return;
277
278     avctx->frame_number++;
279     return ret;
280 }
281
282 /* decode a frame. return -1 if error, otherwise return the number of
283    bytes used. If no frame could be decompressed, *got_picture_ptr is
284    zero. Otherwise, it is non zero */
285 int avcodec_decode_video(AVCodecContext *avctx, AVFrame *picture, 
286                          int *got_picture_ptr,
287                          UINT8 *buf, int buf_size)
288 {
289     int ret;
290     
291     ret = avctx->codec->decode(avctx, picture, got_picture_ptr, 
292                                buf, buf_size);
293
294     emms_c(); //needed to avoid a emms_c() call before every return;
295     
296     if (*got_picture_ptr)                           
297         avctx->frame_number++;
298     return ret;
299 }
300
301 /* decode an audio frame. return -1 if error, otherwise return the
302    *number of bytes used. If no frame could be decompressed,
303    *frame_size_ptr is zero. Otherwise, it is the decompressed frame
304    *size in BYTES. */
305 int avcodec_decode_audio(AVCodecContext *avctx, INT16 *samples, 
306                          int *frame_size_ptr,
307                          UINT8 *buf, int buf_size)
308 {
309     int ret;
310
311     ret = avctx->codec->decode(avctx, samples, frame_size_ptr, 
312                                buf, buf_size);
313     avctx->frame_number++;
314     return ret;
315 }
316
317 int avcodec_close(AVCodecContext *avctx)
318 {
319     if (avctx->codec->close)
320         avctx->codec->close(avctx);
321     av_freep(&avctx->priv_data);
322     avctx->codec = NULL;
323     return 0;
324 }
325
326 AVCodec *avcodec_find_encoder(enum CodecID id)
327 {
328     AVCodec *p;
329     p = first_avcodec;
330     while (p) {
331         if (p->encode != NULL && p->id == id)
332             return p;
333         p = p->next;
334     }
335     return NULL;
336 }
337
338 AVCodec *avcodec_find_encoder_by_name(const char *name)
339 {
340     AVCodec *p;
341     p = first_avcodec;
342     while (p) {
343         if (p->encode != NULL && strcmp(name,p->name) == 0)
344             return p;
345         p = p->next;
346     }
347     return NULL;
348 }
349
350 AVCodec *avcodec_find_decoder(enum CodecID id)
351 {
352     AVCodec *p;
353     p = first_avcodec;
354     while (p) {
355         if (p->decode != NULL && p->id == id)
356             return p;
357         p = p->next;
358     }
359     return NULL;
360 }
361
362 AVCodec *avcodec_find_decoder_by_name(const char *name)
363 {
364     AVCodec *p;
365     p = first_avcodec;
366     while (p) {
367         if (p->decode != NULL && strcmp(name,p->name) == 0)
368             return p;
369         p = p->next;
370     }
371     return NULL;
372 }
373
374 AVCodec *avcodec_find(enum CodecID id)
375 {
376     AVCodec *p;
377     p = first_avcodec;
378     while (p) {
379         if (p->id == id)
380             return p;
381         p = p->next;
382     }
383     return NULL;
384 }
385
386 void avcodec_string(char *buf, int buf_size, AVCodecContext *enc, int encode)
387 {
388     const char *codec_name;
389     AVCodec *p;
390     char buf1[32];
391     char channels_str[100];
392     int bitrate;
393
394     if (encode)
395         p = avcodec_find_encoder(enc->codec_id);
396     else
397         p = avcodec_find_decoder(enc->codec_id);
398
399     if (p) {
400         codec_name = p->name;
401     } else if (enc->codec_name[0] != '\0') {
402         codec_name = enc->codec_name;
403     } else {
404         /* output avi tags */
405         if (enc->codec_type == CODEC_TYPE_VIDEO) {
406             snprintf(buf1, sizeof(buf1), "%c%c%c%c", 
407                      enc->codec_tag & 0xff,
408                      (enc->codec_tag >> 8) & 0xff,
409                      (enc->codec_tag >> 16) & 0xff,
410                      (enc->codec_tag >> 24) & 0xff);
411         } else {
412             snprintf(buf1, sizeof(buf1), "0x%04x", enc->codec_tag);
413         }
414         codec_name = buf1;
415     }
416
417     switch(enc->codec_type) {
418     case CODEC_TYPE_VIDEO:
419         snprintf(buf, buf_size,
420                  "Video: %s%s",
421                  codec_name, enc->flags & CODEC_FLAG_HQ ? " (hq)" : "");
422         if (enc->codec_id == CODEC_ID_RAWVIDEO) {
423             snprintf(buf + strlen(buf), buf_size - strlen(buf),
424                      ", %s",
425                      avcodec_get_pix_fmt_name(enc->pix_fmt));
426         }
427         if (enc->width) {
428             snprintf(buf + strlen(buf), buf_size - strlen(buf),
429                      ", %dx%d, %0.2f fps",
430                      enc->width, enc->height, 
431                      (float)enc->frame_rate / FRAME_RATE_BASE);
432         }
433         if (encode) {
434             snprintf(buf + strlen(buf), buf_size - strlen(buf),
435                      ", q=%d-%d", enc->qmin, enc->qmax);
436         }
437         bitrate = enc->bit_rate;
438         break;
439     case CODEC_TYPE_AUDIO:
440         snprintf(buf, buf_size,
441                  "Audio: %s",
442                  codec_name);
443         switch (enc->channels) {
444             case 1:
445                 strcpy(channels_str, "mono");
446                 break;
447             case 2:
448                 strcpy(channels_str, "stereo");
449                 break;
450             case 6:
451                 strcpy(channels_str, "5:1");
452                 break;
453             default:
454                 sprintf(channels_str, "%d channels", enc->channels);
455                 break;
456         }
457         if (enc->sample_rate) {
458             snprintf(buf + strlen(buf), buf_size - strlen(buf),
459                      ", %d Hz, %s",
460                      enc->sample_rate,
461                      channels_str);
462         }
463         
464         /* for PCM codecs, compute bitrate directly */
465         switch(enc->codec_id) {
466         case CODEC_ID_PCM_S16LE:
467         case CODEC_ID_PCM_S16BE:
468         case CODEC_ID_PCM_U16LE:
469         case CODEC_ID_PCM_U16BE:
470             bitrate = enc->sample_rate * enc->channels * 16;
471             break;
472         case CODEC_ID_PCM_S8:
473         case CODEC_ID_PCM_U8:
474         case CODEC_ID_PCM_ALAW:
475         case CODEC_ID_PCM_MULAW:
476             bitrate = enc->sample_rate * enc->channels * 8;
477             break;
478         default:
479             bitrate = enc->bit_rate;
480             break;
481         }
482         break;
483     default:
484         av_abort();
485     }
486     if (encode) {
487         if (enc->flags & CODEC_FLAG_PASS1)
488             snprintf(buf + strlen(buf), buf_size - strlen(buf),
489                      ", pass 1");
490         if (enc->flags & CODEC_FLAG_PASS2)
491             snprintf(buf + strlen(buf), buf_size - strlen(buf),
492                      ", pass 2");
493     }
494     if (bitrate != 0) {
495         snprintf(buf + strlen(buf), buf_size - strlen(buf), 
496                  ", %d kb/s", bitrate / 1000);
497     }
498 }
499
500 unsigned avcodec_version( void )
501 {
502   return LIBAVCODEC_VERSION_INT;
503 }
504
505 unsigned avcodec_build( void )
506 {
507   return LIBAVCODEC_BUILD;
508 }
509
510 /* must be called before any other functions */
511 void avcodec_init(void)
512 {
513     static int inited = 0;
514
515     if (inited != 0)
516         return;
517     inited = 1;
518
519     //dsputil_init();
520 }
521
522 /* this can be called after seeking and before trying to decode the next keyframe */
523 void avcodec_flush_buffers(AVCodecContext *avctx)
524 {
525     int i;
526     MpegEncContext *s = avctx->priv_data;
527     
528     switch(avctx->codec_id){
529     case CODEC_ID_MPEG1VIDEO:
530     case CODEC_ID_H263:
531     case CODEC_ID_RV10:
532     case CODEC_ID_MJPEG:
533     case CODEC_ID_MJPEGB:
534     case CODEC_ID_MPEG4:
535     case CODEC_ID_MSMPEG4V1:
536     case CODEC_ID_MSMPEG4V2:
537     case CODEC_ID_MSMPEG4V3:
538     case CODEC_ID_WMV1:
539     case CODEC_ID_WMV2:
540     case CODEC_ID_H263P:
541     case CODEC_ID_H263I:
542     case CODEC_ID_SVQ1:
543         for(i=0; i<MAX_PICTURE_COUNT; i++){
544            if(s->picture[i].data[0] && (   s->picture[i].type == FF_BUFFER_TYPE_INTERNAL
545                                         || s->picture[i].type == FF_BUFFER_TYPE_USER))
546             avctx->release_buffer(avctx, (AVFrame*)&s->picture[i]);
547         }
548         s->last_picture.data[0] = s->next_picture.data[0] = NULL;
549         break;
550     default:
551         //FIXME
552         break;
553     }
554 }
555
556 static int raw_encode_init(AVCodecContext *s)
557 {
558     return 0;
559 }
560
561 static int raw_decode_frame(AVCodecContext *avctx,
562                             void *data, int *data_size,
563                             UINT8 *buf, int buf_size)
564 {
565     return -1;
566 }
567
568 static int raw_encode_frame(AVCodecContext *avctx,
569                             unsigned char *frame, int buf_size, void *data)
570 {
571     return -1;
572 }
573
574 AVCodec rawvideo_codec = {
575     "rawvideo",
576     CODEC_TYPE_VIDEO,
577     CODEC_ID_RAWVIDEO,
578     0,
579     raw_encode_init,
580     raw_encode_frame,
581     NULL,
582     raw_decode_frame,
583 };