Coverage Report

Created: 2026-01-25 07:18

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/ffmpeg/libavcodec/utils.c
Line
Count
Source
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 "config.h"
29
#include "libavutil/avassert.h"
30
#include "libavutil/channel_layout.h"
31
#include "libavutil/intreadwrite.h"
32
#include "libavutil/mem.h"
33
#include "libavutil/pixdesc.h"
34
#include "libavutil/imgutils.h"
35
#include "libavutil/pixfmt.h"
36
#include "libavutil/timecode_internal.h"
37
#include "avcodec.h"
38
#include "codec.h"
39
#include "codec_desc.h"
40
#include "codec_internal.h"
41
#include "codec_par.h"
42
#include "decode.h"
43
#include "hwconfig.h"
44
#include "libavutil/refstruct.h"
45
#include "thread.h"
46
#include "threadframe.h"
47
#include "internal.h"
48
#include "put_bits.h"
49
#include "startcode.h"
50
#include <stdlib.h>
51
#include <limits.h>
52
53
void av_fast_padded_malloc(void *ptr, unsigned int *size, size_t min_size)
54
0
{
55
0
    uint8_t **p = ptr;
56
0
    if (min_size > SIZE_MAX - AV_INPUT_BUFFER_PADDING_SIZE) {
57
0
        av_freep(p);
58
0
        *size = 0;
59
0
        return;
60
0
    }
61
0
    av_fast_mallocz(p, size, min_size + AV_INPUT_BUFFER_PADDING_SIZE);
62
0
    if (*p)
63
0
        memset(*p + min_size, 0, AV_INPUT_BUFFER_PADDING_SIZE);
64
0
}
65
66
void av_fast_padded_mallocz(void *ptr, unsigned int *size, size_t min_size)
67
0
{
68
0
    uint8_t **p = ptr;
69
0
    if (min_size > SIZE_MAX - AV_INPUT_BUFFER_PADDING_SIZE) {
70
0
        av_freep(p);
71
0
        *size = 0;
72
0
        return;
73
0
    }
74
0
    av_fast_malloc(p, size, min_size + AV_INPUT_BUFFER_PADDING_SIZE);
75
0
    if (*p)
76
0
        memset(*p, 0, min_size + AV_INPUT_BUFFER_PADDING_SIZE);
77
0
}
78
79
int av_codec_is_encoder(const AVCodec *avcodec)
80
0
{
81
0
    const FFCodec *const codec = ffcodec(avcodec);
82
0
    return codec && !codec->is_decoder;
83
0
}
84
85
int av_codec_is_decoder(const AVCodec *avcodec)
86
0
{
87
0
    const FFCodec *const codec = ffcodec(avcodec);
88
0
    return codec && codec->is_decoder;
89
0
}
90
91
int ff_set_dimensions(AVCodecContext *s, int width, int height)
92
0
{
93
0
    int ret = av_image_check_size2(width, height, s->max_pixels, AV_PIX_FMT_NONE, 0, s);
94
95
0
    if (ret < 0)
96
0
        width = height = 0;
97
98
0
    s->coded_width  = width;
99
0
    s->coded_height = height;
100
0
    s->width        = AV_CEIL_RSHIFT(width,  s->lowres);
101
0
    s->height       = AV_CEIL_RSHIFT(height, s->lowres);
102
103
0
    return ret;
104
0
}
105
106
int ff_set_sar(AVCodecContext *avctx, AVRational sar)
107
0
{
108
0
    int ret = av_image_check_sar(avctx->width, avctx->height, sar);
109
110
0
    if (ret < 0) {
111
0
        av_log(avctx, AV_LOG_WARNING, "ignoring invalid SAR: %d/%d\n",
112
0
               sar.num, sar.den);
113
0
        avctx->sample_aspect_ratio = (AVRational){ 0, 1 };
114
0
        return ret;
115
0
    } else {
116
0
        avctx->sample_aspect_ratio = sar;
117
0
    }
118
0
    return 0;
119
0
}
120
121
int ff_side_data_update_matrix_encoding(AVFrame *frame,
122
                                        enum AVMatrixEncoding matrix_encoding)
123
0
{
124
0
    AVFrameSideData *side_data;
125
0
    enum AVMatrixEncoding *data;
126
127
0
    side_data = av_frame_get_side_data(frame, AV_FRAME_DATA_MATRIXENCODING);
128
0
    if (!side_data)
129
0
        side_data = av_frame_new_side_data(frame, AV_FRAME_DATA_MATRIXENCODING,
130
0
                                           sizeof(enum AVMatrixEncoding));
131
132
0
    if (!side_data)
133
0
        return AVERROR(ENOMEM);
134
135
0
    data  = (enum AVMatrixEncoding*)side_data->data;
136
0
    *data = matrix_encoding;
137
138
0
    return 0;
139
0
}
140
141
void avcodec_align_dimensions2(AVCodecContext *s, int *width, int *height,
142
                               int linesize_align[AV_NUM_DATA_POINTERS])
