Statistics
| Branch: | Revision:

ffmpeg / libavcodec / utils.c @ 6e0d8c06

History | View | Annotate | Download (26.8 KB)

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
const uint8_t ff_sqrt_tab[128]={
35
        0, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5,
36
        5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
37
        8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
38
        9, 9, 9, 9,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,11,11,11,11,11,11,11
39
};
40

    
41
const uint8_t ff_log2_tab[256]={
42
        0,0,1,1,2,2,2,2,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,
43
        5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
44
        6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
45
        6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
46
        7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
47
        7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
48
        7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
49
        7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7
50
};
51

    
52
void avcodec_default_free_buffers(AVCodecContext *s);
53

    
54
void *av_mallocz(unsigned int size)
55
{
56
    void *ptr;
57
    
58
    ptr = av_malloc(size);
59
    if (!ptr)
60
        return NULL;
61
    memset(ptr, 0, size);
62
    return ptr;
63
}
64

    
65
char *av_strdup(const char *s)
66
{
67
    char *ptr;
68
    int len;
69
    len = strlen(s) + 1;
70
    ptr = av_malloc(len);
71
    if (!ptr)
72
        return NULL;
73
    memcpy(ptr, s, len);
74
    return ptr;
75
}
76

    
77
/**
78
 * realloc which does nothing if the block is large enough
79
 */
80
void *av_fast_realloc(void *ptr, unsigned int *size, unsigned int min_size)
81
{
82
    if(min_size < *size) 
83
        return ptr;
84
    
85
    *size= FFMAX(17*min_size/16 + 32, min_size);
86

    
87
    return av_realloc(ptr, *size);
88
}
89

    
90

    
91
static unsigned int last_static = 0;
92
static unsigned int allocated_static = 0;
93
static void** array_static = NULL;
94

    
95
/**
96
 * allocation of static arrays - do not use for normal allocation.
97
 */
98
void *av_mallocz_static(unsigned int size)
99
{
100
    void *ptr = av_mallocz(size);
101

    
102
    if(ptr){ 
103
        array_static =av_fast_realloc(array_static, &allocated_static, sizeof(void*)*(last_static+1));
104
        if(!array_static)
105
            return NULL;
106
        array_static[last_static++] = ptr;
107
    }
108

    
109
    return ptr;
110
}
111

    
112
/**
113
 * same as above, but does realloc
114
 */
115

    
116
void *av_realloc_static(void *ptr, unsigned int size)
117
{
118
    int i;
119
    if(!ptr)
120
      return av_mallocz_static(size);
121
    /* Look for the old ptr */
122
    for(i = 0; i < last_static; i++) {
123
        if(array_static[i] == ptr) {
124
            array_static[i] = av_realloc(array_static[i], size);
125
            return array_static[i];
126
        }
127
    }
128
    return NULL;
129

    
130
}
131

    
132
/**
133
 * free all static arrays and reset pointers to 0.
134
 */
135
void av_free_static(void)
136
{
137
    while(last_static){
138
        av_freep(&array_static[--last_static]);
139
    }
140
    av_freep(&array_static);
141
}
142

    
143
/**
144
 * Frees memory and sets the pointer to NULL.
145
 * @param arg pointer to the pointer which should be freed
146
 */
