Statistics
| Branch: | Revision:

ffmpeg / libavcodec / utils.c @ 5d6e4c16

History | View | Annotate | Download (33.9 KB)

1
/*
2
 * utils for libavcodec
3
 * Copyright (c) 2001 Fabrice Bellard
4
 * Copyright (c) 2002-2004 Michael Niedermayer <michaelni@gmx.at>
5
 *
6
 * This file is part of FFmpeg.
7
 *
8
 * FFmpeg is free software; you can redistribute it and/or
9
 * modify it under the terms of the GNU Lesser General Public
10
 * License as published by the Free Software Foundation; either
11
 * version 2.1 of the License, or (at your option) any later version.
12
 *
13
 * FFmpeg is distributed in the hope that it will be useful,
14
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16
 * Lesser General Public License for more details.
17
 *
18
 * You should have received a copy of the GNU Lesser General Public
19
 * License along with FFmpeg; if not, write to the Free Software
20
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21
 */
22

    
23
/**
24
 * @file
25
 * utils.
26
 */
27

    
28
#include "libavutil/avstring.h"
29
#include "libavutil/integer.h"
30
#include "libavutil/crc.h"
31
#include "libavutil/pixdesc.h"
32
#include "libavcore/imgutils.h"
33
#include "libavcore/internal.h"
34
#include "libavcore/samplefmt.h"
35
#include "avcodec.h"
36
#include "dsputil.h"
37
#include "libavutil/opt.h"
38
#include "imgconvert.h"
39
#include "audioconvert.h"
40
#include "internal.h"
41
#include <stdlib.h>
42
#include <stdarg.h>
43
#include <limits.h>
44
#include <float.h>
45

    
46
static int volatile entangled_thread_counter=0;
47
int (*ff_lockmgr_cb)(void **mutex, enum AVLockOp op);
48
static void *codec_mutex;
49

    
50
void *av_fast_realloc(void *ptr, unsigned int *size, unsigned int min_size)
51
{
52
    if(min_size < *size)
53
        return ptr;
54

    
55
    *size= FFMAX(17*min_size/16 + 32, min_size);
56

    
57
    ptr= av_realloc(ptr, *size);
58
    if(!ptr) //we could set this to the unmodified min_size but this is safer if the user lost the ptr and uses NULL now
59
        *size= 0;
60

    
61
    return ptr;
62
}
63

    
64
void av_fast_malloc(void *ptr, unsigned int *size, unsigned int min_size)
65
{
66
    void **p = ptr;
67
    if (min_size < *size)
68
        return;
69
    *size= FFMAX(17*min_size/16 + 32, min_size);
70
    av_free(*p);
71
    *p = av_malloc(*size);
72
    if (!*p) *size = 0;
73
}
74

    
75
/* encoder management */
76
static AVCodec *first_avcodec = NULL;
77

    
78
AVCodec *av_codec_next(AVCodec *c){
79
    if(c) return c->next;
80
    else  return first_avcodec;
81
}
82

    
83
void avcodec_register(AVCodec *codec)
84
{
85
    AVCodec **p;
86
    avcodec_init();
87
    p = &first_avcodec;
88
    while (*p != NULL) p = &(*p)->next;
89
    *p = codec;
90
    codec->next = NULL;
91
}
92

    
93
#if LIBAVCODEC_VERSION_MAJOR < 53
94
void register_avcodec(AVCodec *codec)
95
{
96
    avcodec_register(codec);
97
}
98
#endif
99

    
100
unsigned avcodec_get_edge_width(void)
101
{
102
    return EDGE_WIDTH;
103
}
104

    
105
void avcodec_set_dimensions(AVCodecContext *s, int width, int height){
106
    s->coded_width = width;
107
    s->coded_height= height;
108
    s->width = -((-width )>>s->lowres);
109
    s->height= -((-height)>>s->lowres);
110
}
111

    
112
typedef struct InternalBuffer{
113
    int last_pic_num;
114
    uint8_t *base[4];
115
    uint8_t *data[4];
116
    int linesize[4];
117
    int width, height;
118
    enum PixelFormat pix_fmt;
119
}InternalBuffer;
120

    
121
#define INTERNAL_BUFFER_SIZE 32
122

    
123
void avcodec_align_dimensions2(AVCodecContext *s, int *width, int *height, int linesize_align[4]){
124
    int w_align= 1;
125
    int h_align= 1;
126

    
127
    switch(s->pix_fmt){
128
    case PIX_FMT_YUV420P:
129
    case PIX_FMT_YUYV422:
130
    case PIX_FMT_UYVY422:
131
    case PIX_FMT_YUV422P:
132
    case PIX_FMT_YUV440P:
133
    case PIX_FMT_YUV444P:
134
    case PIX_FMT_GRAY8:
135
    case PIX_FMT_GRAY16BE:
136
    case PIX_FMT_GRAY16LE:
137
    case PIX_FMT_YUVJ420P:
138
    case PIX_FMT_YUVJ422P:
139
    case PIX_FMT_YUVJ440P:
140
    case PIX_FMT_YUVJ444P:
141
    case PIX_FMT_YUVA420P:
142
        w_align= 16; //FIXME check for non mpeg style codecs and use less alignment
143
        h_align= 16;
144
        if(s->codec_id == CODEC_ID_MPEG2VIDEO || s->codec_id == CODEC_ID_MJPEG || s->codec_id == CODEC_ID_AMV || s->codec_id == CODEC_ID_THP || s->codec_id == CODEC_ID_H264)
145
            h_align= 32; // interlaced is rounded up to 2 MBs
146
        break;
147
    case PIX_FMT_YUV411P:
148
    case PIX_FMT_UYYVYY411:
149
        w_align=32;
150
        h_align=8;
151
        break;
152
    case PIX_FMT_YUV410P:
153
        if(s->codec_id == CODEC_ID_SVQ1){
154
            w_align=64;
155
            h_align=64;
156
        }
157
    case PIX_FMT_RGB555:
158
        if(s->codec_id == CODEC_ID_RPZA){
159
            w_align=4;
160
            h_align=4;
161
        }
162
    case PIX_FMT_PAL8:
163
    case PIX_FMT_BGR8:
164
    case PIX_FMT_RGB8:
165
        if(s->codec_id == CODEC_ID_SMC){
166
            w_align=4;
167
            h_align=4;
168
        }
169
        break;
170
    case PIX_FMT_BGR24:
171
        if((s->codec_id == CODEC_ID_MSZH) || (s->codec_id == CODEC_ID_ZLIB)){
172
            w_align=4;
173
            h_align=4;
174
        }
175
        break;
176
    default:
177
        w_align= 1;
178
        h_align= 1;
179
        break;
180
    }
181

    
182
    *width = FFALIGN(*width , w_align);
183
    *height= FFALIGN(*height, h_align);
184
    if(s->codec_id == CODEC_ID_H264)
185
        *height+=2; // some of the optimized chroma MC reads one line too much
186

    
187
    linesize_align[0] =
188
    linesize_align[1] =
189
    linesize_align[2] =
190
    linesize_align[3] = STRIDE_ALIGN;
191
//STRIDE_ALIGN is 8 for SSE* but this does not work for SVQ1 chroma planes
192
//we could change STRIDE_ALIGN to 16 for x86/sse but it would increase the
193
//picture size unneccessarily in some cases. The solution here is not
194
//pretty and better ideas are welcome!
195
#if HAVE_MMX
196
    if(s->codec_id == CODEC_ID_SVQ1 || s->codec_id == CODEC_ID_VP5 ||
197
       s->codec_id == CODEC_ID_VP6 || s->codec_id == CODEC_ID_VP6F ||
198
       s->codec_id == CODEC_ID_VP6A) {
199
        linesize_align[0] =
200
        linesize_align[1] =
201
        linesize_align[2] = 16;
202
    }
203
#endif
204
}
205

    
206
void avcodec_align_dimensions(AVCodecContext *s, int *width, int *height){
207
    int chroma_shift = av_pix_fmt_descriptors[s->pix_fmt].log2_chroma_w;
208
    int linesize_align[4];
209
    int align;
210
    avcodec_align_dimensions2(s, width, height, linesize_align);
211
    align = FFMAX(linesize_align[0], linesize_align[3]);
212
    linesize_align[1] <<= chroma_shift;
213
    linesize_align[2] <<= chroma_shift;
214
    align = FFMAX3(align, linesize_align[1], linesize_align[2]);
215
    *width=FFALIGN(*width, align);
216
}
217

    
218
#if LIBAVCODEC_VERSION_MAJOR < 53
219
int avcodec_check_dimensions(void *av_log_ctx, unsigned int w, unsigned int h){
220
    return av_image_check_size(w, h, 0, av_log_ctx);
221
}
222
#endif
223

    
224
int avcodec_default_get_buffer(AVCodecContext *s, AVFrame *pic){
225
    int i;
226
    int w= s->width;
227
    int h= s->height;
228
    InternalBuffer *buf;
229
    int *picture_number;
230

    
231
    if(pic->data[0]!=NULL) {
232
        av_log(s, AV_LOG_ERROR, "pic->data[0]!=NULL in avcodec_default_get_buffer\n");
233
        return -1;
234
    }
235
    if(s->internal_buffer_count >= INTERNAL_BUFFER_SIZE) {
236
        av_log(s, AV_LOG_ERROR, "internal_buffer_count overflow (missing release_buffer?)\n");
237
        return -1;
238
    }
239

    
240
    if(av_image_check_size(w, h, 0, s))
241
        return -1;
242

    
243
    if(s->internal_buffer==NULL){
244
        s->internal_buffer= av_mallocz((INTERNAL_BUFFER_SIZE+1)*sizeof(InternalBuffer));
245
    }
246
#if 0
247
    s->internal_buffer= av_fast_realloc(
248
        s->internal_buffer,
249
        &s->internal_buffer_size,
250
        sizeof(InternalBuffer)*FFMAX(99,  s->internal_buffer_count+1)/*FIXME*/
251
        );
252
#endif
253

    
254
    buf= &((InternalBuffer*)s->internal_buffer)[s->internal_buffer_count];
255
    picture_number= &(((InternalBuffer*)s->internal_buffer)[INTERNAL_BUFFER_SIZE]).last_pic_num; //FIXME ugly hack
256
    (*picture_number)++;
257

    
258
    if(buf->base[0] && (buf->width != w || buf->height != h || buf->pix_fmt != s->pix_fmt)){
259
        for(i=0; i<4; i++){
260
            av_freep(&buf->base[i]);
261
            buf->data[i]= NULL;
262
        }
263
    }
264

    
265
    if(buf->base[0]){
266
        pic->age= *picture_number - buf->last_pic_num;
267
        buf->last_pic_num= *picture_number;
268
    }else{
269
        int h_chroma_shift, v_chroma_shift;
270
        int size[4] = {0};
271
        int tmpsize;
272
        int unaligned;
273
        AVPicture picture;
274
        int stride_align[4];
275

    
276
        avcodec_get_chroma_sub_sample(s->pix_fmt, &h_chroma_shift, &v_chroma_shift);
277

    
278
        avcodec_align_dimensions2(s, &w, &h, stride_align);
279

    
280
        if(!(s->flags&CODEC_FLAG_EMU_EDGE)){
281
            w+= EDGE_WIDTH*2;
282
            h+= EDGE_WIDTH*2;
283
        }
284

    
285
        do {
286
            // NOTE: do not align linesizes individually, this breaks e.g. assumptions
287
            // that linesize[0] == 2*linesize[1] in the MPEG-encoder for 4:2:2
288
            av_image_fill_linesizes(picture.linesize, s->pix_fmt, w);
289
            // increase alignment of w for next try (rhs gives the lowest bit set in w)
290
            w += w & ~(w-1);
291

    
292
            unaligned = 0;
293
            for (i=0; i<4; i++){
294
                unaligned |= picture.linesize[i] % stride_align[i];
295
            }
296
        } while (unaligned);
297

    
298
        tmpsize = av_image_fill_pointers(picture.data, s->pix_fmt, h, NULL, picture.linesize);
299
        if (tmpsize < 0)
300
            return -1;
301

    
302
        for (i=0; i<3 && picture.data[i+1]; i++)
303
            size[i] = picture.data[i+1] - picture.data[i];
304
        size[i] = tmpsize - (picture.data[i] - picture.data[0]);
305

    
306
        buf->last_pic_num= -256*256*256*64;
307
        memset(buf->base, 0, sizeof(buf->base));
308
        memset(buf->data, 0, sizeof(buf->data));
309

    
310
        for(i=0; i<4 && size[i]; 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
            buf->linesize[i]= picture.linesize[i];
315

    
316
            buf->base[i]= av_malloc(size[i]+16); //FIXME 16
317
            if(buf->base[i]==NULL) return -1;
318
            memset(buf->base[i], 128, size[i]);
319

    
320
            // no edge if EDGE EMU or not planar YUV
321
            if((s->flags&CODEC_FLAG_EMU_EDGE) || !size[2])
322
                buf->data[i] = buf->base[i];
323
            else
324
                buf->data[i] = buf->base[i] + FFALIGN((buf->linesize[i]*EDGE_WIDTH>>v_shift) + (EDGE_WIDTH>>h_shift), stride_align[i]);
325
        }
326
        if(size[1] && !size[2])
327
            ff_set_systematic_pal2((uint32_t*)buf->data[1], s->pix_fmt);
328
        buf->width  = s->width;
329
        buf->height = s->height;
330
        buf->pix_fmt= s->pix_fmt;
331
        pic->age= 256*256*256*64;
332
    }
333
    pic->type= FF_BUFFER_TYPE_INTERNAL;
334

    
335
    for(i=0; i<4; i++){
336
        pic->base[i]= buf->base[i];
337
        pic->data[i]= buf->data[i];
338
        pic->linesize[i]= buf->linesize[i];
339
    }
340
    s->internal_buffer_count++;
341

    
342
    pic->reordered_opaque= s->reordered_opaque;
343

    
344
    if(s->debug&FF_DEBUG_BUFFERS)
345
        av_log(s, AV_LOG_DEBUG, "default_get_buffer called on pic %p, %d buffers used\n", pic, s->internal_buffer_count);
346

    
347
    return 0;
348
}
349

    
350
void avcodec_default_release_buffer(AVCodecContext *s, AVFrame *pic){
351
    int i;
352
    InternalBuffer *buf, *last;
353

    
354
    assert(pic->type==FF_BUFFER_TYPE_INTERNAL);
355
    assert(s->internal_buffer_count);
356

    
357
    buf = NULL; /* avoids warning */
358
    for(i=0; i<s->internal_buffer_count; i++){ //just 3-5 checks so is not worth to optimize
359
        buf= &((InternalBuffer*)s->internal_buffer)[i];
360
        if(buf->data[0] == pic->data[0])
361
            break;
362
    }
363
    assert(i < s->internal_buffer_count);
364
    s->internal_buffer_count--;
365
    last = &((InternalBuffer*)s->internal_buffer)[s->internal_buffer_count];
366

    
367
    FFSWAP(InternalBuffer, *buf, *last);
368

    
369
    for(i=0; i<4; i++){
370
        pic->data[i]=NULL;
371
//        pic->base[i]=NULL;
372
    }
373
//printf("R%X\n", pic->opaque);
374

    
375
    if(s->debug&FF_DEBUG_BUFFERS)
376
        av_log(s, AV_LOG_DEBUG, "default_release_buffer called on pic %p, %d buffers used\n", pic, s->internal_buffer_count);
377
}
378

    
379
int avcodec_default_reget_buffer(AVCodecContext *s, AVFrame *pic){
380
    AVFrame temp_pic;
381
    int i;
382

    
383
    /* If no picture return a new buffer */
384
    if(pic->data[0] == NULL) {
385
        /* We will copy from buffer, so must be readable */
386
        pic->buffer_hints |= FF_BUFFER_HINTS_READABLE;
387
        return s->get_buffer(s, pic);
388
    }
389

    
390
    /* If internal buffer type return the same buffer */
391
    if(pic->type == FF_BUFFER_TYPE_INTERNAL) {
392
        pic->reordered_opaque= s->reordered_opaque;
393
        return 0;
394
    }
395

    
396
    /*
397
     * Not internal type and reget_buffer not overridden, emulate cr buffer
398
     */
399
    temp_pic = *pic;
400
    for(i = 0; i < 4; i++)
401
        pic->data[i] = pic->base[i] = NULL;
402
    pic->opaque = NULL;
403
    /* Allocate new frame */
404
    if (s->get_buffer(s, pic))
405
        return -1;
406
    /* Copy image data from old buffer to new buffer */
407
    av_picture_copy((AVPicture*)pic, (AVPicture*)&temp_pic, s->pix_fmt, s->width,
408
             s->height);
409
    s->release_buffer(s, &temp_pic); // Release old frame
410
    return 0;
411
}
412

    
413
int avcodec_default_execute(AVCodecContext *c, int (*func)(AVCodecContext *c2, void *arg2),void *arg, int *ret, int count, int size){
414
    int i;
415

    
416
    for(i=0; i<count; i++){
417
        int r= func(c, (char*)arg + i*size);
418
        if(ret) ret[i]= r;
419
    }
420
    return 0;
421
}
422

    
423
int avcodec_default_execute2(AVCodecContext *c, int (*func)(AVCodecContext *c2, void *arg2, int jobnr, int threadnr),void *arg, int *ret, int count){
424
    int i;
425

    
426
    for(i=0; i<count; i++){
427
        int r= func(c, arg, i, 0);
428
        if(ret) ret[i]= r;
429
    }
430
    return 0;
431
}
432

    
433
enum PixelFormat avcodec_default_get_format(struct AVCodecContext *s, const enum PixelFormat *fmt){
434
    while (*fmt != PIX_FMT_NONE && ff_is_hwaccel_pix_fmt(*fmt))
435
        ++fmt;
436
    return fmt[0];
437
}
438

    
439
void avcodec_get_frame_defaults(AVFrame *pic){
440
    memset(pic, 0, sizeof(AVFrame));
441

    
442
    pic->pts= AV_NOPTS_VALUE;
443
    pic->key_frame= 1;
444
}
445

    
446
AVFrame *avcodec_alloc_frame(void){
447
    AVFrame *pic= av_malloc(sizeof(AVFrame));
448

    
449
    if(pic==NULL) return NULL;
450

    
451
    avcodec_get_frame_defaults(pic);
452

    
453
    return pic;
454
}
455

    
456
int attribute_align_arg avcodec_open(AVCodecContext *avctx, AVCodec *codec)
457
{
458
    int ret= -1;
459

    
460
    /* If there is a user-supplied mutex locking routine, call it. */
461
    if (ff_lockmgr_cb) {
462
        if ((*ff_lockmgr_cb)(&codec_mutex, AV_LOCK_OBTAIN))
463
            return -1;
464
    }
465

    
466
    entangled_thread_counter++;
467
    if(entangled_thread_counter != 1){
468
        av_log(avctx, AV_LOG_ERROR, "insufficient thread locking around avcodec_open/close()\n");
469
        goto end;
470
    }
471

    
472
    if(avctx->codec || !codec)
473
        goto end;
474

    
475
    if (codec->priv_data_size > 0) {
476
      if(!avctx->priv_data){
477
        avctx->priv_data = av_mallocz(codec->priv_data_size);
478
        if (!avctx->priv_data) {
479
            ret = AVERROR(ENOMEM);
480
            goto end;
481
        }
482
        if(codec->priv_class){ //this can be droped once all user apps use   avcodec_get_context_defaults3()
483
            *(AVClass**)avctx->priv_data= codec->priv_class;
484
            av_opt_set_defaults(avctx->priv_data);
485
        }
486
      }
487
    } else {
488
        avctx->priv_data = NULL;
489
    }
490

    
491
    if(avctx->coded_width && avctx->coded_height)
492
        avcodec_set_dimensions(avctx, avctx->coded_width, avctx->coded_height);
493
    else if(avctx->width && avctx->height)
494
        avcodec_set_dimensions(avctx, avctx->width, avctx->height);
495

    
496
    if ((avctx->coded_width || avctx->coded_height || avctx->width || avctx->height)
497
        && (  av_image_check_size(avctx->coded_width, avctx->coded_height, 0, avctx) < 0
498
           || av_image_check_size(avctx->width,       avctx->height,       0, avctx) < 0)) {
499
        av_log(avctx, AV_LOG_WARNING, "ignoring invalid width/height values\n");
500
        avcodec_set_dimensions(avctx, 0, 0);
501
    }
502

    
503
#define SANE_NB_CHANNELS 128U
504
    if (avctx->channels > SANE_NB_CHANNELS) {
505
        ret = AVERROR(EINVAL);
506
        goto free_and_end;
507
    }
508

    
509
    avctx->codec = codec;
510
    if ((avctx->codec_type == AVMEDIA_TYPE_UNKNOWN || avctx->codec_type == codec->type) &&
511
        avctx->codec_id == CODEC_ID_NONE) {
512
        avctx->codec_type = codec->type;
513
        avctx->codec_id   = codec->id;
514
    }
515
    if(avctx->codec_id != codec->id || avctx->codec_type != codec->type){
516
        av_log(avctx, AV_LOG_ERROR, "codec type or id mismatches\n");
517
        goto free_and_end;
518
    }
519
    avctx->frame_number = 0;
520
    if (avctx->codec->max_lowres < avctx->lowres) {
521
        av_log(avctx, AV_LOG_ERROR, "The maximum value for lowres supported by the decoder is %d\n",
522
               avctx->codec->max_lowres);
523
        goto free_and_end;
524
    }
525

    
526
    if(avctx->codec->init){
527
        ret = avctx->codec->init(avctx);
528
        if (ret < 0) {
529
            goto free_and_end;
530
        }
531
    }
532
    ret=0;
533
end:
534
    entangled_thread_counter--;
535

    
536
    /* Release any user-supplied mutex. */
537
    if (ff_lockmgr_cb) {
538
        (*ff_lockmgr_cb)(&codec_mutex, AV_LOCK_RELEASE);
539
    }
540
    return ret;
541
free_and_end:
542
    av_freep(&avctx->priv_data);
543
    avctx->codec= NULL;
544
    goto end;
545
}
546

    
547
int attribute_align_arg avcodec_encode_audio(AVCodecContext *avctx, uint8_t *buf, int buf_size,
548
                         const short *samples)