143
0
{
144
0
    int i;
145
0
    int w_align = 1;
146
0
    int h_align = 1;
147
0
    AVPixFmtDescriptor const *desc = av_pix_fmt_desc_get(s->pix_fmt);
148
149
0
    if (desc) {
150
0
        w_align = 1 << desc->log2_chroma_w;
151
0
        h_align = 1 << desc->log2_chroma_h;
152
0
    }
153
154
0
    switch (s->pix_fmt) {
155
0
    case AV_PIX_FMT_YUV420P:
156
0
    case AV_PIX_FMT_YUYV422:
157
0
    case AV_PIX_FMT_YVYU422:
158
0
    case AV_PIX_FMT_UYVY422:
159
0
    case AV_PIX_FMT_YUV422P:
160
0
    case AV_PIX_FMT_YUV440P:
161
0
    case AV_PIX_FMT_YUV444P:
162
0
    case AV_PIX_FMT_GBRP:
163
0
    case AV_PIX_FMT_GBRAP:
164
0
    case AV_PIX_FMT_GRAY8:
165
0
    case AV_PIX_FMT_GRAY16BE:
166
0
    case AV_PIX_FMT_GRAY16LE:
167
0
    case AV_PIX_FMT_YUVJ420P:
168
0
    case AV_PIX_FMT_YUVJ422P:
169
0
    case AV_PIX_FMT_YUVJ440P:
170
0
    case AV_PIX_FMT_YUVJ444P:
171
0
    case AV_PIX_FMT_YUVA420P:
172
0
    case AV_PIX_FMT_YUVA422P:
173
0
    case AV_PIX_FMT_YUVA444P:
174
0
    case AV_PIX_FMT_YUV420P9LE:
175
0
    case AV_PIX_FMT_YUV420P9BE:
176
0
    case AV_PIX_FMT_YUV420P10LE:
177
0
    case AV_PIX_FMT_YUV420P10BE:
178
0
    case AV_PIX_FMT_YUV420P12LE:
179
0
    case AV_PIX_FMT_YUV420P12BE:
180
0
    case AV_PIX_FMT_YUV420P14LE:
181
0
    case AV_PIX_FMT_YUV420P14BE:
182
0
    case AV_PIX_FMT_YUV420P16LE:
183
0
    case AV_PIX_FMT_YUV420P16BE:
184
0
    case AV_PIX_FMT_YUVA420P9LE:
185
0
    case AV_PIX_FMT_YUVA420P9BE:
186
0
    case AV_PIX_FMT_YUVA420P10LE:
187
0
    case AV_PIX_FMT_YUVA420P10BE:
188
0
    case AV_PIX_FMT_YUVA420P16LE:
189
0
    case AV_PIX_FMT_YUVA420P16BE:
190
0
    case AV_PIX_FMT_YUV422P9LE:
191
0
    case AV_PIX_FMT_YUV422P9BE:
192
0
    case AV_PIX_FMT_YUV422P10LE:
193
0
    case AV_PIX_FMT_YUV422P10BE:
194
0
    case AV_PIX_FMT_YUV422P12LE:
195
0
    case AV_PIX_FMT_YUV422P12BE:
196
0
    case AV_PIX_FMT_YUV422P14LE:
197
0
    case AV_PIX_FMT_YUV422P14BE:
198
0
    case AV_PIX_FMT_YUV422P16LE:
199
0
    case AV_PIX_FMT_YUV422P16BE:
200
0
    case AV_PIX_FMT_YUVA422P9LE:
201
0
    case AV_PIX_FMT_YUVA422P9BE:
202
0
    case AV_PIX_FMT_YUVA422P10LE:
203
0
    case AV_PIX_FMT_YUVA422P10BE:
204
0
    case AV_PIX_FMT_YUVA422P12LE:
205
0
    case AV_PIX_FMT_YUVA422P12BE:
206
0
    case AV_PIX_FMT_YUVA422P16LE:
207
0
    case AV_PIX_FMT_YUVA422P16BE:
208
0
    case AV_PIX_FMT_YUV440P10LE:
209
0
    case AV_PIX_FMT_YUV440P10BE:
210
0
    case AV_PIX_FMT_YUV440P12LE:
211
0
    case AV_PIX_FMT_YUV440P12BE:
212
0
    case AV_PIX_FMT_YUV444P9LE:
213
0
    case AV_PIX_FMT_YUV444P9BE:
214
0
    case AV_PIX_FMT_YUV444P10LE:
215
0
    case AV_PIX_FMT_YUV444P10BE:
216
0
    case AV_PIX_FMT_YUV444P12LE:
217
0
    case AV_PIX_FMT_YUV444P12BE:
218
0
    case AV_PIX_FMT_YUV444P14LE:
219
0
    case AV_PIX_FMT_YUV444P14BE:
220
0
    case AV_PIX_FMT_YUV444P16LE:
221
0
    case AV_PIX_FMT_YUV444P16BE:
222
0
    case AV_PIX_FMT_YUVA444P9LE:
223
0
    case AV_PIX_FMT_YUVA444P9BE:
224
0
    case AV_PIX_FMT_YUVA444P10LE:
225
0
    case AV_PIX_FMT_YUVA444P10BE:
226
0
    case AV_PIX_FMT_YUVA444P12LE:
227
0
    case AV_PIX_FMT_YUVA444P12BE:
228
0
    case AV_PIX_FMT_YUVA444P16LE:
229
0
    case AV_PIX_FMT_YUVA444P16BE:
230
0
    case AV_PIX_FMT_GBRP9LE:
231
0
    case AV_PIX_FMT_GBRP9BE:
232
0
    case AV_PIX_FMT_GBRP10LE:
233
0
    case AV_PIX_FMT_GBRP10BE:
234
0
    case AV_PIX_FMT_GBRP12LE:
235
0
    case AV_PIX_FMT_GBRP12BE:
236
0
    case AV_PIX_FMT_GBRP14LE:
237
0
    case AV_PIX_FMT_GBRP14BE:
238
0
    case AV_PIX_FMT_GBRP16LE:
239
0
    case AV_PIX_FMT_GBRP16BE:
240
0
    case AV_PIX_FMT_GBRAP12LE:
241
0
    case AV_PIX_FMT_GBRAP12BE:
242
0
    case AV_PIX_FMT_GBRAP16LE:
243
0
    case AV_PIX_FMT_GBRAP16BE:
244
0
        w_align = 16; //FIXME assume 16 pixel per macroblock
245
0
        h_align = 16 * 2; // interlaced needs 2 macroblocks height
246
0
        if (s->codec_id == AV_CODEC_ID_BINKVIDEO)
247
0
            w_align = 16*2;
248
0
        break;
249
0
    case AV_PIX_FMT_YUV411P:
250
0
    case AV_PIX_FMT_YUVJ411P:
251
0
    case AV_PIX_FMT_UYYVYY411:
252
0
        w_align = 32;
253
0
        h_align = 16 * 2;
254
0
        break;
255
0
    case AV_PIX_FMT_YUV410P:
256
0
        if (s->codec_id == AV_CODEC_ID_SVQ1) {
257
0
            w_align = 64;
258
0
            h_align = 64;
259
0
        } else if (s->codec_id == AV_CODEC_ID_SNOW) {
260
0
            w_align = 16;
261
0
            h_align = 16;
262
0
        }
263
0
        break;
264
0
    case AV_PIX_FMT_RGB555:
265
0
        if (s->codec_id == AV_CODEC_ID_RPZA) {
266
0
            w_align = 4;
267
0
            h_align = 4;
268
0
        }
269
0
        if (s->codec_id == AV_CODEC_ID_INTERPLAY_VIDEO) {
270
0
            w_align = 8;
271
0
            h_align = 8;
272
0
        }
273
0
        break;
274
0
    case AV_PIX_FMT_PAL8:
275
0
    case AV_PIX_FMT_BGR8:
276
0
    case AV_PIX_FMT_RGB8:
277
0
        if (s->codec_id == AV_CODEC_ID_SMC ||
278
0
            s->codec_id == AV_CODEC_ID_CINEPAK) {
279
0
            w_align = 4;
280
0
            h_align = 4;
281
0
        }
282
0
        if (s->codec_id == AV_CODEC_ID_JV ||
283
0
            s->codec_id == AV_CODEC_ID_ARGO ||
284
0
            s->codec_id == AV_CODEC_ID_INTERPLAY_VIDEO) {
285
0
            w_align = 8;
286
0
            h_align = 8;
287
0
        }
288
0
        if (s->codec_id == AV_CODEC_ID_MJPEG   ||
289
0
            s->codec_id == AV_CODEC_ID_MJPEGB  ||
290
0
            s->codec_id == AV_CODEC_ID_LJPEG   ||
291
0
            s->codec_id == AV_CODEC_ID_SMVJPEG ||
292
0
            s->codec_id == AV_CODEC_ID_AMV     ||
293
0
            s->codec_id == AV_CODEC_ID_SP5X    ||
294
0
            s->codec_id == AV_CODEC_ID_JPEGLS) {
295
0
            w_align =   8;
296
0
            h_align = 2*8;
297
0
        }
298
0
        break;
299
0
    case AV_PIX_FMT_BGR24:
300
0
        if ((s->codec_id == AV_CODEC_ID_MSZH) ||
301
0
            (s->codec_id == AV_CODEC_ID_ZLIB)) {
302
0
            w_align = 4;
303
0
            h_align = 4;
304
0
        }
305
0
        break;
306
0
    case AV_PIX_FMT_RGB24:
307
0
        if (s->codec_id == AV_CODEC_ID_CINEPAK) {
308
0
            w_align = 4;
309
0
            h_align = 4;
310
0
        }
311
0
        break;
312
0
    case AV_PIX_FMT_BGR0:
313
0
        if (s->codec_id == AV_CODEC_ID_ARGO) {
314
0
            w_align = 8;
315
0
            h_align = 8;
316
0
        }
317
0
        break;
318
0
    default:
319
0
        break;
320
0
    }
321
322
0
    if (s->codec_id == AV_CODEC_ID_IFF_ILBM) {
323
0
        w_align = FFMAX(w_align, 16);
324
0
    }
325
326
0
    *width  = FFALIGN(*width, w_align);
327
0
    *height = FFALIGN(*height, h_align);
328
0
    if (s->codec_id == AV_CODEC_ID_H264 || s->lowres ||
329
0
        s->codec_id == AV_CODEC_ID_VC1  || s->codec_id == AV_CODEC_ID_WMV3 ||
330
0
        s->codec_id == AV_CODEC_ID_VP5  || s->codec_id == AV_CODEC_ID_VP6 ||
331
0
        s->codec_id == AV_CODEC_ID_VP6F || s->codec_id == AV_CODEC_ID_VP6A
332
0
    ) {
333
        // some of the optimized chroma MC reads one line too much
334
        // which is also done in mpeg decoders with lowres > 0
335
0
        *height += 2;
336
337
        // H.264 uses edge emulation for out of frame motion vectors, for this
338
        // it requires a temporary area large enough to hold a 21x21 block,
339
        // increasing width ensure that the temporary area is large enough,
340
        // the next rounded up width is 32
341
0
        *width = FFMAX(*width, 32);
342
0
    }
343
0
    if (s->codec_id == AV_CODEC_ID_SVQ3) {
344
0
        *width = FFMAX(*width, 32);
345
0
    }
346
347
0
    for (i = 0; i < 4; i++)
348
0
        linesize_align[i] = STRIDE_ALIGN;
349
0
}
350
351
void avcodec_align_dimensions(AVCodecContext *s, int *width, int *height)
352
0
{
353
0
    const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(s->pix_fmt);
354
0
    int chroma_shift = desc->log2_chroma_w;
355
0
    int linesize_align[AV_NUM_DATA_POINTERS];
356
0
    int align;
357
358
0
    avcodec_align_dimensions2(s, width, height, linesize_align);
359
0
    align               = FFMAX(linesize_align[0], linesize_align[3]);
360
0
    linesize_align[1] <<= chroma_shift;
361
0
    linesize_align[2] <<= chroma_shift;
362
0
    align               = FFMAX3(align, linesize_align[1], linesize_align[2]);
363
0
    *width              = FFALIGN(*width, align);
364
0
}
365
366
int avcodec_fill_audio_frame(AVFrame *frame, int nb_channels,
367
                             enum AVSampleFormat sample_fmt, const uint8_t *buf,
368
                             int buf_size, int align)