147
void av_freep(void *arg)
148
{
149
    void **ptr= (void**)arg;
150
    av_free(*ptr);
151
    *ptr = NULL;
152
}
153

    
154
/* encoder management */
155
AVCodec *first_avcodec = NULL;
156

    
157
void register_avcodec(AVCodec *format)
158
{
159
    AVCodec **p;
160
    p = &first_avcodec;
161
    while (*p != NULL) p = &(*p)->next;
162
    *p = format;
163
    format->next = NULL;
164
}
165

    
166
void avcodec_set_dimensions(AVCodecContext *s, int width, int height){
167
    s->coded_width = width;
168
    s->coded_height= height;
169
    s->width = -((-width )>>s->lowres);
170
    s->height= -((-height)>>s->lowres);
171
}
172

    
173
typedef struct InternalBuffer{
174
    int last_pic_num;
175
    uint8_t *base[4];
176
    uint8_t *data[4];
177
    int linesize[4];
178
}InternalBuffer;
179

    
180
#define INTERNAL_BUFFER_SIZE 32
181

    
182
#define ALIGN(x, a) (((x)+(a)-1)&~((a)-1))
183

    
184
void avcodec_align_dimensions(AVCodecContext *s, int *width, int *height){
185
    int w_align= 1;    
186
    int h_align= 1;    
187
    
188
    switch(s->pix_fmt){
189
    case PIX_FMT_YUV420P:
190
    case PIX_FMT_YUV422:
191
    case PIX_FMT_UYVY422:
192
    case PIX_FMT_YUV422P:
193
    case PIX_FMT_YUV444P:
194
    case PIX_FMT_GRAY8:
195
    case PIX_FMT_YUVJ420P:
196
    case PIX_FMT_YUVJ422P:
197
    case PIX_FMT_YUVJ444P:
198
        w_align= 16; //FIXME check for non mpeg style codecs and use less alignment
199
        h_align= 16;
200
        break;
201
    case PIX_FMT_YUV411P:
202
    case PIX_FMT_UYVY411:
203
        w_align=32;
204
        h_align=8;
205
        break;
206
    case PIX_FMT_YUV410P:
207
        if(s->codec_id == CODEC_ID_SVQ1){
208
            w_align=64;
209
            h_align=64;
210
        }
211
    case PIX_FMT_RGB555:
212
        if(s->codec_id == CODEC_ID_RPZA){
213
            w_align=4;
214
            h_align=4;
215
        }
216
    case PIX_FMT_PAL8:
217
        if(s->codec_id == CODEC_ID_SMC){
218
            w_align=4;
219
            h_align=4;
220
        }
221
        break;
222
    case PIX_FMT_BGR24:
223
        if((s->codec_id == CODEC_ID_MSZH) || (s->codec_id == CODEC_ID_ZLIB)){
224
            w_align=4;
225
            h_align=4;
226
        }
227
        break;
228
    default:
229
        w_align= 1;
230
        h_align= 1;
231
        break;
232
    }
233

    
234
    *width = ALIGN(*width , w_align);
235
    *height= ALIGN(*height, h_align);
236
}
237

    
238
int avcodec_check_dimensions(void *av_log_ctx, unsigned int w, unsigned int h){
239
    if((int)w>0 && (int)h>0 && (w+128)*(uint64_t)(h+128) < INT_MAX/4)
240
        return 0;
241
    
242
    av_log(av_log_ctx, AV_LOG_ERROR, "picture size invalid (%ux%u)\n", w, h);
243
    return -1;
244
}
245

    
246
int avcodec_default_get_buffer(AVCodecContext *s, AVFrame *pic){
247
    int i;
248
    int w= s->width;
249
    int h= s->height;
250
    InternalBuffer *buf;
251
    int *picture_number;
252

    
253
    assert(pic->data[0]==NULL);
254
    assert(INTERNAL_BUFFER_SIZE > s->internal_buffer_count);
255

    
256
    if(avcodec_check_dimensions(s,w,h))
257
        return -1;
258

    
259
    if(s->internal_buffer==NULL){
260
        s->internal_buffer= av_mallocz(INTERNAL_BUFFER_SIZE*sizeof(InternalBuffer));
261
    }
262
#if 0
263
    s->internal_buffer= av_fast_realloc(
264
        s->internal_buffer, 
265
        &s->internal_buffer_size, 
266
        sizeof(InternalBuffer)*FFMAX(99,  s->internal_buffer_count+1)/*FIXME*/
267
        );
268
#endif
269
     
270
    buf= &((InternalBuffer*)s->internal_buffer)[s->internal_buffer_count];
271
    picture_number= &(((InternalBuffer*)s->internal_buffer)[INTERNAL_BUFFER_SIZE-1]).last_pic_num; //FIXME ugly hack
272
    (*picture_number)++;
273
    
274
    if(buf->base[0]){
275
        pic->age= *picture_number - buf->last_pic_num;
276
        buf->last_pic_num= *picture_number;
277
    }else{
278
        int h_chroma_shift, v_chroma_shift;
279
        int pixel_size;
280
        
281
        avcodec_get_chroma_sub_sample(s->pix_fmt, &h_chroma_shift, &v_chroma_shift);
282
        
283
        switch(s->pix_fmt){
284
        case PIX_FMT_RGB555:
285
        case PIX_FMT_RGB565:
286
        case PIX_FMT_YUV422:
287
        case PIX_FMT_UYVY422:
288
            pixel_size=2;
289
            break;
290
        case PIX_FMT_RGB24:
291
        case PIX_FMT_BGR24:
292
            pixel_size=3;
293
            break;
294
        case PIX_FMT_RGBA32:
295
            pixel_size=4;
296
            break;
297
        default:
298
            pixel_size=1;
299
        }
300

    
301
        avcodec_align_dimensions(s, &w, &h);
302
            
303
        if(!(s->flags&CODEC_FLAG_EMU_EDGE)){
304
            w+= EDGE_WIDTH*2;
305
            h+= EDGE_WIDTH*2;
306
        }
307
        
308
        buf->last_pic_num= -256*256*256*64;
309

    
310
        for(i=0; i<3; i++){
311
            const int h_shift= i==0 ? 0 : h_chroma_shift;
312
            const int v_shift= i==0 ? 0 : v_chroma_shift;
313

    
314
            //FIXME next ensures that linesize= 2^x uvlinesize, thats needed because some MC code assumes it
315
            buf->linesize[i]= ALIGN(pixel_size*w>>h_shift, STRIDE_ALIGN<<(h_chroma_shift-h_shift)); 
316

    
317
            buf->base[i]= av_malloc((buf->linesize[i]*h>>v_shift)+16); //FIXME 16
318
            if(buf->base[i]==NULL) return -1;
319
            memset(buf->base[i], 128, buf->linesize[i]*h>>v_shift);
320
        
321
            if(s->flags&CODEC_FLAG_EMU_EDGE)
322
                buf->data[i] = buf->base[i];
323
            else
324
                buf->data[i] = buf->base[i] + ALIGN((buf->linesize[i]*EDGE_WIDTH>>v_shift) + (EDGE_WIDTH>>h_shift), STRIDE_ALIGN);
325
        }
326
        pic->age= 256*256*256*64;
327
    }
328
    pic->type= FF_BUFFER_TYPE_INTERNAL;
329

    
330
    for(i=0; i<4; i++){
331
        pic->base[i]= buf->base[i];
332
        pic->data[i]= buf->data[i];
333
        pic->linesize[i]= buf->linesize[i];
334
    }
335
    s->internal_buffer_count++;
336

    
337
    return 0;
338
}
339

    
340
void avcodec_default_release_buffer(AVCodecContext *s, AVFrame *pic){
341
    int i;
342
    InternalBuffer *buf, *last, temp;
343

    
344
    assert(pic->type==FF_BUFFER_TYPE_INTERNAL);
345
    assert(s->internal_buffer_count);
346

    
347
    buf = NULL; /* avoids warning */
348
    for(i=0; i<s->internal_buffer_count; i++){ //just 3-5 checks so is not worth to optimize
349
        buf= &((InternalBuffer*)s->internal_buffer)[i];
350
        if(buf->data[0] == pic->data[0])
351
            break;
352
    }
353
    assert(i < s->internal_buffer_count);
354
    s->internal_buffer_count--;
355
    last = &((InternalBuffer*)s->internal_buffer)[s->internal_buffer_count];
356

    
357
    temp= *buf;
358
    *buf= *last;
359
    *last= temp;
360

    
361
    for(i=0; i<3; i++){
362
        pic->data[i]=NULL;
363
//        pic->base[i]=NULL;
364
    }
365
//printf("R%X\n", pic->opaque);
366
}
367

    
368
int avcodec_default_reget_buffer(AVCodecContext *s, AVFrame *pic){
369
    AVFrame temp_pic;
370
    int i;
371

    
372
    /* If no picture return a new buffer */
373
    if(pic->data[0] == NULL) {
374
        /* We will copy from buffer, so must be readable */
375
        pic->buffer_hints |= FF_BUFFER_HINTS_READABLE;
376
        return s->get_buffer(s, pic);
377
    }
378

    
379
    /* If internal buffer type return the same buffer */
380
    if(pic->type == FF_BUFFER_TYPE_INTERNAL)
381
        return 0;
382

    
383
    /*
384
     * Not internal type and reget_buffer not overridden, emulate cr buffer
385
     */
386
    temp_pic = *pic;
387
    for(i = 0; i < 4; i++)
388
        pic->data[i] = pic->base[i] = NULL;
389
    pic->opaque = NULL;
390
    /* Allocate new frame */
391
    if (s->get_buffer(s, pic))
392
        return -1;
393
    /* Copy image data from old buffer to new buffer */
394
    img_copy((AVPicture*)pic, (AVPicture*)&temp_pic, s->pix_fmt, s->width,
395
             s->height);
396
    s->release_buffer(s, &temp_pic); // Release old frame
397
    return 0;
398
}
399

    
400
int avcodec_default_execute(AVCodecContext *c, int (*func)(AVCodecContext *c2, void *arg2),void **arg, int *ret, int count){
401
    int i;
402

    
403
    for(i=0; i<count; i++){
404
        int r= func(c, arg[i]);
405
        if(ret) ret[i]= r;
406
    }
407
    return 0;
408
}
409

    
410
enum PixelFormat avcodec_default_get_format(struct AVCodecContext *s, const enum PixelFormat * fmt){
411
    return fmt[0];
412
}
413

    
414
static const char* context_to_name(void* ptr) {
415
    AVCodecContext *avc= ptr;
416

    
417
    if(avc && avc->codec && avc->codec->name)
418
        return avc->codec->name; 
419
    else
420
        return "NULL";
421
}
422

    
423
static AVClass av_codec_context_class = { "AVCodecContext", context_to_name };
424

    
425
void avcodec_get_context_defaults(AVCodecContext *s){
426
    memset(s, 0, sizeof(AVCodecContext));
427

    
428
    s->av_class= &av_codec_context_class;
429
    s->bit_rate= 800*1000;
430
    s->bit_rate_tolerance= s->bit_rate*10;
431
    s->qmin= 2;
432
    s->qmax= 31;
433
    s->mb_lmin= FF_QP2LAMBDA * 2;
434
    s->mb_lmax= FF_QP2LAMBDA * 31;
435
    s->rc_eq= "tex^qComp";
436
    s->qcompress= 0.5;
437
    s->max_qdiff= 3;
438
    s->b_quant_factor=1.25;
439
    s->b_quant_offset=1.25;
440
    s->i_quant_factor=-0.8;
441
    s->i_quant_offset=0.0;
442
    s->error_concealment= 3;
443
    s->error_resilience= 1;
444
    s->workaround_bugs= FF_BUG_AUTODETECT;
445
    s->frame_rate_base= 1;
446
    s->frame_rate = 25;
447
    s->gop_size= 50;
448
    s->me_method= ME_EPZS;
449
    s->get_buffer= avcodec_default_get_buffer;
450
    s->release_buffer= avcodec_default_release_buffer;
451
    s->get_format= avcodec_default_get_format;
452
    s->execute= avcodec_default_execute;
453
    s->thread_count=1;
454
    s->me_subpel_quality=8;
455
    s->lmin= FF_QP2LAMBDA * s->qmin;
456
    s->lmax= FF_QP2LAMBDA * s->qmax;
457
    s->sample_aspect_ratio= (AVRational){0,1};
458
    s->ildct_cmp= FF_CMP_VSAD;
459
    s->profile= FF_PROFILE_UNKNOWN;
460
    s->level= FF_LEVEL_UNKNOWN;
461
    
462
    s->intra_quant_bias= FF_DEFAULT_QUANT_BIAS;
463
    s->inter_quant_bias= FF_DEFAULT_QUANT_BIAS;
464
    s->palctrl = NULL;
465
    s->reget_buffer= avcodec_default_reget_buffer;
466
}
467

    
468
/**
469
 * allocates a AVCodecContext and set it to defaults.
470
 * this can be deallocated by simply calling free() 
471
 */