549
{
550
    if(buf_size < FF_MIN_BUFFER_SIZE && 0){
551
        av_log(avctx, AV_LOG_ERROR, "buffer smaller than minimum size\n");
552
        return -1;
553
    }
554
    if((avctx->codec->capabilities & CODEC_CAP_DELAY) || samples){
555
        int ret = avctx->codec->encode(avctx, buf, buf_size, samples);
556
        avctx->frame_number++;
557
        return ret;
558
    }else
559
        return 0;
560
}
561

    
562
int attribute_align_arg avcodec_encode_video(AVCodecContext *avctx, uint8_t *buf, int buf_size,
563
                         const AVFrame *pict)
564
{
565
    if(buf_size < FF_MIN_BUFFER_SIZE){
566
        av_log(avctx, AV_LOG_ERROR, "buffer smaller than minimum size\n");
567
        return -1;
568
    }
569
    if(av_image_check_size(avctx->width, avctx->height, 0, avctx))
570
        return -1;
571
    if((avctx->codec->capabilities & CODEC_CAP_DELAY) || pict){
572
        int ret = avctx->codec->encode(avctx, buf, buf_size, pict);
573
        avctx->frame_number++;
574
        emms_c(); //needed to avoid an emms_c() call before every return;
575

    
576
        return ret;
577
    }else
578
        return 0;
579
}
580

    
581
int avcodec_encode_subtitle(AVCodecContext *avctx, uint8_t *buf, int buf_size,
582
                            const AVSubtitle *sub)