369
0
{
370
0
    int ch, planar, needed_size, ret = 0;
371
372
0
    needed_size = av_samples_get_buffer_size(NULL, nb_channels,
373
0
                                             frame->nb_samples, sample_fmt,
374
0
                                             align);
375
0
    if (buf_size < needed_size)
376
0
        return AVERROR(EINVAL);
377
378
0
    planar = av_sample_fmt_is_planar(sample_fmt);
379
0
    if (planar && nb_channels > AV_NUM_DATA_POINTERS) {
380
0
        if (!FF_ALLOCZ_TYPED_ARRAY(frame->extended_data, nb_channels))
381
0
            return AVERROR(ENOMEM);
382
0
    } else {
383
0
        frame->extended_data = frame->data;
384
0
    }
385
386
0
    if ((ret = av_samples_fill_arrays(frame->extended_data, &frame->linesize[0],
387
0
                                      (uint8_t *)(intptr_t)buf, nb_channels, frame->nb_samples,
388
0
                                      sample_fmt, align)) < 0) {
389
0
        if (frame->extended_data != frame->data)
390
0
            av_freep(&frame->extended_data);
391
0
        return ret;
392
0
    }
393
0
    if (frame->extended_data != frame->data) {
394
0
        for (ch = 0; ch < AV_NUM_DATA_POINTERS; ch++)
395
0
            frame->data[ch] = frame->extended_data[ch];
396
0
    }
397
398
0
    return ret;
399
0
}
400
401
402
0
int avpriv_codec_get_cap_skip_frame_fill_param(const AVCodec *codec){
403
0
    return !!(ffcodec(codec)->caps_internal & FF_CODEC_CAP_SKIP_FRAME_FILL_PARAM);
404
0
}
405
406
const char *avcodec_get_name(enum AVCodecID id)
407
0
{
408
0
    const AVCodecDescriptor *cd;
409
0
    const AVCodec *codec;
410
411
0
    if (id == AV_CODEC_ID_NONE)
412
0
        return "none";
413
0
    cd = avcodec_descriptor_get(id);
414
0
    if (cd)
415
0
        return cd->name;
416
0
    av_log(NULL, AV_LOG_WARNING, "Codec 0x%x is not in the full list.\n", id);
417
0
    codec = avcodec_find_decoder(id);
418
0
    if (codec)
419
0
        return codec->name;
420
0
    codec = avcodec_find_encoder(id);
421
0
    if (codec)
422
0
        return codec->name;
423
0
    return "unknown_codec";
424
0
}
425
426
const char *av_get_profile_name(const AVCodec *codec, int profile)
427
0
{
428
0
    const AVProfile *p;
429
0
    if (profile == AV_PROFILE_UNKNOWN || !codec->profiles)
430
0
        return NULL;
431
432
0
    for (p = codec->profiles; p->profile != AV_PROFILE_UNKNOWN; p++)
433
0
        if (p->profile == profile)
434
0
            return p->name;
435
436
0
    return NULL;
437
0
}
438
439
const char *avcodec_profile_name(enum AVCodecID codec_id, int profile)
440
0
{
441
0
    const AVCodecDescriptor *desc = avcodec_descriptor_get(codec_id);
442
0
    const AVProfile *p;
443
444
0
    if (profile == AV_PROFILE_UNKNOWN || !desc || !desc->profiles)
445
0
        return NULL;
446
447
0
    for (p = desc->profiles; p->profile != AV_PROFILE_UNKNOWN; p++)
448
0
        if (p->profile == profile)
449
0
            return p->name;
450
451
0
    return NULL;
452
0
}
453
454
int av_get_exact_bits_per_sample(enum AVCodecID codec_id)
455
0
{
456
0
    switch (codec_id) {
457
0
    case AV_CODEC_ID_DFPWM:
458
0
        return 1;
459
0
    case AV_CODEC_ID_8SVX_EXP:
460
0
    case AV_CODEC_ID_8SVX_FIB:
461
0
    case AV_CODEC_ID_ADPCM_ARGO:
462
0
    case AV_CODEC_ID_ADPCM_CT:
463
0
    case AV_CODEC_ID_ADPCM_IMA_ALP:
464
0
    case AV_CODEC_ID_ADPCM_IMA_AMV:
465
0
    case AV_CODEC_ID_ADPCM_IMA_APC:
466
0
    case AV_CODEC_ID_ADPCM_IMA_APM:
467
0
    case AV_CODEC_ID_ADPCM_IMA_EA_SEAD:
468
0
    case AV_CODEC_ID_ADPCM_IMA_MAGIX:
469
0
    case AV_CODEC_ID_ADPCM_IMA_OKI:
470
0
    case AV_CODEC_ID_ADPCM_IMA_WS:
471
0
    case AV_CODEC_ID_ADPCM_IMA_SSI:
472
0
    case AV_CODEC_ID_ADPCM_G722:
473
0
    case AV_CODEC_ID_ADPCM_YAMAHA:
474
0
    case AV_CODEC_ID_ADPCM_AICA:
475
0
        return 4;
476
0
    case AV_CODEC_ID_DSD_LSBF:
477
0
    case AV_CODEC_ID_DSD_MSBF:
478
0
    case AV_CODEC_ID_DSD_LSBF_PLANAR:
479
0
    case AV_CODEC_ID_DSD_MSBF_PLANAR:
480
0
    case AV_CODEC_ID_PCM_ALAW:
481
0
    case AV_CODEC_ID_PCM_MULAW:
482
0
    case AV_CODEC_ID_PCM_VIDC:
483
0
    case AV_CODEC_ID_PCM_S8:
484
0
    case AV_CODEC_ID_PCM_S8_PLANAR:
485
0
    case AV_CODEC_ID_PCM_SGA:
486
0
    case AV_CODEC_ID_PCM_U8:
487
0
    case AV_CODEC_ID_SDX2_DPCM:
488
0
    case AV_CODEC_ID_CBD2_DPCM:
489
0
    case AV_CODEC_ID_DERF_DPCM:
490
0
    case AV_CODEC_ID_WADY_DPCM:
491
0
    case AV_CODEC_ID_ADPCM_CIRCUS:
492
0
        return 8;
493
0
    case AV_CODEC_ID_PCM_S16BE:
494
0
    case AV_CODEC_ID_PCM_S16BE_PLANAR:
495
0
    case AV_CODEC_ID_PCM_S16LE:
496
0
    case AV_CODEC_ID_PCM_S16LE_PLANAR:
497
0
    case AV_CODEC_ID_PCM_U16BE:
498
0
    case AV_CODEC_ID_PCM_U16LE:
499
0
        return 16;
500
0
    case AV_CODEC_ID_PCM_S24DAUD:
501
0
    case AV_CODEC_ID_PCM_S24BE:
502
0
    case AV_CODEC_ID_PCM_S24LE:
503
0
    case AV_CODEC_ID_PCM_S24LE_PLANAR:
504
0
    case AV_CODEC_ID_PCM_U24BE:
505
0
    case AV_CODEC_ID_PCM_U24LE:
506
0
        return 24;
507
0
    case AV_CODEC_ID_PCM_S32BE:
508
0
    case AV_CODEC_ID_PCM_S32LE:
509
0
    case AV_CODEC_ID_PCM_S32LE_PLANAR:
510
0
    case AV_CODEC_ID_PCM_U32BE:
511
0
    case AV_CODEC_ID_PCM_U32LE:
512
0
    case AV_CODEC_ID_PCM_F32BE:
513
0
    case AV_CODEC_ID_PCM_F32LE:
514
0
    case AV_CODEC_ID_PCM_F24LE:
515
0
    case AV_CODEC_ID_PCM_F16LE:
516
0
        return 32;
517
0
    case AV_CODEC_ID_PCM_F64BE:
518
0
    case AV_CODEC_ID_PCM_F64LE:
519
0
    case AV_CODEC_ID_PCM_S64BE:
520
0
    case AV_CODEC_ID_PCM_S64LE:
521
0
        return 64;
522
0
    default:
523
0
        return 0;
524
0
    }
525
0
}
526
527
enum AVCodecID av_get_pcm_codec(enum AVSampleFormat fmt, int be)
528
0
{
529
0
    static const enum AVCodecID map[][2] = {
530
0
        [AV_SAMPLE_FMT_U8  ] = { AV_CODEC_ID_PCM_U8,    AV_CODEC_ID_PCM_U8    },
531
0
        [AV_SAMPLE_FMT_S16 ] = { AV_CODEC_ID_PCM_S16LE, AV_CODEC_ID_PCM_S16BE },
532
0
        [AV_SAMPLE_FMT_S32 ] = { AV_CODEC_ID_PCM_S32LE, AV_CODEC_ID_PCM_S32BE },
533
0
        [AV_SAMPLE_FMT_FLT ] = { AV_CODEC_ID_PCM_F32LE, AV_CODEC_ID_PCM_F32BE },
534
0
        [AV_SAMPLE_FMT_DBL ] = { AV_CODEC_ID_PCM_F64LE, AV_CODEC_ID_PCM_F64BE },
535
0
        [AV_SAMPLE_FMT_U8P ] = { AV_CODEC_ID_PCM_U8,    AV_CODEC_ID_PCM_U8    },
536
0
        [AV_SAMPLE_FMT_S16P] = { AV_CODEC_ID_PCM_S16LE, AV_CODEC_ID_PCM_S16BE },
537
0
        [AV_SAMPLE_FMT_S32P] = { AV_CODEC_ID_PCM_S32LE, AV_CODEC_ID_PCM_S32BE },
538
0
        [AV_SAMPLE_FMT_S64P] = { AV_CODEC_ID_PCM_S64LE, AV_CODEC_ID_PCM_S64BE },
539
0
        [AV_SAMPLE_FMT_FLTP] = { AV_CODEC_ID_PCM_F32LE, AV_CODEC_ID_PCM_F32BE },
540
0
        [AV_SAMPLE_FMT_DBLP] = { AV_CODEC_ID_PCM_F64LE, AV_CODEC_ID_PCM_F64BE },
541
0
    };
542
0
    if (fmt < 0 || fmt >= FF_ARRAY_ELEMS(map))
543
0
        return AV_CODEC_ID_NONE;
544
0
    if (be < 0 || be > 1)
545
0
        be = AV_NE(1, 0);
546
0
    return map[fmt][be];
547
0
}
548
549
int av_get_bits_per_sample(enum AVCodecID codec_id)
550
0
{
551
0
    switch (codec_id) {
552
0
    case AV_CODEC_ID_DFPWM:
553
0
        return 1;
554
0
    case AV_CODEC_ID_ADPCM_SBPRO_2:
555
0
    case AV_CODEC_ID_G728:
556
0
        return 2;
557
0
    case AV_CODEC_ID_ADPCM_SBPRO_3:
558
0
        return 3;
559
0
    case AV_CODEC_ID_ADPCM_SBPRO_4:
560
0
    case AV_CODEC_ID_ADPCM_IMA_WAV:
561
0
    case AV_CODEC_ID_ADPCM_IMA_XBOX:
562
0
    case AV_CODEC_ID_ADPCM_IMA_QT:
563
0
    case AV_CODEC_ID_ADPCM_SWF:
564
0
    case AV_CODEC_ID_ADPCM_MS:
565
0
        return 4;
566
0
    default:
567
0
        return av_get_exact_bits_per_sample(codec_id);
568
0
    }
569
0
}
570
571
static int get_audio_frame_duration(enum AVCodecID id, int sr, int ch, int ba,
572
                                    uint32_t tag, int bits_per_coded_sample, int64_t bitrate,
573
                                    uint8_t * extradata, int frame_size, int frame_bytes)