472
AVCodecContext *avcodec_alloc_context(void){
473
    AVCodecContext *avctx= av_malloc(sizeof(AVCodecContext));
474
    
475
    if(avctx==NULL) return NULL;
476
    
477
    avcodec_get_context_defaults(avctx);
478
    
479
    return avctx;
480
}
481

    
482
void avcodec_get_frame_defaults(AVFrame *pic){
483
    memset(pic, 0, sizeof(AVFrame));
484

    
485
    pic->pts= AV_NOPTS_VALUE;
486
    pic->key_frame= 1;
487
}
488

    
489
/**
490
 * allocates a AVPFrame and set it to defaults.
491
 * this can be deallocated by simply calling free() 
492
 */
493
AVFrame *avcodec_alloc_frame(void){
494
    AVFrame *pic= av_malloc(sizeof(AVFrame));
495
    
496
    if(pic==NULL) return NULL;
497
    
498
    avcodec_get_frame_defaults(pic);
499
    
500
    return pic;
501
}
502

    
503
int avcodec_open(AVCodecContext *avctx, AVCodec *codec)
504
{
505
    int ret;
506

    
507
    if(avctx->codec)
508
        return -1;
509

    
510
    avctx->codec = codec;
511
    avctx->codec_id = codec->id;
512
    avctx->frame_number = 0;
513
    if (codec->priv_data_size > 0) {
514
        avctx->priv_data = av_mallocz(codec->priv_data_size);
515
        if (!avctx->priv_data) 
516
            return -ENOMEM;
517
    } else {
518
        avctx->priv_data = NULL;
519
    }
520

    
521
    if(avctx->coded_width && avctx->coded_height)
522
        avcodec_set_dimensions(avctx, avctx->coded_width, avctx->coded_height);
523
    else if(avctx->width && avctx->height)
524
        avcodec_set_dimensions(avctx, avctx->width, avctx->height);
525

    
526
    if((avctx->coded_width||avctx->coded_height) && avcodec_check_dimensions(avctx,avctx->coded_width,avctx->coded_height)){
527
        av_freep(&avctx->priv_data);
528
        return -1;
529
    }
530

    
531
    ret = avctx->codec->init(avctx);
532
    if (ret < 0) {
533
        av_freep(&avctx->priv_data);
534
        return ret;
535
    }
536
    return 0;
537
}
538

    
539
int avcodec_encode_audio(AVCodecContext *avctx, uint8_t *buf, int buf_size, 
540
                         const short *samples)