583
{
584
    int ret;
585
    if(sub->start_display_time) {
586
        av_log(avctx, AV_LOG_ERROR, "start_display_time must be 0.\n");
587
        return -1;
588
    }
589
    if(sub->num_rects == 0 || !sub->rects)
590
        return -1;
591
    ret = avctx->codec->encode(avctx, buf, buf_size, sub);
592
    avctx->frame_number++;
593
    return ret;
594
}
595

    
596
#if FF_API_VIDEO_OLD
597
int attribute_align_arg avcodec_decode_video(AVCodecContext *avctx, AVFrame *picture,
598
                         int *got_picture_ptr,
599
                         const uint8_t *buf, int buf_size)
600
{
601
    AVPacket avpkt;
602
    av_init_packet(&avpkt);
603
    avpkt.data = buf;
604
    avpkt.size = buf_size;
605
    // HACK for CorePNG to decode as normal PNG by default
606
    avpkt.flags = AV_PKT_FLAG_KEY;
607

    
608
    return avcodec_decode_video2(avctx, picture, got_picture_ptr, &avpkt);
609
}
610
#endif
611

    
612
int attribute_align_arg avcodec_decode_video2(AVCodecContext *avctx, AVFrame *picture,
613
                         int *got_picture_ptr,
614
                         AVPacket *avpkt)