574
0
{
575
0
    int bps = av_get_exact_bits_per_sample(id);
576
0
    int framecount = (ba > 0 && frame_bytes / ba > 0) ? frame_bytes / ba : 1;
577
578
    /* codecs with an exact constant bits per sample */
579
0
    if (bps > 0 && ch > 0 && frame_bytes > 0 && ch < 32768 && bps < 32768)
580
0
        return (frame_bytes * 8LL) / (bps * ch);
581
0
    bps = bits_per_coded_sample;
582
583
    /* codecs with a fixed packet duration */
584
0
    switch (id) {
585
0
    case AV_CODEC_ID_ADPCM_ADX:    return   32;
586
0
    case AV_CODEC_ID_ADPCM_IMA_QT: return   64;
587
0
    case AV_CODEC_ID_ADPCM_EA_XAS: return  128;
588
0
    case AV_CODEC_ID_AMR_NB:
589
0
    case AV_CODEC_ID_EVRC:
590
0
    case AV_CODEC_ID_GSM:
591
0
    case AV_CODEC_ID_QCELP:
592
0
    case AV_CODEC_ID_RA_288:       return  160;
593
0
    case AV_CODEC_ID_AMR_WB:
594
0
    case AV_CODEC_ID_GSM_MS:       return  320;
595
0
    case AV_CODEC_ID_MP1:          return  384;
596
0
    case AV_CODEC_ID_ATRAC1:       return  512;
597
0
    case AV_CODEC_ID_ATRAC9:
598
0
    case AV_CODEC_ID_ATRAC3:
599
0
        if (framecount > INT_MAX/1024)
600
0
            return 0;
601
0
        return 1024 * framecount;
602
0
    case AV_CODEC_ID_ATRAC3P:      return 2048;
603
0
    case AV_CODEC_ID_MP2:
604
0
    case AV_CODEC_ID_MUSEPACK7:    return 1152;
605
0
    case AV_CODEC_ID_AC3:          return 1536;
606
0
    case AV_CODEC_ID_FTR:          return 1024;
607
0
    }
608
609
0
    if (sr > 0) {
610
        /* calc from sample rate */
611
0
        if (id == AV_CODEC_ID_TTA)
612
0
            return 256ll * sr / 245;
613
0
        else if (id == AV_CODEC_ID_DST)
614
0
            return 588ll * sr / 44100;
615
0
        else if (id == AV_CODEC_ID_BINKAUDIO_DCT) {
616
0
            if (sr / 22050 > 22)
617
0
                return 0;
618
0
            return (480 << (sr / 22050));
619
0
        }
620
621
0
        if (id == AV_CODEC_ID_MP3)
622
0
            return sr <= 24000 ? 576 : 1152;
623
0
    }
624
625
0
    if (ba > 0) {
626
        /* calc from block_align */
627
0
        if (id == AV_CODEC_ID_SIPR) {
628
0
            switch (ba) {
629
0
            case 20: return 160;
630
0
            case 19: return 144;
631
0
            case 29: return 288;
632
0
            case 37: return 480;
633
0
            }
634
0
        } else if (id == AV_CODEC_ID_ILBC) {
635
0
            switch (ba) {
636
0
            case 38: return 160;
637
0
            case 50: return 240;
638
0
            }
639
0
        }
640
0
    }
641
642
0
    if (frame_bytes > 0) {
643
        /* calc from frame_bytes only */
644
0
        if (id == AV_CODEC_ID_TRUESPEECH)
645
0
            return 240 * (frame_bytes / 32);
646
0
        if (id == AV_CODEC_ID_NELLYMOSER)
647
0
            return 256 * (frame_bytes / 64);
648
0
        if (id == AV_CODEC_ID_RA_144)
649
0
            return 160 * (frame_bytes / 20);
650
0
        if (id == AV_CODEC_ID_APTX)
651
0
            return 4 * (frame_bytes / 4);
652
0
        if (id == AV_CODEC_ID_APTX_HD)
653
0
            return 4 * (frame_bytes / 6);
654
655
0
        if (bps > 0) {
656
            /* calc from frame_bytes and bits_per_coded_sample */
657
0
            if (id == AV_CODEC_ID_ADPCM_G726 || id == AV_CODEC_ID_ADPCM_G726LE)
658
0
                return frame_bytes * 8 / bps;
659
0
        }
660
661
0
        if (ch > 0 && ch < INT_MAX/16) {
662
            /* calc from frame_bytes and channels */
663
0
            switch (id) {
664
0
            case AV_CODEC_ID_FASTAUDIO:
665
0
                return frame_bytes / (40 * ch) * 256;
666
0
            case AV_CODEC_ID_ADPCM_IMA_MOFLEX:
667
0
                return (frame_bytes - 4 * ch) / (128 * ch) * 256;
668
0
            case AV_CODEC_ID_ADPCM_AFC:
669
0
                return frame_bytes / (9 * ch) * 16;
670
0
            case AV_CODEC_ID_ADPCM_N64:
671
0
                frame_bytes /= 9 * ch;
672
0
                if (frame_bytes > INT_MAX / 16)
673
0
                    return 0;
674
0
                return frame_bytes * 16;
675
0
            case AV_CODEC_ID_ADPCM_PSX:
676
0
            case AV_CODEC_ID_ADPCM_DTK:
677
0
                frame_bytes /= 16 * ch;
678
0
                if (frame_bytes > INT_MAX / 28)
679
0
                    return 0;
680
0
                return frame_bytes * 28;
681
0
            case AV_CODEC_ID_ADPCM_PSXC:
682
0
                frame_bytes = (frame_bytes - 1) / ch;
683
0
                if (frame_bytes > INT_MAX / 2)
684
0
                    return 0;
685
0
                return frame_bytes * 2;
686
0
            case AV_CODEC_ID_ADPCM_4XM:
687
0
            case AV_CODEC_ID_ADPCM_IMA_ACORN:
688
0
            case AV_CODEC_ID_ADPCM_IMA_DAT4:
689
0
            case AV_CODEC_ID_ADPCM_IMA_ISS:
690
0
            case AV_CODEC_ID_ADPCM_IMA_PDA:
691
0
                return (frame_bytes - 4 * ch) * 2 / ch;
692
0
            case AV_CODEC_ID_ADPCM_IMA_SMJPEG:
693
0
                return (frame_bytes - 4) * 2 / ch;
694
0
            case AV_CODEC_ID_ADPCM_IMA_AMV:
695
0
                return (frame_bytes - 8) * 2;
696
0
            case AV_CODEC_ID_ADPCM_THP:
697
0
            case AV_CODEC_ID_ADPCM_THP_LE:
698
0
                if (extradata)
699
0
                    return frame_bytes * 14LL / (8 * ch);
700
0
                break;
701
0
            case AV_CODEC_ID_ADPCM_XA:
702
0
                return (frame_bytes / 128) * 224 / ch;
703
0
            case AV_CODEC_ID_INTERPLAY_DPCM:
704
0
                return (frame_bytes - 6 - ch) / ch;
705
0
            case AV_CODEC_ID_ROQ_DPCM:
706
0
                return (frame_bytes - 8) / ch;
707
0
            case AV_CODEC_ID_XAN_DPCM:
708
0
                return (frame_bytes - 2 * ch) / ch;
709
0
            case AV_CODEC_ID_MACE3:
710
0
                return 3 * frame_bytes / ch;
711
0
            case AV_CODEC_ID_MACE6:
712
0
                return 6 * frame_bytes / ch;
713
0
            case AV_CODEC_ID_PCM_LXF:
714
0
                return 2 * (frame_bytes / (5 * ch));
715
0
            case AV_CODEC_ID_IAC:
716
0
            case AV_CODEC_ID_IMC:
717
0
                return 4 * frame_bytes / ch;
718
0
            }
719
720
0
            if (tag) {
721
                /* calc from frame_bytes, channels, and codec_tag */
722
0
                if (id == AV_CODEC_ID_SOL_DPCM) {
723
0
                    if (tag == 3)
724
0
                        return frame_bytes / ch;
725
0
                    else
726
0
                        return frame_bytes * 2 / ch;
727
0
                }
728
0
            }
729
730
0
            if (ba > 0) {
731
                /* calc from frame_bytes, channels, and block_align */
732
0
                int blocks = frame_bytes / ba;
733
0
                int64_t tmp = 0;
734
0
                switch (id) {
735
0
                case AV_CODEC_ID_ADPCM_IMA_XBOX:
736
0
                    if (bps != 4)
737
0
                        return 0;
738
0
                    tmp = blocks * ((ba - 4 * ch) / (bps * ch) * 8);
739
0
                    break;
740
0
                case AV_CODEC_ID_ADPCM_IMA_WAV:
741
0
                    if (bps < 2 || bps > 5)
742
0
                        return 0;
743
0
                    tmp = blocks * (1LL + (ba - 4 * ch) / (bps * ch) * 8LL);
744
0
                    break;
745
0
                case AV_CODEC_ID_ADPCM_IMA_DK3:
746
0
                    tmp = blocks * (((ba - 16LL) * 2 / 3 * 4) / ch);
747
0
                    break;
748
0
                case AV_CODEC_ID_ADPCM_IMA_DK4:
749
0
                    tmp = blocks * (1 + (ba - 4LL * ch) * 2 / ch);
750
0
                    break;
751
0
                case AV_CODEC_ID_ADPCM_IMA_RAD:
752
0
                    tmp = blocks * ((ba - 4LL * ch) * 2 / ch);
753
0
                    break;
754
0
                case AV_CODEC_ID_ADPCM_MS:
755
0
                    tmp = blocks * (2 + (ba - 7LL * ch) * 2LL / ch);
756
0
                    break;
757
0
                case AV_CODEC_ID_ADPCM_MTAF:
758
0
                    tmp = blocks * (ba - 16LL) * 2 / ch;
759
0
                    break;
760
0
                case AV_CODEC_ID_ADPCM_XMD:
761
0
                    tmp = blocks * 32;
762
0
                    break;
763
0
                }
764
0
                if (tmp) {
765
0
                    if (tmp != (int)tmp)
766
0
                        return 0;
767
0
                    return tmp;
768
0
                }
769
0
            }
770
771
0
            if (bps > 0) {
772
                /* calc from frame_bytes, channels, and bits_per_coded_sample */
773
0
                switch (id) {
774
0
                case AV_CODEC_ID_PCM_DVD:
775
0
                    if(bps<4 || frame_bytes<3)
776
0
                        return 0;
777
0
                    return 2 * ((frame_bytes - 3) / ((bps * 2 / 8) * ch));
778
0
                case AV_CODEC_ID_PCM_BLURAY:
779
0
                    if(bps<4 || frame_bytes<4)
780
0
                        return 0;
781
0
                    return (frame_bytes - 4) / ((FFALIGN(ch, 2) * bps) / 8);
782
0
                case AV_CODEC_ID_S302M:
783
0
                    return 2 * (frame_bytes / ((bps + 4) / 4)) / ch;
784
0
                }
785
0
            }
786
0
        }
787
0
    }
788
789
    /* Fall back on using frame_size */
790
0
    if (frame_size > 1 && frame_bytes)
791
0
        return frame_size;
792
793
    //For WMA we currently have no other means to calculate duration thus we
794
    //do it here by assuming CBR, which is true for all known cases.
795
0
    if (bitrate > 0 && frame_bytes > 0 && sr > 0 && ba > 1) {
796
0
        if (id == AV_CODEC_ID_WMAV1 || id == AV_CODEC_ID_WMAV2)
797
0
            return  (frame_bytes * 8LL * sr) / bitrate;
798
0
    }
799
800
0
    return 0;
801
0
}
802
803
int av_get_audio_frame_duration(AVCodecContext *avctx, int frame_bytes)
804
0
{
805
0
   int channels = avctx->ch_layout.nb_channels;
806
0
   int duration;
807
808
0
    duration = get_audio_frame_duration(avctx->codec_id, avctx->sample_rate,
809
0
                                    channels, avctx->block_align,
810
0
                                    avctx->codec_tag, avctx->bits_per_coded_sample,
811
0
                                    avctx->bit_rate, avctx->extradata, avctx->frame_size,
812
0
                                    frame_bytes);
813
0
    return FFMAX(0, duration);
814
0
}
815
816
int av_get_audio_frame_duration2(AVCodecParameters *par, int frame_bytes)
817
0
{
818
0
   int channels = par->ch_layout.nb_channels;
819
0
   int duration;
820
821
0
    duration = get_audio_frame_duration(par->codec_id, par->sample_rate,
822
0
                                    channels, par->block_align,
823
0
                                    par->codec_tag, par->bits_per_coded_sample,
824
0
                                    par->bit_rate, par->extradata, par->frame_size,
825
0
                                    frame_bytes);
826
0
    return FFMAX(0, duration);
827
0
}
828
829
unsigned int av_xiphlacing(unsigned char *s, unsigned int v)
830
0
{
831
0
    unsigned int n = 0;
832
833
0
    while (v >= 0xff) {
834
0
        *s++ = 0xff;
835
0
        v -= 0xff;
836
0
        n++;
837
0
    }
838
0
    *s = v;
839
0
    n++;
840
0
    return n;
841
0
}
842
843
int ff_match_2uint16(const uint16_t(*tab)[2], int size, int a, int b)
844
0
{
845
0
    int i;
846
0
    for (i = 0; i < size && !(tab[i][0] == a && tab[i][1] == b); i++) ;
847
0
    return i;
848
0
}
849
850
const AVCodecHWConfig *avcodec_get_hw_config(const AVCodec *avcodec, int index)
851
0
{
852
0
    const FFCodec *const codec = ffcodec(avcodec);
853
0
    int i;
854
0
    if (!codec->hw_configs || index < 0)
855
0
        return NULL;
856
0
    for (i = 0; i <= index; i++)
857
0
        if (!codec->hw_configs[i])
858
0
            return NULL;
859
0
    return &codec->hw_configs[index]->public;
860
0
}
861
862
int ff_thread_ref_frame(ThreadFrame *dst, const ThreadFrame *src)
863
0
{
864
0
    int ret;
865
866
0
    dst->owner[0] = src->owner[0];
867
0
    dst->owner[1] = src->owner[1];
868
869
0
    ret = av_frame_ref(dst->f, src->f);
870
0
    if (ret < 0)
871
0
        return ret;
872
873
0
    av_assert0(!dst->progress);
874
875
0
    if (src->progress)
876
0
        dst->progress = av_refstruct_ref(src->progress);
877
878
0
    return 0;
879
0
}
880
881
int ff_thread_replace_frame(ThreadFrame *dst, const ThreadFrame *src)
882
0
{
883
0
    int ret;
884
885
0
    dst->owner[0] = src->owner[0];
886
0
    dst->owner[1] = src->owner[1];
887
888
0
    ret = av_frame_replace(dst->f, src->f);
889
0
    if (ret < 0)
890
0
        return ret;
891
892
0
    av_refstruct_replace(&dst->progress, src->progress);
893
894
0
    return 0;
895
0
}
896
897
#if !HAVE_THREADS
898
899
int ff_thread_get_buffer(AVCodecContext *avctx, AVFrame *f, int flags)
900
{
901
    return ff_get_buffer(avctx, f, flags);
902
}
903
904
int ff_thread_get_ext_buffer(AVCodecContext *avctx, ThreadFrame *f, int flags)
905
{
906
    f->owner[0] = f->owner[1] = avctx;
907
    return ff_get_buffer(avctx, f->f, flags);
908
}
909
910
void ff_thread_release_ext_buffer(ThreadFrame *f)
911
{
912
    f->owner[0] = f->owner[1] = NULL;
913
    if (f->f)
914
        av_frame_unref(f->f);
915
}
916
917
void ff_thread_finish_setup(AVCodecContext *avctx)
918
{
919
}
920
921
void ff_thread_report_progress(ThreadFrame *f, int progress, int field)
922
{
923
}
924
925
void ff_thread_await_progress(const ThreadFrame *f, int progress, int field)
926
{
927
}
928
929
int ff_thread_can_start_frame(AVCodecContext *avctx)
930
{
931
    return 1;
932
}
933
#endif
934
935
const uint8_t *avpriv_find_start_code(const uint8_t *restrict p,
936
                                      const uint8_t *end,
937
                                      uint32_t *restrict state)