541
{
542
    if(buf_size < FF_MIN_BUFFER_SIZE && 0){
543
        av_log(avctx, AV_LOG_ERROR, "buffer smaller then minimum size\n");
544
        return -1;
545
    }
546
    if((avctx->codec->capabilities & CODEC_CAP_DELAY) || samples){
547
        int ret = avctx->codec->encode(avctx, buf, buf_size, (void *)samples);
548
        avctx->frame_number++;
549
        return ret;
550
    }else
551
        return 0;
552
}
553

    
554
int avcodec_encode_video(AVCodecContext *avctx, uint8_t *buf, int buf_size, 
555
                         const AVFrame *pict)
556
{
557
    if(buf_size < FF_MIN_BUFFER_SIZE){
558
        av_log(avctx, AV_LOG_ERROR, "buffer smaller then minimum size\n");
559
        return -1;
560
    }
561
    if(avcodec_check_dimensions(avctx,avctx->width,avctx->height))
562
        return -1;
563
    if((avctx->codec->capabilities & CODEC_CAP_DELAY) || pict){
564
        int ret = avctx->codec->encode(avctx, buf, buf_size, (void *)pict);
565
        avctx->frame_number++;
566
        emms_c(); //needed to avoid a emms_c() call before every return;
567
    
568
        return ret;
569
    }else
570
        return 0;
571
}
572

    
573
/** 
574
 * decode a frame. 
575
 * @param buf bitstream buffer, must be FF_INPUT_BUFFER_PADDING_SIZE larger then the actual read bytes
576
 * because some optimized bitstream readers read 32 or 64 bit at once and could read over the end
577
 * @param buf_size the size of the buffer in bytes
578
 * @param got_picture_ptr zero if no frame could be decompressed, Otherwise, it is non zero
579
 * @return -1 if error, otherwise return the number of
580
 * bytes used. 
581
 */