615
{
616
    int ret;
617

    
618
    *got_picture_ptr= 0;
619
    if((avctx->coded_width||avctx->coded_height) && av_image_check_size(avctx->coded_width, avctx->coded_height, 0, avctx))
620
        return -1;
621
    if((avctx->codec->capabilities & CODEC_CAP_DELAY) || avpkt->size){
622
        ret = avctx->codec->decode(avctx, picture, got_picture_ptr,
623
                                avpkt);
624

    
625
        emms_c(); //needed to avoid an emms_c() call before every return;
626

    
627
        if (*got_picture_ptr)
628
            avctx->frame_number++;
629
    }else
630
        ret= 0;
631

    
632
    return ret;
633
}
634

    
635
#if FF_API_AUDIO_OLD
636
int attribute_align_arg avcodec_decode_audio2(AVCodecContext *avctx, int16_t *samples,
637
                         int *frame_size_ptr,
638
                         const uint8_t *buf, int buf_size)
639
{
640
    AVPacket avpkt;
641
    av_init_packet(&avpkt);
642
    avpkt.data = buf;
643
    avpkt.size = buf_size;
644

    
645
    return avcodec_decode_audio3(avctx, samples, frame_size_ptr, &avpkt);
646
}
647
#endif
648

    
649
int attribute_align_arg avcodec_decode_audio3(AVCodecContext *avctx, int16_t *samples,
650
                         int *frame_size_ptr,
651
                         AVPacket *avpkt)