938
0
{
939
0
    int i;
940
941
0
    av_assert0(p <= end);
942
0
    if (p >= end)
943
0
        return end;
944
945
0
    for (i = 0; i < 3; i++) {
946
0
        uint32_t tmp = *state << 8;
947
0
        *state = tmp + *(p++);
948
0
        if (tmp == 0x100 || p == end)
949
0
            return p;
950
0
    }
951
952
0
    while (p < end) {
953
0
        if      (p[-1] > 1      ) p += 3;
954
0
        else if (p[-2]          ) p += 2;
955
0
        else if (p[-3]|(p[-1]-1)) p++;
956
0
        else {
957
0
            p++;
958
0
            break;
959
0
        }
960
0
    }
961
962
0
    p = FFMIN(p, end) - 4;
963
0
    *state = AV_RB32(p);
964
965
0
    return p + 4;
966
0
}
967
968
AVCPBProperties *av_cpb_properties_alloc(size_t *size)
969
0
{
970
0
    AVCPBProperties *props = av_mallocz(sizeof(AVCPBProperties));
971
0
    if (!props)
972
0
        return NULL;
973
974
0
    if (size)
975
0
        *size = sizeof(*props);
976
977
0
    props->vbv_delay = UINT64_MAX;
978
979
0
    return props;
980
0
}
981
982
int ff_alloc_timecode_sei(const AVFrame *frame, AVRational rate, size_t prefix_len,
983
                     void **data, size_t *sei_size)