582
int avcodec_decode_video(AVCodecContext *avctx, AVFrame *picture, 
583
                         int *got_picture_ptr,
584
                         uint8_t *buf, int buf_size)
585
{
586
    int ret;
587
    
588
    *got_picture_ptr= 0;
589
    if((avctx->coded_width||avctx->coded_height) && avcodec_check_dimensions(avctx,avctx->coded_width,avctx->coded_height))
590
        return -1;
591
    if((avctx->codec->capabilities & CODEC_CAP_DELAY) || buf_size){
592
        ret = avctx->codec->decode(avctx, picture, got_picture_ptr, 
593
                                buf, buf_size);
594

    
595
        emms_c(); //needed to avoid a emms_c() call before every return;
596
    
597
        if (*got_picture_ptr)                           
598
            avctx->frame_number++;
599
    }else
600
        ret= 0;
601

    
602
    return ret;
603
}
604

    
605
/* decode an audio frame. return -1 if error, otherwise return the
606
   *number of bytes used. If no frame could be decompressed,
607
   *frame_size_ptr is zero. Otherwise, it is the decompressed frame
608
   *size in BYTES. */
609
int avcodec_decode_audio(AVCodecContext *avctx, int16_t *samples, 
610
                         int *frame_size_ptr,
611
                         uint8_t *buf, int buf_size)