652
{
653
    int ret;
654

    
655
    if((avctx->codec->capabilities & CODEC_CAP_DELAY) || avpkt->size){
656
        //FIXME remove the check below _after_ ensuring that all audio check that the available space is enough
657
        if(*frame_size_ptr < AVCODEC_MAX_AUDIO_FRAME_SIZE){
658
            av_log(avctx, AV_LOG_ERROR, "buffer smaller than AVCODEC_MAX_AUDIO_FRAME_SIZE\n");
659
            return -1;
660
        }
661
        if(*frame_size_ptr < FF_MIN_BUFFER_SIZE ||
662
        *frame_size_ptr < avctx->channels * avctx->frame_size * sizeof(int16_t)){
663
            av_log(avctx, AV_LOG_ERROR, "buffer %d too small\n", *frame_size_ptr);
664
            return -1;
665
        }
666

    
667
        ret = avctx->codec->decode(avctx, samples, frame_size_ptr, avpkt);
668
        avctx->frame_number++;
669
    }else{
670
        ret= 0;
671
        *frame_size_ptr=0;
672
    }
673
    return ret;
674
}
675

    
676
#if FF_API_SUBTITLE_OLD
677
int avcodec_decode_subtitle(AVCodecContext *avctx, AVSubtitle *sub,
678
                            int *got_sub_ptr,
679
                            const uint8_t *buf, int buf_size)
680
{
681
    AVPacket avpkt;
682
    av_init_packet(&avpkt);
683
    avpkt.data = buf;
684
    avpkt.size = buf_size;
685

    
686
    return avcodec_decode_subtitle2(avctx, sub, got_sub_ptr, &avpkt);
687
}
688
#endif
689

    
690
int avcodec_decode_subtitle2(AVCodecContext *avctx, AVSubtitle *sub,
691
                            int *got_sub_ptr,
692
                            AVPacket *avpkt)