984
0
{
985
0
    AVFrameSideData *sd = NULL;
986
0
    uint8_t *sei_data;
987
0
    PutBitContext pb;
988
0
    uint32_t *tc;
989
0
    int m;
990
991
0
    if (frame)
992
0
        sd = av_frame_get_side_data(frame, AV_FRAME_DATA_S12M_TIMECODE);
993
994
0
    if (!sd) {
995
0
        *data = NULL;
996
0
        return 0;
997
0
    }
998
0
    tc =  (uint32_t*)sd->data;
999
0
    m  = tc[0] & 3;
1000
1001
0
    *sei_size = sizeof(uint32_t) * 4;
1002
0
    *data = av_mallocz(*sei_size + prefix_len);
1003
0
    if (!*data)
1004
0
        return AVERROR(ENOMEM);
1005
0
    sei_data = (uint8_t*)*data + prefix_len;
1006
1007
0
    init_put_bits(&pb, sei_data, *sei_size);
1008
0
    put_bits(&pb, 2, m); // num_clock_ts
1009
1010
0
    for (int j = 1; j <= m; j++) {
1011
0
        unsigned hh, mm, ss, ff, drop;
1012
0
        ff_timecode_set_smpte(&drop, &hh, &mm, &ss, &ff, rate, tc[j], 0, 0);
1013
1014
0
        put_bits(&pb, 1, 1); // clock_timestamp_flag
1015
0
        put_bits(&pb, 1, 1); // units_field_based_flag
1016
0
        put_bits(&pb, 5, 0); // counting_type
1017
0
        put_bits(&pb, 1, 1); // full_timestamp_flag
1018
0
        put_bits(&pb, 1, 0); // discontinuity_flag
1019
0
        put_bits(&pb, 1, drop);
1020
0
        put_bits(&pb, 9, ff);
1021
0
        put_bits(&pb, 6, ss);
1022
0
        put_bits(&pb, 6, mm);
1023
0
        put_bits(&pb, 5, hh);
1024
0
        put_bits(&pb, 5, 0);
1025
0
    }
1026
0
    flush_put_bits(&pb);
1027
1028
0
    return 0;
1029
0
}
1030
1031
int64_t ff_guess_coded_bitrate(AVCodecContext *avctx)
1032
0
{
1033
0
    AVRational framerate = avctx->framerate;
1034
0
    int bits_per_coded_sample = avctx->bits_per_coded_sample;
1035
0
    int64_t bitrate;
1036
1037
0
    if (!(framerate.num && framerate.den))
1038
0
        framerate = av_inv_q(avctx->time_base);
1039
0
    if (!(framerate.num && framerate.den))
1040
0
        return 0;
1041
1042
0
    if (!bits_per_coded_sample) {
1043
0
        const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(avctx->pix_fmt);
1044
0
        bits_per_coded_sample = av_get_bits_per_pixel(desc);
1045
0
    }
1046
0
    bitrate = (int64_t)bits_per_coded_sample * avctx->width * avctx->height *
1047
0
              framerate.num / framerate.den;
1048
1049
0
    return bitrate;
1050
0
}