612
{
613
    int ret;
614

    
615
    *frame_size_ptr= 0;
616
    ret = avctx->codec->decode(avctx, samples, frame_size_ptr, 
617
                               buf, buf_size);
618
    avctx->frame_number++;
619
    return ret;
620
}
621

    
622
int avcodec_close(AVCodecContext *avctx)
623
{
624
    if (avctx->codec->close)
625
        avctx->codec->close(avctx);
626
    avcodec_default_free_buffers(avctx);
627
    av_freep(&avctx->priv_data);
628
    avctx->codec = NULL;
629
    return 0;
630
}
631

    
632
AVCodec *avcodec_find_encoder(enum CodecID id)
633
{
634
    AVCodec *p;
635
    p = first_avcodec;
636
    while (p) {
637
        if (p->encode != NULL && p->id == id)
638
            return p;
639
        p = p->next;
640
    }
641
    return NULL;
642
}
643

    
644
AVCodec *avcodec_find_encoder_by_name(const char *name)
645
{
646
    AVCodec *p;
647
    p = first_avcodec;
648
    while (p) {
649
        if (p->encode != NULL && strcmp(name,p->name) == 0)
650
            return p;
651
        p = p->next;
652
    }
653
    return NULL;
654
}
655

    
656
AVCodec *avcodec_find_decoder(enum CodecID id)
657
{
658
    AVCodec *p;
659
    p = first_avcodec;
660
    while (p) {
661
        if (p->decode != NULL && p->id == id)
662
            return p;
663
        p = p->next;
664
    }
665
    return NULL;
666
}
667

    
668
AVCodec *avcodec_find_decoder_by_name(const char *name)
669
{
670
    AVCodec *p;
671
    p = first_avcodec;
672
    while (p) {
673
        if (p->decode != NULL && strcmp(name,p->name) == 0)
674
            return p;
675
        p = p->next;
676
    }
677
    return NULL;
678
}
679

    
680
static AVCodec *avcodec_find(enum CodecID id)
681
{
682
    AVCodec *p;
683
    p = first_avcodec;
684
    while (p) {
685
        if (p->id == id)
686
            return p;
687
        p = p->next;
688
    }
689
    return NULL;
690
}
691

    
692
void avcodec_string(char *buf, int buf_size, AVCodecContext *enc, int encode)
693
{
694
    const char *codec_name;
695
    AVCodec *p;
696
    char buf1[32];
697
    char channels_str[100];
698
    int bitrate;
699

    
700
    if (encode)
701
        p = avcodec_find_encoder(enc->codec_id);
702
    else
703
        p = avcodec_find_decoder(enc->codec_id);
704

    
705
    if (p) {
706
        codec_name = p->name;
707
        if (!encode && enc->codec_id == CODEC_ID_MP3) {
708
            if (enc->sub_id == 2)
709
                codec_name = "mp2";
710
            else if (enc->sub_id == 1)
711
                codec_name = "mp1";
712
        }
713
    } else if (enc->codec_id == CODEC_ID_MPEG2TS) {
714
        /* fake mpeg2 transport stream codec (currently not
715
           registered) */
716
        codec_name = "mpeg2ts";
717
    } else if (enc->codec_name[0] != '\0') {
718
        codec_name = enc->codec_name;
719
    } else {
720
        /* output avi tags */
721
        if (enc->codec_type == CODEC_TYPE_VIDEO) {
722
            snprintf(buf1, sizeof(buf1), "%c%c%c%c", 
723
                     enc->codec_tag & 0xff,
724
                     (enc->codec_tag >> 8) & 0xff,
725
                     (enc->codec_tag >> 16) & 0xff,
726
                     (enc->codec_tag >> 24) & 0xff);
727
        } else {
728
            snprintf(buf1, sizeof(buf1), "0x%04x", enc->codec_tag);
729
        }
730
        codec_name = buf1;
731
    }
732

    
733
    switch(enc->codec_type) {
734
    case CODEC_TYPE_VIDEO:
735
        snprintf(buf, buf_size,
736
                 "Video: %s%s",
737
                 codec_name, enc->mb_decision ? " (hq)" : "");
738
        if (enc->codec_id == CODEC_ID_RAWVIDEO) {
739
            snprintf(buf + strlen(buf), buf_size - strlen(buf),
740
                     ", %s",
741
                     avcodec_get_pix_fmt_name(enc->pix_fmt));
742
        }
743
        if (enc->width) {
744
            snprintf(buf + strlen(buf), buf_size - strlen(buf),
745
                     ", %dx%d, %0.2f fps",
746
                     enc->width, enc->height, 
747
                     (float)enc->frame_rate / enc->frame_rate_base);
748
        }
749
        if (encode) {
750
            snprintf(buf + strlen(buf), buf_size - strlen(buf),
751
                     ", q=%d-%d", enc->qmin, enc->qmax);
752
        }
753
        bitrate = enc->bit_rate;
754
        break;
755
    case CODEC_TYPE_AUDIO:
756
        snprintf(buf, buf_size,
757
                 "Audio: %s",
758
                 codec_name);
759
        switch (enc->channels) {
760
            case 1:
761
                strcpy(channels_str, "mono");
762
                break;
763
            case 2:
764
                strcpy(channels_str, "stereo");
765
                break;
766
            case 6:
767
                strcpy(channels_str, "5:1");
768
                break;
769
            default:
770
                snprintf(channels_str, sizeof(channels_str), "%d channels", enc->channels);
771
                break;
772
        }
773
        if (enc->sample_rate) {
774
            snprintf(buf + strlen(buf), buf_size - strlen(buf),
775
                     ", %d Hz, %s",
776
                     enc->sample_rate,
777
                     channels_str);
778
        }
779
        
780
        /* for PCM codecs, compute bitrate directly */
781
        switch(enc->codec_id) {
782
        case CODEC_ID_PCM_S16LE:
783
        case CODEC_ID_PCM_S16BE:
784
        case CODEC_ID_PCM_U16LE:
785
        case CODEC_ID_PCM_U16BE:
786
            bitrate = enc->sample_rate * enc->channels * 16;
787
            break;
788
        case CODEC_ID_PCM_S8:
789
        case CODEC_ID_PCM_U8:
790
        case CODEC_ID_PCM_ALAW:
791
        case CODEC_ID_PCM_MULAW:
792
            bitrate = enc->sample_rate * enc->channels * 8;
793
            break;
794
        default:
795
            bitrate = enc->bit_rate;
796
            break;
797
        }
798
        break;
799
    case CODEC_TYPE_DATA:
800
        snprintf(buf, buf_size, "Data: %s", codec_name);
801
        bitrate = enc->bit_rate;
802
        break;
803
    default:
804
        snprintf(buf, buf_size, "Invalid Codec type %d", enc->codec_type);
805
        return;
806
    }
807
    if (encode) {
808
        if (enc->flags & CODEC_FLAG_PASS1)
809
            snprintf(buf + strlen(buf), buf_size - strlen(buf),
810
                     ", pass 1");
811
        if (enc->flags & CODEC_FLAG_PASS2)
812
            snprintf(buf + strlen(buf), buf_size - strlen(buf),
813
                     ", pass 2");
814
    }
815
    if (bitrate != 0) {
816
        snprintf(buf + strlen(buf), buf_size - strlen(buf), 
817
                 ", %d kb/s", bitrate / 1000);
818
    }
819
}
820

    
821
unsigned avcodec_version( void )
822
{
823
  return LIBAVCODEC_VERSION_INT;
824
}
825

    
826
unsigned avcodec_build( void )
827
{
828
  return LIBAVCODEC_BUILD;
829
}
830

    
831
/* must be called before any other functions */
832
void avcodec_init(void)
833
{
834
    static int inited = 0;
835

    
836
    if (inited != 0)
837
        return;
838
    inited = 1;
839

    
840
    dsputil_static_init();
841
}
842

    
843
/**
844
 * Flush buffers, should be called when seeking or when swicthing to a different stream.
845
 */