693
{
694
    int ret;
695

    
696
    *got_sub_ptr = 0;
697
    ret = avctx->codec->decode(avctx, sub, got_sub_ptr, avpkt);
698
    if (*got_sub_ptr)
699
        avctx->frame_number++;
700
    return ret;
701
}
702

    
703
void avsubtitle_free(AVSubtitle *sub)
704
{
705
    int i;
706

    
707
    for (i = 0; i < sub->num_rects; i++)
708
    {
709
        av_freep(&sub->rects[i]->pict.data[0]);
710
        av_freep(&sub->rects[i]->pict.data[1]);
711
        av_freep(&sub->rects[i]->pict.data[2]);
712
        av_freep(&sub->rects[i]->pict.data[3]);
713
        av_freep(&sub->rects[i]->text);
714
        av_freep(&sub->rects[i]->ass);
715
        av_freep(&sub->rects[i]);
716
    }
717

    
718
    av_freep(&sub->rects);
719

    
720
    memset(sub, 0, sizeof(AVSubtitle));
721
}
722

    
723
av_cold int avcodec_close(AVCodecContext *avctx)
724
{
725
    /* If there is a user-supplied mutex locking routine, call it. */
726
    if (ff_lockmgr_cb) {
727
        if ((*ff_lockmgr_cb)(&codec_mutex, AV_LOCK_OBTAIN))
728
            return -1;
729
    }
730

    
731
    entangled_thread_counter++;
732
    if(entangled_thread_counter != 1){
733
        av_log(avctx, AV_LOG_ERROR, "insufficient thread locking around avcodec_open/close()\n");
734
        entangled_thread_counter--;
735
        return -1;
736
    }
737

    
738
    if (HAVE_THREADS && avctx->thread_opaque)
739
        avcodec_thread_free(avctx);
740
    if (avctx->codec && avctx->codec->close)
741
        avctx->codec->close(avctx);
742
    avcodec_default_free_buffers(avctx);
743
    avctx->coded_frame = NULL;
744
    av_freep(&avctx->priv_data);
745
    if(avctx->codec && avctx->codec->encode)
746
        av_freep(&avctx->extradata);
747
    avctx->codec = NULL;
748
    entangled_thread_counter--;
749

    
750
    /* Release any user-supplied mutex. */
751
    if (ff_lockmgr_cb) {
752
        (*ff_lockmgr_cb)(&codec_mutex, AV_LOCK_RELEASE);
753
    }
754
    return 0;
755
}
756

    
757
AVCodec *avcodec_find_encoder(enum CodecID id)
758
{
759
    AVCodec *p, *experimental=NULL;
760
    p = first_avcodec;
761
    while (p) {
762
        if (p->encode != NULL && p->id == id) {
763
            if (p->capabilities & CODEC_CAP_EXPERIMENTAL && !experimental) {
764
                experimental = p;
765
            } else
766
                return p;
767
        }
768
        p = p->next;
769
    }
770
    return experimental;
771
}
772

    
773
AVCodec *avcodec_find_encoder_by_name(const char *name)
774
{
775
    AVCodec *p;
776
    if (!name)
777
        return NULL;
778
    p = first_avcodec;
779
    while (p) {
780
        if (p->encode != NULL && strcmp(name,p->name) == 0)
781
            return p;
782
        p = p->next;
783
    }
784
    return NULL;
785
}
786

    
787
AVCodec *avcodec_find_decoder(enum CodecID id)
788
{
789
    AVCodec *p;
790
    p = first_avcodec;
791
    while (p) {
792
        if (p->decode != NULL && p->id == id)
793
            return p;
794
        p = p->next;
795
    }
796
    return NULL;
797
}
798

    
799
AVCodec *avcodec_find_decoder_by_name(const char *name)
800
{
801
    AVCodec *p;
802
    if (!name)
803
        return NULL;
804
    p = first_avcodec;
805
    while (p) {
806
        if (p->decode != NULL && strcmp(name,p->name) == 0)
807
            return p;
808
        p = p->next;
809
    }
810
    return NULL;
811
}
812

    
813
static int get_bit_rate(AVCodecContext *ctx)
814
{
815
    int bit_rate;
816
    int bits_per_sample;
817

    
818
    switch(ctx->codec_type) {
819
    case AVMEDIA_TYPE_VIDEO:
820
    case AVMEDIA_TYPE_DATA:
821
    case AVMEDIA_TYPE_SUBTITLE:
822
    case AVMEDIA_TYPE_ATTACHMENT:
823
        bit_rate = ctx->bit_rate;
824
        break;
825
    case AVMEDIA_TYPE_AUDIO:
826
        bits_per_sample = av_get_bits_per_sample(ctx->codec_id);
827
        bit_rate = bits_per_sample ? ctx->sample_rate * ctx->channels * bits_per_sample : ctx->bit_rate;
828
        break;
829
    default:
830
        bit_rate = 0;
831
        break;
832
    }
833
    return bit_rate;
834
}
835

    
836
size_t av_get_codec_tag_string(char *buf, size_t buf_size, unsigned int codec_tag)
837
{
838
    int i, len, ret = 0;
839

    
840
    for (i = 0; i < 4; i++) {
841
        len = snprintf(buf, buf_size,
842
                       isprint(codec_tag&0xFF) ? "%c" : "[%d]", codec_tag&0xFF);
843
        buf      += len;
844
        buf_size  = buf_size > len ? buf_size - len : 0;
845
        ret      += len;
846
        codec_tag>>=8;
847
    }
848
    return ret;
849
}
850

    
851
void avcodec_string(char *buf, int buf_size, AVCodecContext *enc, int encode)
852
{
853
    const char *codec_name;
854
    AVCodec *p;
855
    char buf1[32];
856
    int bitrate;
857
    AVRational display_aspect_ratio;
858

    
859
    if (encode)
860
        p = avcodec_find_encoder(enc->codec_id);
861
    else
862
        p = avcodec_find_decoder(enc->codec_id);
863

    
864
    if (p) {
865
        codec_name = p->name;
866
    } else if (enc->codec_id == CODEC_ID_MPEG2TS) {
867
        /* fake mpeg2 transport stream codec (currently not
868
           registered) */
869
        codec_name = "mpeg2ts";
870
    } else if (enc->codec_name[0] != '\0') {
871
        codec_name = enc->codec_name;
872
    } else {
873
        /* output avi tags */
874
        char tag_buf[32];
875
        av_get_codec_tag_string(tag_buf, sizeof(tag_buf), enc->codec_tag);
876
        snprintf(buf1, sizeof(buf1), "%s / 0x%04X", tag_buf, enc->codec_tag);
877
        codec_name = buf1;
878
    }
879

    
880
    switch(enc->codec_type) {
881
    case AVMEDIA_TYPE_VIDEO:
882
        snprintf(buf, buf_size,
883
                 "Video: %s%s",
884
                 codec_name, enc->mb_decision ? " (hq)" : "");
885
        if (enc->pix_fmt != PIX_FMT_NONE) {
886
            snprintf(buf + strlen(buf), buf_size - strlen(buf),
887
                     ", %s",
888
                     avcodec_get_pix_fmt_name(enc->pix_fmt));
889
        }
890
        if (enc->width) {
891
            snprintf(buf + strlen(buf), buf_size - strlen(buf),
892
                     ", %dx%d",
893
                     enc->width, enc->height);
894
            if (enc->sample_aspect_ratio.num) {
895
                av_reduce(&display_aspect_ratio.num, &display_aspect_ratio.den,
896
                          enc->width*enc->sample_aspect_ratio.num,
897
                          enc->height*enc->sample_aspect_ratio.den,
898
                          1024*1024);
899
                snprintf(buf + strlen(buf), buf_size - strlen(buf),
900
                         " [PAR %d:%d DAR %d:%d]",
901
                         enc->sample_aspect_ratio.num, enc->sample_aspect_ratio.den,
902
                         display_aspect_ratio.num, display_aspect_ratio.den);
903
            }
904
            if(av_log_get_level() >= AV_LOG_DEBUG){
905
                int g= av_gcd(enc->time_base.num, enc->time_base.den);
906
                snprintf(buf + strlen(buf), buf_size - strlen(buf),
907
                     ", %d/%d",
908
                     enc->time_base.num/g, enc->time_base.den/g);
909
            }
910
        }
911
        if (encode) {
912
            snprintf(buf + strlen(buf), buf_size - strlen(buf),
913
                     ", q=%d-%d", enc->qmin, enc->qmax);
914
        }
915
        break;
916
    case AVMEDIA_TYPE_AUDIO:
917
        snprintf(buf, buf_size,
918
                 "Audio: %s",
919
                 codec_name);
920
        if (enc->sample_rate) {
921
            snprintf(buf + strlen(buf), buf_size - strlen(buf),
922
                     ", %d Hz", enc->sample_rate);
923
        }
924
        av_strlcat(buf, ", ", buf_size);
925
        avcodec_get_channel_layout_string(buf + strlen(buf), buf_size - strlen(buf), enc->channels, enc->channel_layout);
926
        if (enc->sample_fmt != AV_SAMPLE_FMT_NONE) {
927
            snprintf(buf + strlen(buf), buf_size - strlen(buf),
928
                     ", %s", av_get_sample_fmt_name(enc->sample_fmt));
929
        }
930
        break;
931
    case AVMEDIA_TYPE_DATA:
932
        snprintf(buf, buf_size, "Data: %s", codec_name);
933
        break;
934
    case AVMEDIA_TYPE_SUBTITLE:
935
        snprintf(buf, buf_size, "Subtitle: %s", codec_name);
936
        break;
937
    case AVMEDIA_TYPE_ATTACHMENT:
938
        snprintf(buf, buf_size, "Attachment: %s", codec_name);
939
        break;
940
    default:
941
        snprintf(buf, buf_size, "Invalid Codec type %d", enc->codec_type);
942
        return;
943
    }
944
    if (encode) {
945
        if (enc->flags & CODEC_FLAG_PASS1)
946
            snprintf(buf + strlen(buf), buf_size - strlen(buf),
947
                     ", pass 1");
948
        if (enc->flags & CODEC_FLAG_PASS2)
949
            snprintf(buf + strlen(buf), buf_size - strlen(buf),
950
                     ", pass 2");
951
    }
952
    bitrate = get_bit_rate(enc);
953
    if (bitrate != 0) {
954
        snprintf(buf + strlen(buf), buf_size - strlen(buf),
955
                 ", %d kb/s", bitrate / 1000);
956
    }
957
}
958

    
959
unsigned avcodec_version( void )
960
{
961
  return LIBAVCODEC_VERSION_INT;
962
}
963

    
964
const char *avcodec_configuration(void)
965
{
966
    return FFMPEG_CONFIGURATION;
967
}
968

    
969
const char *avcodec_license(void)
970
{
971
#define LICENSE_PREFIX "libavcodec license: "
972
    return LICENSE_PREFIX FFMPEG_LICENSE + sizeof(LICENSE_PREFIX) - 1;
973
}
974

    
975
void avcodec_init(void)
976
{
977
    static int initialized = 0;
978

    
979
    if (initialized != 0)
980
        return;
981
    initialized = 1;
982

    
983
    dsputil_static_init();
984
}
985

    
986
void avcodec_flush_buffers(AVCodecContext *avctx)
987
{
988
    if(avctx->codec->flush)
989
        avctx->codec->flush(avctx);
990
}
991

    
992
void avcodec_default_free_buffers(AVCodecContext *s){
993
    int i, j;
994

    
995
    if(s->internal_buffer==NULL) return;
996

    
997
    if (s->internal_buffer_count)
998
        av_log(s, AV_LOG_WARNING, "Found %i unreleased buffers!\n", s->internal_buffer_count);
999
    for(i=0; i<INTERNAL_BUFFER_SIZE; i++){
1000
        InternalBuffer *buf= &((InternalBuffer*)s->internal_buffer)[i];
1001
        for(j=0; j<4; j++){
1002
            av_freep(&buf->base[j]);
1003
            buf->data[j]= NULL;
1004
        }
1005
    }
1006
    av_freep(&s->internal_buffer);
1007

    
1008
    s->internal_buffer_count=0;
1009
}
1010

    
1011
char av_get_pict_type_char(int pict_type){
1012
    switch(pict_type){
1013
    case FF_I_TYPE: return 'I';
1014
    case FF_P_TYPE: return 'P';
1015
    case FF_B_TYPE: return 'B';
1016
    case FF_S_TYPE: return 'S';
1017
    case FF_SI_TYPE:return 'i';
1018
    case FF_SP_TYPE:return 'p';
1019
    case FF_BI_TYPE:return 'b';
1020
    default:        return '?';
1021
    }
1022
}
1023

    
1024
int av_get_bits_per_sample(enum CodecID codec_id){
1025
    switch(codec_id){
1026
    case CODEC_ID_ADPCM_SBPRO_2:
1027
        return 2;
1028
    case CODEC_ID_ADPCM_SBPRO_3:
1029
        return 3;
1030
    case CODEC_ID_ADPCM_SBPRO_4:
1031
    case CODEC_ID_ADPCM_CT:
1032
    case CODEC_ID_ADPCM_IMA_WAV:
1033
    case CODEC_ID_ADPCM_MS:
1034
    case CODEC_ID_ADPCM_YAMAHA:
1035
        return 4;
1036
    case CODEC_ID_PCM_ALAW:
1037
    case CODEC_ID_PCM_MULAW:
1038
    case CODEC_ID_PCM_S8:
1039
    case CODEC_ID_PCM_U8:
1040
    case CODEC_ID_PCM_ZORK:
1041
        return 8;
1042
    case CODEC_ID_PCM_S16BE:
1043
    case CODEC_ID_PCM_S16LE:
1044
    case CODEC_ID_PCM_S16LE_PLANAR:
1045
    case CODEC_ID_PCM_U16BE:
1046
    case CODEC_ID_PCM_U16LE:
1047
        return 16;
1048
    case CODEC_ID_PCM_S24DAUD:
1049
    case CODEC_ID_PCM_S24BE:
1050
    case CODEC_ID_PCM_S24LE:
1051
    case CODEC_ID_PCM_U24BE:
1052
    case CODEC_ID_PCM_U24LE:
1053
        return 24;
1054
    case CODEC_ID_PCM_S32BE:
1055
    case CODEC_ID_PCM_S32LE:
1056
    case CODEC_ID_PCM_U32BE:
1057
    case CODEC_ID_PCM_U32LE:
1058
    case CODEC_ID_PCM_F32BE:
1059
    case CODEC_ID_PCM_F32LE:
1060
        return 32;
1061
    case CODEC_ID_PCM_F64BE:
1062
    case CODEC_ID_PCM_F64LE:
1063
        return 64;
1064
    default:
1065
        return 0;
1066
    }
1067
}
1068

    
1069
#if FF_API_OLD_SAMPLE_FMT
1070
int av_get_bits_per_sample_format(enum AVSampleFormat sample_fmt) {
1071
    return av_get_bits_per_sample_fmt(sample_fmt);
1072
}
1073
#endif
1074

    
1075
#if !HAVE_THREADS
1076
int avcodec_thread_init(AVCodecContext *s, int thread_count){
1077
    s->thread_count = thread_count;
1078
    return -1;
1079
}
1080
#endif
1081

    
1082
unsigned int av_xiphlacing(unsigned char *s, unsigned int v)
1083
{
1084
    unsigned int n = 0;
1085

    
1086
    while(v >= 0xff) {
1087
        *s++ = 0xff;
1088
        v -= 0xff;
1089
        n++;
1090
    }
1091
    *s = v;
1092
    n++;
1093
    return n;
1094
}
1095

    
1096
#if LIBAVCODEC_VERSION_MAJOR < 53
1097
#include "libavcore/parseutils.h"
1098

    
1099
int av_parse_video_frame_size(int *width_ptr, int *height_ptr, const char *str)
1100
{
1101
    return av_parse_video_size(width_ptr, height_ptr, str);
1102
}
1103

    
1104
int av_parse_video_frame_rate(AVRational *frame_rate, const char *arg)
1105
{
1106
    return av_parse_video_rate(frame_rate, arg);
1107
}
1108
#endif
1109

    
1110
int ff_match_2uint16(const uint16_t (*tab)[2], int size, int a, int b){
1111
    int i;
1112
    for(i=0; i<size && !(tab[i][0]==a && tab[i][1]==b); i++);
1113
    return i;
1114
}
1115

    
1116
void av_log_missing_feature(void *avc, const char *feature, int want_sample)
1117
{
1118
    av_log(avc, AV_LOG_WARNING, "%s not implemented. Update your FFmpeg "
1119
            "version to the newest one from SVN. If the problem still "
1120
            "occurs, it means that your file has a feature which has not "
1121
            "been implemented.", feature);
1122
    if(want_sample)
1123
        av_log_ask_for_sample(avc, NULL);
1124
    else
1125
        av_log(avc, AV_LOG_WARNING, "\n");
1126
}
1127

    
1128
void av_log_ask_for_sample(void *avc, const char *msg)
1129
{
1130
    if (msg)
1131
        av_log(avc, AV_LOG_WARNING, "%s ", msg);
1132
    av_log(avc, AV_LOG_WARNING, "If you want to help, upload a sample "
1133
            "of this file to ftp://upload.ffmpeg.org/MPlayer/incoming/ "
1134
            "and contact the ffmpeg-devel mailing list.\n");
1135
}
1136

    
1137
static AVHWAccel *first_hwaccel = NULL;
1138

    
1139
void av_register_hwaccel(AVHWAccel *hwaccel)
1140
{
1141
    AVHWAccel **p = &first_hwaccel;
1142
    while (*p)
1143
        p = &(*p)->next;
1144
    *p = hwaccel;
1145
    hwaccel->next = NULL;
1146
}
1147

    
1148
AVHWAccel *av_hwaccel_next(AVHWAccel *hwaccel)
1149
{
1150
    return hwaccel ? hwaccel->next : first_hwaccel;
1151
}
1152

    
1153
AVHWAccel *ff_find_hwaccel(enum CodecID codec_id, enum PixelFormat pix_fmt)
1154
{
1155
    AVHWAccel *hwaccel=NULL;
1156

    
1157
    while((hwaccel= av_hwaccel_next(hwaccel))){
1158
        if (   hwaccel->id      == codec_id
1159
            && hwaccel->pix_fmt == pix_fmt)
1160
            return hwaccel;
1161
    }
1162
    return NULL;
1163
}
1164

    
1165
int av_lockmgr_register(int (*cb)(void **mutex, enum AVLockOp op))
1166
{
1167
    if (ff_lockmgr_cb) {
1168
        if (ff_lockmgr_cb(&codec_mutex, AV_LOCK_DESTROY))
1169
            return -1;
1170
    }
1171

    
1172
    ff_lockmgr_cb = cb;
1173

    
1174
    if (ff_lockmgr_cb) {
1175
        if (ff_lockmgr_cb(&codec_mutex, AV_LOCK_CREATE))
1176
            return -1;
1177
    }
1178
    return 0;
1179
}
1180

    
1181
unsigned int ff_toupper4(unsigned int x)
1182
{
1183
    return     toupper( x     &0xFF)
1184
            + (toupper((x>>8 )&0xFF)<<8 )
1185
            + (toupper((x>>16)&0xFF)<<16)
1186
            + (toupper((x>>24)&0xFF)<<24);
1187
}