846
void avcodec_flush_buffers(AVCodecContext *avctx)
847
{
848
    if(avctx->codec->flush)
849
        avctx->codec->flush(avctx);
850
}
851

    
852
void avcodec_default_free_buffers(AVCodecContext *s){
853
    int i, j;
854

    
855
    if(s->internal_buffer==NULL) return;
856
    
857
    for(i=0; i<INTERNAL_BUFFER_SIZE; i++){
858
        InternalBuffer *buf= &((InternalBuffer*)s->internal_buffer)[i];
859
        for(j=0; j<4; j++){
860
            av_freep(&buf->base[j]);
861
            buf->data[j]= NULL;
862
        }
863
    }
864
    av_freep(&s->internal_buffer);
865
    
866
    s->internal_buffer_count=0;
867
}
868

    
869
char av_get_pict_type_char(int pict_type){
870
    switch(pict_type){
871
    case I_TYPE: return 'I'; 
872
    case P_TYPE: return 'P'; 
873
    case B_TYPE: return 'B'; 
874
    case S_TYPE: return 'S'; 
875
    case SI_TYPE:return 'i'; 
876
    case SP_TYPE:return 'p'; 
877
    default:     return '?';
878
    }
879
}
880

    
881
int av_reduce(int *dst_nom, int *dst_den, int64_t nom, int64_t den, int64_t max){
882
    AVRational a0={0,1}, a1={1,0};
883
    int sign= (nom<0) ^ (den<0);
884
    int64_t gcd= ff_gcd(ABS(nom), ABS(den));
885

    
886
    nom = ABS(nom)/gcd;
887
    den = ABS(den)/gcd;
888
    if(nom<=max && den<=max){
889
        a1= (AVRational){nom, den};
890
        den=0;
891
    }
892
    
893
    while(den){
894
        int64_t x       = nom / den;
895
        int64_t next_den= nom - den*x;
896
        int64_t a2n= x*a1.num + a0.num;
897
        int64_t a2d= x*a1.den + a0.den;
898

    
899
        if(a2n > max || a2d > max) break;
900

    
901
        a0= a1;
902
        a1= (AVRational){a2n, a2d};
903
        nom= den;
904
        den= next_den;
905
    }
906
    assert(ff_gcd(a1.num, a1.den) == 1);
907
    
908
    *dst_nom = sign ? -a1.num : a1.num;
909
    *dst_den = a1.den;
910
    
911
    return den==0;
912
}
913

    
914
int64_t av_rescale_rnd(int64_t a, int64_t b, int64_t c, enum AVRounding rnd){
915
    AVInteger ai;
916
    int64_t r=0;
917
    assert(c > 0);
918
    assert(b >=0);
919
    assert(rnd >=0 && rnd<=5 && rnd!=4);
920
    
921
    if(a<0 && a != INT64_MIN) return -av_rescale_rnd(-a, b, c, rnd ^ ((rnd>>1)&1)); 
922
    
923
    if(rnd==AV_ROUND_NEAR_INF) r= c/2;
924
    else if(rnd&1)             r= c-1;
925

    
926
    if(b<=INT_MAX && c<=INT_MAX){
927
        if(a<=INT_MAX)
928
            return (a * b + r)/c;
929
        else
930
            return a/c*b + (a%c*b + r)/c;
931
    }
932
    
933
    ai= av_mul_i(av_int2i(a), av_int2i(b));
934
    ai= av_add_i(ai, av_int2i(r));
935
    
936
    return av_i2int(av_div_i(ai, av_int2i(c)));
937
}
938

    
939
int64_t av_rescale(int64_t a, int64_t b, int64_t c){
940
    return av_rescale_rnd(a, b, c, AV_ROUND_NEAR_INF);
941
}
942

    
943
int64_t ff_gcd(int64_t a, int64_t b){
944
    if(b) return ff_gcd(b, a%b);
945
    else  return a;
946
}
947

    
948
/* av_log API */
949

    
950
static int av_log_level = AV_LOG_DEBUG;
951

    
952
static void av_log_default_callback(void* ptr, int level, const char* fmt, va_list vl)
953
{
954
    static int print_prefix=1;
955
    AVClass* avc= ptr ? *(AVClass**)ptr : NULL;
956
    if(level>av_log_level)
957
        return;
958
#undef fprintf
959
    if(print_prefix && avc) {
960
            fprintf(stderr, "[%s @ %p]", avc->item_name(ptr), avc);
961
    }
962
#define fprintf please_use_av_log
963
        
964
    print_prefix= strstr(fmt, "\n") != NULL;
965
        
966
    vfprintf(stderr, fmt, vl);
967
}
968

    
969
static void (*av_log_callback)(void*, int, const char*, va_list) = av_log_default_callback;
970

    
971
void av_log(void* avcl, int level, const char *fmt, ...)
972
{
973
    va_list vl;
974
    va_start(vl, fmt);
975
    av_vlog(avcl, level, fmt, vl);
976
    va_end(vl);
977
}
978

    
979
void av_vlog(void* avcl, int level, const char *fmt, va_list vl)
980
{
981
    av_log_callback(avcl, level, fmt, vl);
982
}
983

    
984
int av_log_get_level(void)
985
{
986
    return av_log_level;
987
}
988

    
989
void av_log_set_level(int level)
990
{
991
    av_log_level = level;
992
}
993

    
994
void av_log_set_callback(void (*callback)(void*, int, const char*, va_list))
995
{
996
    av_log_callback = callback;
997
}
998

    
999
#if !defined(HAVE_THREADS)
1000
int avcodec_thread_init(AVCodecContext *s, int thread_count){
1001
    return -1;
1002
}
1003
#endif