annotate ffmpeg/libavcodec/utils.c @ 13:844d341cf643 tip

Back up before ISMIR
author Yading Song <yading.song@eecs.qmul.ac.uk>
date Thu, 31 Oct 2013 13:17:06 +0000
parents 6840f77b83aa
children
rev   line source
yading@10 1 /*
yading@10 2 * utils for libavcodec
yading@10 3 * Copyright (c) 2001 Fabrice Bellard
yading@10 4 * Copyright (c) 2002-2004 Michael Niedermayer <michaelni@gmx.at>
yading@10 5 *
yading@10 6 * This file is part of FFmpeg.
yading@10 7 *
yading@10 8 * FFmpeg is free software; you can redistribute it and/or
yading@10 9 * modify it under the terms of the GNU Lesser General Public
yading@10 10 * License as published by the Free Software Foundation; either
yading@10 11 * version 2.1 of the License, or (at your option) any later version.
yading@10 12 *
yading@10 13 * FFmpeg is distributed in the hope that it will be useful,
yading@10 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
yading@10 15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
yading@10 16 * Lesser General Public License for more details.
yading@10 17 *
yading@10 18 * You should have received a copy of the GNU Lesser General Public
yading@10 19 * License along with FFmpeg; if not, write to the Free Software
yading@10 20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
yading@10 21 */
yading@10 22
yading@10 23 /**
yading@10 24 * @file
yading@10 25 * utils.
yading@10 26 */
yading@10 27
yading@10 28 #include "config.h"
yading@10 29 #include "libavutil/avassert.h"
yading@10 30 #include "libavutil/avstring.h"
yading@10 31 #include "libavutil/bprint.h"
yading@10 32 #include "libavutil/channel_layout.h"
yading@10 33 #include "libavutil/crc.h"
yading@10 34 #include "libavutil/frame.h"
yading@10 35 #include "libavutil/mathematics.h"
yading@10 36 #include "libavutil/pixdesc.h"
yading@10 37 #include "libavutil/imgutils.h"
yading@10 38 #include "libavutil/samplefmt.h"
yading@10 39 #include "libavutil/dict.h"
yading@10 40 #include "libavutil/avassert.h"
yading@10 41 #include "avcodec.h"
yading@10 42 #include "dsputil.h"
yading@10 43 #include "libavutil/opt.h"
yading@10 44 #include "thread.h"
yading@10 45 #include "frame_thread_encoder.h"
yading@10 46 #include "internal.h"
yading@10 47 #include "bytestream.h"
yading@10 48 #include "version.h"
yading@10 49 #include <stdlib.h>
yading@10 50 #include <stdarg.h>
yading@10 51 #include <limits.h>
yading@10 52 #include <float.h>
yading@10 53 #if CONFIG_ICONV
yading@10 54 # include <iconv.h>
yading@10 55 #endif
yading@10 56
yading@10 57 volatile int ff_avcodec_locked;
yading@10 58 static int volatile entangled_thread_counter = 0;
yading@10 59 static int (*ff_lockmgr_cb)(void **mutex, enum AVLockOp op);
yading@10 60 static void *codec_mutex;
yading@10 61 static void *avformat_mutex;
yading@10 62
yading@10 63 void *av_fast_realloc(void *ptr, unsigned int *size, size_t min_size)
yading@10 64 {
yading@10 65 if (min_size < *size)
yading@10 66 return ptr;
yading@10 67
yading@10 68 min_size = FFMAX(17 * min_size / 16 + 32, min_size);
yading@10 69
yading@10 70 ptr = av_realloc(ptr, min_size);
yading@10 71 /* we could set this to the unmodified min_size but this is safer
yading@10 72 * if the user lost the ptr and uses NULL now
yading@10 73 */
yading@10 74 if (!ptr)
yading@10 75 min_size = 0;
yading@10 76
yading@10 77 *size = min_size;
yading@10 78
yading@10 79 return ptr;
yading@10 80 }
yading@10 81
yading@10 82 static inline int ff_fast_malloc(void *ptr, unsigned int *size, size_t min_size, int zero_realloc)
yading@10 83 {
yading@10 84 void **p = ptr;
yading@10 85 if (min_size < *size)
yading@10 86 return 0;
yading@10 87 min_size = FFMAX(17 * min_size / 16 + 32, min_size);
yading@10 88 av_free(*p);
yading@10 89 *p = zero_realloc ? av_mallocz(min_size) : av_malloc(min_size);
yading@10 90 if (!*p)
yading@10 91 min_size = 0;
yading@10 92 *size = min_size;
yading@10 93 return 1;
yading@10 94 }
yading@10 95
yading@10 96 void av_fast_malloc(void *ptr, unsigned int *size, size_t min_size)
yading@10 97 {
yading@10 98 ff_fast_malloc(ptr, size, min_size, 0);
yading@10 99 }
yading@10 100
yading@10 101 void av_fast_padded_malloc(void *ptr, unsigned int *size, size_t min_size)
yading@10 102 {
yading@10 103 uint8_t **p = ptr;
yading@10 104 if (min_size > SIZE_MAX - FF_INPUT_BUFFER_PADDING_SIZE) {
yading@10 105 av_freep(p);
yading@10 106 *size = 0;
yading@10 107 return;
yading@10 108 }
yading@10 109 if (!ff_fast_malloc(p, size, min_size + FF_INPUT_BUFFER_PADDING_SIZE, 1))
yading@10 110 memset(*p + min_size, 0, FF_INPUT_BUFFER_PADDING_SIZE);
yading@10 111 }
yading@10 112
yading@10 113 void av_fast_padded_mallocz(void *ptr, unsigned int *size, size_t min_size)
yading@10 114 {
yading@10 115 uint8_t **p = ptr;
yading@10 116 if (min_size > SIZE_MAX - FF_INPUT_BUFFER_PADDING_SIZE) {
yading@10 117 av_freep(p);
yading@10 118 *size = 0;
yading@10 119 return;
yading@10 120 }
yading@10 121 if (!ff_fast_malloc(p, size, min_size + FF_INPUT_BUFFER_PADDING_SIZE, 1))
yading@10 122 memset(*p, 0, min_size + FF_INPUT_BUFFER_PADDING_SIZE);
yading@10 123 }
yading@10 124
yading@10 125 /* encoder management */
yading@10 126 static AVCodec *first_avcodec = NULL;
yading@10 127
yading@10 128 AVCodec *av_codec_next(const AVCodec *c)
yading@10 129 {
yading@10 130 if (c)
yading@10 131 return c->next;
yading@10 132 else
yading@10 133 return first_avcodec;
yading@10 134 }
yading@10 135
yading@10 136 static void avcodec_init(void)
yading@10 137 {
yading@10 138 static int initialized = 0;
yading@10 139
yading@10 140 if (initialized != 0)
yading@10 141 return;
yading@10 142 initialized = 1;
yading@10 143
yading@10 144 if (CONFIG_DSPUTIL)
yading@10 145 ff_dsputil_static_init();
yading@10 146 }
yading@10 147
yading@10 148 int av_codec_is_encoder(const AVCodec *codec)
yading@10 149 {
yading@10 150 return codec && (codec->encode_sub || codec->encode2);
yading@10 151 }
yading@10 152
yading@10 153 int av_codec_is_decoder(const AVCodec *codec)
yading@10 154 {
yading@10 155 return codec && codec->decode;
yading@10 156 }
yading@10 157
yading@10 158 void avcodec_register(AVCodec *codec)
yading@10 159 {
yading@10 160 AVCodec **p;
yading@10 161 avcodec_init();
yading@10 162 p = &first_avcodec;
yading@10 163 while (*p != NULL)
yading@10 164 p = &(*p)->next;
yading@10 165 *p = codec;
yading@10 166 codec->next = NULL;
yading@10 167
yading@10 168 if (codec->init_static_data)
yading@10 169 codec->init_static_data(codec);
yading@10 170 }
yading@10 171
yading@10 172 unsigned avcodec_get_edge_width(void)
yading@10 173 {
yading@10 174 return EDGE_WIDTH;
yading@10 175 }
yading@10 176
yading@10 177 void avcodec_set_dimensions(AVCodecContext *s, int width, int height)
yading@10 178 {
yading@10 179 s->coded_width = width;
yading@10 180 s->coded_height = height;
yading@10 181 s->width = -((-width ) >> s->lowres);
yading@10 182 s->height = -((-height) >> s->lowres);
yading@10 183 }
yading@10 184
yading@10 185 #if (ARCH_ARM && HAVE_NEON) || ARCH_PPC || HAVE_MMX
yading@10 186 # define STRIDE_ALIGN 16
yading@10 187 #else
yading@10 188 # define STRIDE_ALIGN 8
yading@10 189 #endif
yading@10 190
yading@10 191 void avcodec_align_dimensions2(AVCodecContext *s, int *width, int *height,
yading@10 192 int linesize_align[AV_NUM_DATA_POINTERS])
yading@10 193 {
yading@10 194 int i;
yading@10 195 int w_align = 1;
yading@10 196 int h_align = 1;
yading@10 197
yading@10 198 switch (s->pix_fmt) {
yading@10 199 case AV_PIX_FMT_YUV420P:
yading@10 200 case AV_PIX_FMT_YUYV422:
yading@10 201 case AV_PIX_FMT_UYVY422:
yading@10 202 case AV_PIX_FMT_YUV422P:
yading@10 203 case AV_PIX_FMT_YUV440P:
yading@10 204 case AV_PIX_FMT_YUV444P:
yading@10 205 case AV_PIX_FMT_GBRP:
yading@10 206 case AV_PIX_FMT_GRAY8:
yading@10 207 case AV_PIX_FMT_GRAY16BE:
yading@10 208 case AV_PIX_FMT_GRAY16LE:
yading@10 209 case AV_PIX_FMT_YUVJ420P:
yading@10 210 case AV_PIX_FMT_YUVJ422P:
yading@10 211 case AV_PIX_FMT_YUVJ440P:
yading@10 212 case AV_PIX_FMT_YUVJ444P:
yading@10 213 case AV_PIX_FMT_YUVA420P:
yading@10 214 case AV_PIX_FMT_YUVA422P:
yading@10 215 case AV_PIX_FMT_YUVA444P:
yading@10 216 case AV_PIX_FMT_YUV420P9LE:
yading@10 217 case AV_PIX_FMT_YUV420P9BE:
yading@10 218 case AV_PIX_FMT_YUV420P10LE:
yading@10 219 case AV_PIX_FMT_YUV420P10BE:
yading@10 220 case AV_PIX_FMT_YUV420P12LE:
yading@10 221 case AV_PIX_FMT_YUV420P12BE:
yading@10 222 case AV_PIX_FMT_YUV420P14LE:
yading@10 223 case AV_PIX_FMT_YUV420P14BE:
yading@10 224 case AV_PIX_FMT_YUV422P9LE:
yading@10 225 case AV_PIX_FMT_YUV422P9BE:
yading@10 226 case AV_PIX_FMT_YUV422P10LE:
yading@10 227 case AV_PIX_FMT_YUV422P10BE:
yading@10 228 case AV_PIX_FMT_YUV422P12LE:
yading@10 229 case AV_PIX_FMT_YUV422P12BE:
yading@10 230 case AV_PIX_FMT_YUV422P14LE:
yading@10 231 case AV_PIX_FMT_YUV422P14BE:
yading@10 232 case AV_PIX_FMT_YUV444P9LE:
yading@10 233 case AV_PIX_FMT_YUV444P9BE:
yading@10 234 case AV_PIX_FMT_YUV444P10LE:
yading@10 235 case AV_PIX_FMT_YUV444P10BE:
yading@10 236 case AV_PIX_FMT_YUV444P12LE:
yading@10 237 case AV_PIX_FMT_YUV444P12BE:
yading@10 238 case AV_PIX_FMT_YUV444P14LE:
yading@10 239 case AV_PIX_FMT_YUV444P14BE:
yading@10 240 case AV_PIX_FMT_GBRP9LE:
yading@10 241 case AV_PIX_FMT_GBRP9BE:
yading@10 242 case AV_PIX_FMT_GBRP10LE:
yading@10 243 case AV_PIX_FMT_GBRP10BE:
yading@10 244 case AV_PIX_FMT_GBRP12LE:
yading@10 245 case AV_PIX_FMT_GBRP12BE:
yading@10 246 case AV_PIX_FMT_GBRP14LE:
yading@10 247 case AV_PIX_FMT_GBRP14BE:
yading@10 248 w_align = 16; //FIXME assume 16 pixel per macroblock
yading@10 249 h_align = 16 * 2; // interlaced needs 2 macroblocks height
yading@10 250 break;
yading@10 251 case AV_PIX_FMT_YUV411P:
yading@10 252 case AV_PIX_FMT_UYYVYY411:
yading@10 253 w_align = 32;
yading@10 254 h_align = 8;
yading@10 255 break;
yading@10 256 case AV_PIX_FMT_YUV410P:
yading@10 257 if (s->codec_id == AV_CODEC_ID_SVQ1) {
yading@10 258 w_align = 64;
yading@10 259 h_align = 64;
yading@10 260 }
yading@10 261 break;
yading@10 262 case AV_PIX_FMT_RGB555:
yading@10 263 if (s->codec_id == AV_CODEC_ID_RPZA) {
yading@10 264 w_align = 4;
yading@10 265 h_align = 4;
yading@10 266 }
yading@10 267 break;
yading@10 268 case AV_PIX_FMT_PAL8:
yading@10 269 case AV_PIX_FMT_BGR8:
yading@10 270 case AV_PIX_FMT_RGB8:
yading@10 271 if (s->codec_id == AV_CODEC_ID_SMC ||
yading@10 272 s->codec_id == AV_CODEC_ID_CINEPAK) {
yading@10 273 w_align = 4;
yading@10 274 h_align = 4;
yading@10 275 }
yading@10 276 break;
yading@10 277 case AV_PIX_FMT_BGR24:
yading@10 278 if ((s->codec_id == AV_CODEC_ID_MSZH) ||
yading@10 279 (s->codec_id == AV_CODEC_ID_ZLIB)) {
yading@10 280 w_align = 4;
yading@10 281 h_align = 4;
yading@10 282 }
yading@10 283 break;
yading@10 284 case AV_PIX_FMT_RGB24:
yading@10 285 if (s->codec_id == AV_CODEC_ID_CINEPAK) {
yading@10 286 w_align = 4;
yading@10 287 h_align = 4;
yading@10 288 }
yading@10 289 break;
yading@10 290 default:
yading@10 291 w_align = 1;
yading@10 292 h_align = 1;
yading@10 293 break;
yading@10 294 }
yading@10 295
yading@10 296 if (s->codec_id == AV_CODEC_ID_IFF_ILBM || s->codec_id == AV_CODEC_ID_IFF_BYTERUN1) {
yading@10 297 w_align = FFMAX(w_align, 8);
yading@10 298 }
yading@10 299
yading@10 300 *width = FFALIGN(*width, w_align);
yading@10 301 *height = FFALIGN(*height, h_align);
yading@10 302 if (s->codec_id == AV_CODEC_ID_H264 || s->lowres)
yading@10 303 // some of the optimized chroma MC reads one line too much
yading@10 304 // which is also done in mpeg decoders with lowres > 0
yading@10 305 *height += 2;
yading@10 306
yading@10 307 for (i = 0; i < 4; i++)
yading@10 308 linesize_align[i] = STRIDE_ALIGN;
yading@10 309 }
yading@10 310
yading@10 311 void avcodec_align_dimensions(AVCodecContext *s, int *width, int *height)
yading@10 312 {
yading@10 313 const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(s->pix_fmt);
yading@10 314 int chroma_shift = desc->log2_chroma_w;
yading@10 315 int linesize_align[AV_NUM_DATA_POINTERS];
yading@10 316 int align;
yading@10 317
yading@10 318 avcodec_align_dimensions2(s, width, height, linesize_align);
yading@10 319 align = FFMAX(linesize_align[0], linesize_align[3]);
yading@10 320 linesize_align[1] <<= chroma_shift;
yading@10 321 linesize_align[2] <<= chroma_shift;
yading@10 322 align = FFMAX3(align, linesize_align[1], linesize_align[2]);
yading@10 323 *width = FFALIGN(*width, align);
yading@10 324 }
yading@10 325
yading@10 326 int avcodec_fill_audio_frame(AVFrame *frame, int nb_channels,
yading@10 327 enum AVSampleFormat sample_fmt, const uint8_t *buf,
yading@10 328 int buf_size, int align)
yading@10 329 {
yading@10 330 int ch, planar, needed_size, ret = 0;
yading@10 331
yading@10 332 needed_size = av_samples_get_buffer_size(NULL, nb_channels,
yading@10 333 frame->nb_samples, sample_fmt,
yading@10 334 align);
yading@10 335 if (buf_size < needed_size)
yading@10 336 return AVERROR(EINVAL);
yading@10 337
yading@10 338 planar = av_sample_fmt_is_planar(sample_fmt);
yading@10 339 if (planar && nb_channels > AV_NUM_DATA_POINTERS) {
yading@10 340 if (!(frame->extended_data = av_mallocz(nb_channels *
yading@10 341 sizeof(*frame->extended_data))))
yading@10 342 return AVERROR(ENOMEM);
yading@10 343 } else {
yading@10 344 frame->extended_data = frame->data;
yading@10 345 }
yading@10 346
yading@10 347 if ((ret = av_samples_fill_arrays(frame->extended_data, &frame->linesize[0],
yading@10 348 (uint8_t *)(intptr_t)buf, nb_channels, frame->nb_samples,
yading@10 349 sample_fmt, align)) < 0) {
yading@10 350 if (frame->extended_data != frame->data)
yading@10 351 av_freep(&frame->extended_data);
yading@10 352 return ret;
yading@10 353 }
yading@10 354 if (frame->extended_data != frame->data) {
yading@10 355 for (ch = 0; ch < AV_NUM_DATA_POINTERS; ch++)
yading@10 356 frame->data[ch] = frame->extended_data[ch];
yading@10 357 }
yading@10 358
yading@10 359 return ret;
yading@10 360 }
yading@10 361
yading@10 362 static int update_frame_pool(AVCodecContext *avctx, AVFrame *frame)
yading@10 363 {
yading@10 364 FramePool *pool = avctx->internal->pool;
yading@10 365 int i, ret;
yading@10 366
yading@10 367 switch (avctx->codec_type) {
yading@10 368 case AVMEDIA_TYPE_VIDEO: {
yading@10 369 AVPicture picture;
yading@10 370 int size[4] = { 0 };
yading@10 371 int w = frame->width;
yading@10 372 int h = frame->height;
yading@10 373 int tmpsize, unaligned;
yading@10 374
yading@10 375 if (pool->format == frame->format &&
yading@10 376 pool->width == frame->width && pool->height == frame->height)
yading@10 377 return 0;
yading@10 378
yading@10 379 avcodec_align_dimensions2(avctx, &w, &h, pool->stride_align);
yading@10 380
yading@10 381 if (!(avctx->flags & CODEC_FLAG_EMU_EDGE)) {
yading@10 382 w += EDGE_WIDTH * 2;
yading@10 383 h += EDGE_WIDTH * 2;
yading@10 384 }
yading@10 385
yading@10 386 do {
yading@10 387 // NOTE: do not align linesizes individually, this breaks e.g. assumptions
yading@10 388 // that linesize[0] == 2*linesize[1] in the MPEG-encoder for 4:2:2
yading@10 389 av_image_fill_linesizes(picture.linesize, avctx->pix_fmt, w);
yading@10 390 // increase alignment of w for next try (rhs gives the lowest bit set in w)
yading@10 391 w += w & ~(w - 1);
yading@10 392
yading@10 393 unaligned = 0;
yading@10 394 for (i = 0; i < 4; i++)
yading@10 395 unaligned |= picture.linesize[i] % pool->stride_align[i];
yading@10 396 } while (unaligned);
yading@10 397
yading@10 398 tmpsize = av_image_fill_pointers(picture.data, avctx->pix_fmt, h,
yading@10 399 NULL, picture.linesize);
yading@10 400 if (tmpsize < 0)
yading@10 401 return -1;
yading@10 402
yading@10 403 for (i = 0; i < 3 && picture.data[i + 1]; i++)
yading@10 404 size[i] = picture.data[i + 1] - picture.data[i];
yading@10 405 size[i] = tmpsize - (picture.data[i] - picture.data[0]);
yading@10 406
yading@10 407 for (i = 0; i < 4; i++) {
yading@10 408 av_buffer_pool_uninit(&pool->pools[i]);
yading@10 409 pool->linesize[i] = picture.linesize[i];
yading@10 410 if (size[i]) {
yading@10 411 pool->pools[i] = av_buffer_pool_init(size[i] + 16,
yading@10 412 CONFIG_MEMORY_POISONING ?
yading@10 413 NULL :
yading@10 414 av_buffer_allocz);
yading@10 415 if (!pool->pools[i]) {
yading@10 416 ret = AVERROR(ENOMEM);
yading@10 417 goto fail;
yading@10 418 }
yading@10 419 }
yading@10 420 }
yading@10 421 pool->format = frame->format;
yading@10 422 pool->width = frame->width;
yading@10 423 pool->height = frame->height;
yading@10 424
yading@10 425 break;
yading@10 426 }
yading@10 427 case AVMEDIA_TYPE_AUDIO: {
yading@10 428 int ch = av_frame_get_channels(frame); //av_get_channel_layout_nb_channels(frame->channel_layout);
yading@10 429 int planar = av_sample_fmt_is_planar(frame->format);
yading@10 430 int planes = planar ? ch : 1;
yading@10 431
yading@10 432 if (pool->format == frame->format && pool->planes == planes &&
yading@10 433 pool->channels == ch && frame->nb_samples == pool->samples)
yading@10 434 return 0;
yading@10 435
yading@10 436 av_buffer_pool_uninit(&pool->pools[0]);
yading@10 437 ret = av_samples_get_buffer_size(&pool->linesize[0], ch,
yading@10 438 frame->nb_samples, frame->format, 0);
yading@10 439 if (ret < 0)
yading@10 440 goto fail;
yading@10 441
yading@10 442 pool->pools[0] = av_buffer_pool_init(pool->linesize[0], NULL);
yading@10 443 if (!pool->pools[0]) {
yading@10 444 ret = AVERROR(ENOMEM);
yading@10 445 goto fail;
yading@10 446 }
yading@10 447
yading@10 448 pool->format = frame->format;
yading@10 449 pool->planes = planes;
yading@10 450 pool->channels = ch;
yading@10 451 pool->samples = frame->nb_samples;
yading@10 452 break;
yading@10 453 }
yading@10 454 default: av_assert0(0);
yading@10 455 }
yading@10 456 return 0;
yading@10 457 fail:
yading@10 458 for (i = 0; i < 4; i++)
yading@10 459 av_buffer_pool_uninit(&pool->pools[i]);
yading@10 460 pool->format = -1;
yading@10 461 pool->planes = pool->channels = pool->samples = 0;
yading@10 462 pool->width = pool->height = 0;
yading@10 463 return ret;
yading@10 464 }
yading@10 465
yading@10 466 static int audio_get_buffer(AVCodecContext *avctx, AVFrame *frame)
yading@10 467 {
yading@10 468 FramePool *pool = avctx->internal->pool;
yading@10 469 int planes = pool->planes;
yading@10 470 int i;
yading@10 471
yading@10 472 frame->linesize[0] = pool->linesize[0];
yading@10 473
yading@10 474 if (planes > AV_NUM_DATA_POINTERS) {
yading@10 475 frame->extended_data = av_mallocz(planes * sizeof(*frame->extended_data));
yading@10 476 frame->nb_extended_buf = planes - AV_NUM_DATA_POINTERS;
yading@10 477 frame->extended_buf = av_mallocz(frame->nb_extended_buf *
yading@10 478 sizeof(*frame->extended_buf));
yading@10 479 if (!frame->extended_data || !frame->extended_buf) {
yading@10 480 av_freep(&frame->extended_data);
yading@10 481 av_freep(&frame->extended_buf);
yading@10 482 return AVERROR(ENOMEM);
yading@10 483 }
yading@10 484 } else {
yading@10 485 frame->extended_data = frame->data;
yading@10 486 av_assert0(frame->nb_extended_buf == 0);
yading@10 487 }
yading@10 488
yading@10 489 for (i = 0; i < FFMIN(planes, AV_NUM_DATA_POINTERS); i++) {
yading@10 490 frame->buf[i] = av_buffer_pool_get(pool->pools[0]);
yading@10 491 if (!frame->buf[i])
yading@10 492 goto fail;
yading@10 493 frame->extended_data[i] = frame->data[i] = frame->buf[i]->data;
yading@10 494 }
yading@10 495 for (i = 0; i < frame->nb_extended_buf; i++) {
yading@10 496 frame->extended_buf[i] = av_buffer_pool_get(pool->pools[0]);
yading@10 497 if (!frame->extended_buf[i])
yading@10 498 goto fail;
yading@10 499 frame->extended_data[i + AV_NUM_DATA_POINTERS] = frame->extended_buf[i]->data;
yading@10 500 }
yading@10 501
yading@10 502 if (avctx->debug & FF_DEBUG_BUFFERS)
yading@10 503 av_log(avctx, AV_LOG_DEBUG, "default_get_buffer called on frame %p", frame);
yading@10 504
yading@10 505 return 0;
yading@10 506 fail:
yading@10 507 av_frame_unref(frame);
yading@10 508 return AVERROR(ENOMEM);
yading@10 509 }
yading@10 510
yading@10 511 static int video_get_buffer(AVCodecContext *s, AVFrame *pic)
yading@10 512 {
yading@10 513 FramePool *pool = s->internal->pool;
yading@10 514 const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(pic->format);
yading@10 515 int pixel_size = desc->comp[0].step_minus1 + 1;
yading@10 516 int h_chroma_shift, v_chroma_shift;
yading@10 517 int i;
yading@10 518
yading@10 519 if (pic->data[0] != NULL) {
yading@10 520 av_log(s, AV_LOG_ERROR, "pic->data[0]!=NULL in avcodec_default_get_buffer\n");
yading@10 521 return -1;
yading@10 522 }
yading@10 523
yading@10 524 memset(pic->data, 0, sizeof(pic->data));
yading@10 525 pic->extended_data = pic->data;
yading@10 526
yading@10 527 av_pix_fmt_get_chroma_sub_sample(s->pix_fmt, &h_chroma_shift, &v_chroma_shift);
yading@10 528
yading@10 529 for (i = 0; i < 4 && pool->pools[i]; i++) {
yading@10 530 const int h_shift = i == 0 ? 0 : h_chroma_shift;
yading@10 531 const int v_shift = i == 0 ? 0 : v_chroma_shift;
yading@10 532
yading@10 533 pic->linesize[i] = pool->linesize[i];
yading@10 534
yading@10 535 pic->buf[i] = av_buffer_pool_get(pool->pools[i]);
yading@10 536 if (!pic->buf[i])
yading@10 537 goto fail;
yading@10 538
yading@10 539 // no edge if EDGE EMU or not planar YUV
yading@10 540 if ((s->flags & CODEC_FLAG_EMU_EDGE) || !pool->pools[2])
yading@10 541 pic->data[i] = pic->buf[i]->data;
yading@10 542 else {
yading@10 543 pic->data[i] = pic->buf[i]->data +
yading@10 544 FFALIGN((pic->linesize[i] * EDGE_WIDTH >> v_shift) +
yading@10 545 (pixel_size * EDGE_WIDTH >> h_shift), pool->stride_align[i]);
yading@10 546 }
yading@10 547 }
yading@10 548 for (; i < AV_NUM_DATA_POINTERS; i++) {
yading@10 549 pic->data[i] = NULL;
yading@10 550 pic->linesize[i] = 0;
yading@10 551 }
yading@10 552 if (pic->data[1] && !pic->data[2])
yading@10 553 avpriv_set_systematic_pal2((uint32_t *)pic->data[1], s->pix_fmt);
yading@10 554
yading@10 555 if (s->debug & FF_DEBUG_BUFFERS)
yading@10 556 av_log(s, AV_LOG_DEBUG, "default_get_buffer called on pic %p\n", pic);
yading@10 557
yading@10 558 return 0;
yading@10 559 fail:
yading@10 560 av_frame_unref(pic);
yading@10 561 return AVERROR(ENOMEM);
yading@10 562 }
yading@10 563
yading@10 564 void avpriv_color_frame(AVFrame *frame, const int c[4])
yading@10 565 {
yading@10 566 const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(frame->format);
yading@10 567 int p, y, x;
yading@10 568
yading@10 569 av_assert0(desc->flags & PIX_FMT_PLANAR);
yading@10 570
yading@10 571 for (p = 0; p<desc->nb_components; p++) {
yading@10 572 uint8_t *dst = frame->data[p];
yading@10 573 int is_chroma = p == 1 || p == 2;
yading@10 574 int bytes = -((-frame->width) >> (is_chroma ? desc->log2_chroma_w : 0));
yading@10 575 for (y = 0; y<-((-frame->height) >> (is_chroma ? desc->log2_chroma_h : 0)); y++){
yading@10 576 if (desc->comp[0].depth_minus1 >= 8) {
yading@10 577 for (x = 0; x<bytes; x++)
yading@10 578 ((uint16_t*)dst)[x] = c[p];
yading@10 579 }else
yading@10 580 memset(dst, c[p], bytes);
yading@10 581 dst += frame->linesize[p];
yading@10 582 }
yading@10 583 }
yading@10 584 }
yading@10 585
yading@10 586 int avcodec_default_get_buffer2(AVCodecContext *avctx, AVFrame *frame, int flags)
yading@10 587 {
yading@10 588 int ret;
yading@10 589
yading@10 590 if ((ret = update_frame_pool(avctx, frame)) < 0)
yading@10 591 return ret;
yading@10 592
yading@10 593 #if FF_API_GET_BUFFER
yading@10 594 frame->type = FF_BUFFER_TYPE_INTERNAL;
yading@10 595 #endif
yading@10 596
yading@10 597 switch (avctx->codec_type) {
yading@10 598 case AVMEDIA_TYPE_VIDEO:
yading@10 599 return video_get_buffer(avctx, frame);
yading@10 600 case AVMEDIA_TYPE_AUDIO:
yading@10 601 return audio_get_buffer(avctx, frame);
yading@10 602 default:
yading@10 603 return -1;
yading@10 604 }
yading@10 605 }
yading@10 606
yading@10 607 int ff_init_buffer_info(AVCodecContext *avctx, AVFrame *frame)
yading@10 608 {
yading@10 609 if (avctx->pkt) {
yading@10 610 frame->pkt_pts = avctx->pkt->pts;
yading@10 611 av_frame_set_pkt_pos (frame, avctx->pkt->pos);
yading@10 612 av_frame_set_pkt_duration(frame, avctx->pkt->duration);
yading@10 613 av_frame_set_pkt_size (frame, avctx->pkt->size);
yading@10 614 } else {
yading@10 615 frame->pkt_pts = AV_NOPTS_VALUE;
yading@10 616 av_frame_set_pkt_pos (frame, -1);
yading@10 617 av_frame_set_pkt_duration(frame, 0);
yading@10 618 av_frame_set_pkt_size (frame, -1);
yading@10 619 }
yading@10 620 frame->reordered_opaque = avctx->reordered_opaque;
yading@10 621
yading@10 622 switch (avctx->codec->type) {
yading@10 623 case AVMEDIA_TYPE_VIDEO:
yading@10 624 frame->width = FFMAX(avctx->width , -((-avctx->coded_width )>>avctx->lowres));
yading@10 625 frame->height = FFMAX(avctx->height, -((-avctx->coded_height)>>avctx->lowres));
yading@10 626 if (frame->format < 0)
yading@10 627 frame->format = avctx->pix_fmt;
yading@10 628 if (!frame->sample_aspect_ratio.num)
yading@10 629 frame->sample_aspect_ratio = avctx->sample_aspect_ratio;
yading@10 630 break;
yading@10 631 case AVMEDIA_TYPE_AUDIO:
yading@10 632 if (!frame->sample_rate)
yading@10 633 frame->sample_rate = avctx->sample_rate;
yading@10 634 if (frame->format < 0)
yading@10 635 frame->format = avctx->sample_fmt;
yading@10 636 if (!frame->channel_layout) {
yading@10 637 if (avctx->channel_layout) {
yading@10 638 if (av_get_channel_layout_nb_channels(avctx->channel_layout) !=
yading@10 639 avctx->channels) {
yading@10 640 av_log(avctx, AV_LOG_ERROR, "Inconsistent channel "
yading@10 641 "configuration.\n");
yading@10 642 return AVERROR(EINVAL);
yading@10 643 }
yading@10 644
yading@10 645 frame->channel_layout = avctx->channel_layout;
yading@10 646 } else {
yading@10 647 if (avctx->channels > FF_SANE_NB_CHANNELS) {
yading@10 648 av_log(avctx, AV_LOG_ERROR, "Too many channels: %d.\n",
yading@10 649 avctx->channels);
yading@10 650 return AVERROR(ENOSYS);
yading@10 651 }
yading@10 652 }
yading@10 653 }
yading@10 654 av_frame_set_channels(frame, avctx->channels);
yading@10 655 break;
yading@10 656 }
yading@10 657 return 0;
yading@10 658 }
yading@10 659
yading@10 660 #if FF_API_GET_BUFFER
yading@10 661 int avcodec_default_get_buffer(AVCodecContext *avctx, AVFrame *frame)
yading@10 662 {
yading@10 663 return avcodec_default_get_buffer2(avctx, frame, 0);
yading@10 664 }
yading@10 665
yading@10 666 typedef struct CompatReleaseBufPriv {
yading@10 667 AVCodecContext avctx;
yading@10 668 AVFrame frame;
yading@10 669 } CompatReleaseBufPriv;
yading@10 670
yading@10 671 static void compat_free_buffer(void *opaque, uint8_t *data)
yading@10 672 {
yading@10 673 CompatReleaseBufPriv *priv = opaque;
yading@10 674 if (priv->avctx.release_buffer)
yading@10 675 priv->avctx.release_buffer(&priv->avctx, &priv->frame);
yading@10 676 av_freep(&priv);
yading@10 677 }
yading@10 678
yading@10 679 static void compat_release_buffer(void *opaque, uint8_t *data)
yading@10 680 {
yading@10 681 AVBufferRef *buf = opaque;
yading@10 682 av_buffer_unref(&buf);
yading@10 683 }
yading@10 684 #endif
yading@10 685
yading@10 686 static int get_buffer_internal(AVCodecContext *avctx, AVFrame *frame, int flags)
yading@10 687 {
yading@10 688 int ret;
yading@10 689
yading@10 690 if (avctx->codec_type == AVMEDIA_TYPE_VIDEO) {
yading@10 691 if ((ret = av_image_check_size(avctx->width, avctx->height, 0, avctx)) < 0 || avctx->pix_fmt<0) {
yading@10 692 av_log(avctx, AV_LOG_ERROR, "video_get_buffer: image parameters invalid\n");
yading@10 693 return AVERROR(EINVAL);
yading@10 694 }
yading@10 695 }
yading@10 696 if ((ret = ff_init_buffer_info(avctx, frame)) < 0)
yading@10 697 return ret;
yading@10 698
yading@10 699 #if FF_API_GET_BUFFER
yading@10 700 /*
yading@10 701 * Wrap an old get_buffer()-allocated buffer in an bunch of AVBuffers.
yading@10 702 * We wrap each plane in its own AVBuffer. Each of those has a reference to
yading@10 703 * a dummy AVBuffer as its private data, unreffing it on free.
yading@10 704 * When all the planes are freed, the dummy buffer's free callback calls
yading@10 705 * release_buffer().
yading@10 706 */
yading@10 707 if (avctx->get_buffer) {
yading@10 708 CompatReleaseBufPriv *priv = NULL;
yading@10 709 AVBufferRef *dummy_buf = NULL;
yading@10 710 int planes, i, ret;
yading@10 711
yading@10 712 if (flags & AV_GET_BUFFER_FLAG_REF)
yading@10 713 frame->reference = 1;
yading@10 714
yading@10 715 ret = avctx->get_buffer(avctx, frame);
yading@10 716 if (ret < 0)
yading@10 717 return ret;
yading@10 718
yading@10 719 /* return if the buffers are already set up
yading@10 720 * this would happen e.g. when a custom get_buffer() calls
yading@10 721 * avcodec_default_get_buffer
yading@10 722 */
yading@10 723 if (frame->buf[0])
yading@10 724 return 0;
yading@10 725
yading@10 726 priv = av_mallocz(sizeof(*priv));
yading@10 727 if (!priv) {
yading@10 728 ret = AVERROR(ENOMEM);
yading@10 729 goto fail;
yading@10 730 }
yading@10 731 priv->avctx = *avctx;
yading@10 732 priv->frame = *frame;
yading@10 733
yading@10 734 dummy_buf = av_buffer_create(NULL, 0, compat_free_buffer, priv, 0);
yading@10 735 if (!dummy_buf) {
yading@10 736 ret = AVERROR(ENOMEM);
yading@10 737 goto fail;
yading@10 738 }
yading@10 739
yading@10 740 #define WRAP_PLANE(ref_out, data, data_size) \
yading@10 741 do { \
yading@10 742 AVBufferRef *dummy_ref = av_buffer_ref(dummy_buf); \
yading@10 743 if (!dummy_ref) { \
yading@10 744 ret = AVERROR(ENOMEM); \
yading@10 745 goto fail; \
yading@10 746 } \
yading@10 747 ref_out = av_buffer_create(data, data_size, compat_release_buffer, \
yading@10 748 dummy_ref, 0); \
yading@10 749 if (!ref_out) { \
yading@10 750 av_frame_unref(frame); \
yading@10 751 ret = AVERROR(ENOMEM); \
yading@10 752 goto fail; \
yading@10 753 } \
yading@10 754 } while (0)
yading@10 755
yading@10 756 if (avctx->codec_type == AVMEDIA_TYPE_VIDEO) {
yading@10 757 const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(frame->format);
yading@10 758
yading@10 759 planes = av_pix_fmt_count_planes(frame->format);
yading@10 760 /* workaround for AVHWAccel plane count of 0, buf[0] is used as
yading@10 761 check for allocated buffers: make libavcodec happy */
yading@10 762 if (desc && desc->flags & PIX_FMT_HWACCEL)
yading@10 763 planes = 1;
yading@10 764 if (!desc || planes <= 0) {
yading@10 765 ret = AVERROR(EINVAL);
yading@10 766 goto fail;
yading@10 767 }
yading@10 768
yading@10 769 for (i = 0; i < planes; i++) {
yading@10 770 int v_shift = (i == 1 || i == 2) ? desc->log2_chroma_h : 0;
yading@10 771 int plane_size = (frame->height >> v_shift) * frame->linesize[i];
yading@10 772
yading@10 773 WRAP_PLANE(frame->buf[i], frame->data[i], plane_size);
yading@10 774 }
yading@10 775 } else {
yading@10 776 int planar = av_sample_fmt_is_planar(frame->format);
yading@10 777 planes = planar ? avctx->channels : 1;
yading@10 778
yading@10 779 if (planes > FF_ARRAY_ELEMS(frame->buf)) {
yading@10 780 frame->nb_extended_buf = planes - FF_ARRAY_ELEMS(frame->buf);
yading@10 781 frame->extended_buf = av_malloc(sizeof(*frame->extended_buf) *
yading@10 782 frame->nb_extended_buf);
yading@10 783 if (!frame->extended_buf) {
yading@10 784 ret = AVERROR(ENOMEM);
yading@10 785 goto fail;
yading@10 786 }
yading@10 787 }
yading@10 788
yading@10 789 for (i = 0; i < FFMIN(planes, FF_ARRAY_ELEMS(frame->buf)); i++)
yading@10 790 WRAP_PLANE(frame->buf[i], frame->extended_data[i], frame->linesize[0]);
yading@10 791
yading@10 792 for (i = 0; i < frame->nb_extended_buf; i++)
yading@10 793 WRAP_PLANE(frame->extended_buf[i],
yading@10 794 frame->extended_data[i + FF_ARRAY_ELEMS(frame->buf)],
yading@10 795 frame->linesize[0]);
yading@10 796 }
yading@10 797
yading@10 798 av_buffer_unref(&dummy_buf);
yading@10 799
yading@10 800 frame->width = avctx->width;
yading@10 801 frame->height = avctx->height;
yading@10 802
yading@10 803 return 0;
yading@10 804
yading@10 805 fail:
yading@10 806 avctx->release_buffer(avctx, frame);
yading@10 807 av_freep(&priv);
yading@10 808 av_buffer_unref(&dummy_buf);
yading@10 809 return ret;
yading@10 810 }
yading@10 811 #endif
yading@10 812
yading@10 813 ret = avctx->get_buffer2(avctx, frame, flags);
yading@10 814
yading@10 815 if (avctx->codec_type == AVMEDIA_TYPE_VIDEO) {
yading@10 816 frame->width = avctx->width;
yading@10 817 frame->height = avctx->height;
yading@10 818 }
yading@10 819
yading@10 820 return ret;
yading@10 821 }
yading@10 822
yading@10 823 int ff_get_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
yading@10 824 {
yading@10 825 int ret = get_buffer_internal(avctx, frame, flags);
yading@10 826 if (ret < 0)
yading@10 827 av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
yading@10 828 return ret;
yading@10 829 }
yading@10 830
yading@10 831 static int reget_buffer_internal(AVCodecContext *avctx, AVFrame *frame)
yading@10 832 {
yading@10 833 AVFrame tmp;
yading@10 834 int ret;
yading@10 835
yading@10 836 av_assert0(avctx->codec_type == AVMEDIA_TYPE_VIDEO);
yading@10 837
yading@10 838 if (frame->data[0] && (frame->width != avctx->width || frame->height != avctx->height || frame->format != avctx->pix_fmt)) {
yading@10 839 av_log(avctx, AV_LOG_WARNING, "Picture changed from size:%dx%d fmt:%s to size:%dx%d fmt:%s in reget buffer()\n",
yading@10 840 frame->width, frame->height, av_get_pix_fmt_name(frame->format), avctx->width, avctx->height, av_get_pix_fmt_name(avctx->pix_fmt));
yading@10 841 av_frame_unref(frame);
yading@10 842 }
yading@10 843
yading@10 844 ff_init_buffer_info(avctx, frame);
yading@10 845
yading@10 846 if (!frame->data[0])
yading@10 847 return ff_get_buffer(avctx, frame, AV_GET_BUFFER_FLAG_REF);
yading@10 848
yading@10 849 if (av_frame_is_writable(frame))
yading@10 850 return 0;
yading@10 851
yading@10 852 av_frame_move_ref(&tmp, frame);
yading@10 853
yading@10 854 ret = ff_get_buffer(avctx, frame, AV_GET_BUFFER_FLAG_REF);
yading@10 855 if (ret < 0) {
yading@10 856 av_frame_unref(&tmp);
yading@10 857 return ret;
yading@10 858 }
yading@10 859
yading@10 860 av_image_copy(frame->data, frame->linesize, tmp.data, tmp.linesize,
yading@10 861 frame->format, frame->width, frame->height);
yading@10 862
yading@10 863 av_frame_unref(&tmp);
yading@10 864
yading@10 865 return 0;
yading@10 866 }
yading@10 867
yading@10 868 int ff_reget_buffer(AVCodecContext *avctx, AVFrame *frame)
yading@10 869 {
yading@10 870 int ret = reget_buffer_internal(avctx, frame);
yading@10 871 if (ret < 0)
yading@10 872 av_log(avctx, AV_LOG_ERROR, "reget_buffer() failed\n");
yading@10 873 return ret;
yading@10 874 }
yading@10 875
yading@10 876 #if FF_API_GET_BUFFER
yading@10 877 void avcodec_default_release_buffer(AVCodecContext *s, AVFrame *pic)
yading@10 878 {
yading@10 879 av_assert0(s->codec_type == AVMEDIA_TYPE_VIDEO);
yading@10 880
yading@10 881 av_frame_unref(pic);
yading@10 882 }
yading@10 883
yading@10 884 int avcodec_default_reget_buffer(AVCodecContext *s, AVFrame *pic)
yading@10 885 {
yading@10 886 av_assert0(0);
yading@10 887 }
yading@10 888 #endif
yading@10 889
yading@10 890 int avcodec_default_execute(AVCodecContext *c, int (*func)(AVCodecContext *c2, void *arg2), void *arg, int *ret, int count, int size)
yading@10 891 {
yading@10 892 int i;
yading@10 893
yading@10 894 for (i = 0; i < count; i++) {
yading@10 895 int r = func(c, (char *)arg + i * size);
yading@10 896 if (ret)
yading@10 897 ret[i] = r;
yading@10 898 }
yading@10 899 return 0;
yading@10 900 }
yading@10 901
yading@10 902 int avcodec_default_execute2(AVCodecContext *c, int (*func)(AVCodecContext *c2, void *arg2, int jobnr, int threadnr), void *arg, int *ret, int count)
yading@10 903 {
yading@10 904 int i;
yading@10 905
yading@10 906 for (i = 0; i < count; i++) {
yading@10 907 int r = func(c, arg, i, 0);
yading@10 908 if (ret)
yading@10 909 ret[i] = r;
yading@10 910 }
yading@10 911 return 0;
yading@10 912 }
yading@10 913
yading@10 914 static int is_hwaccel_pix_fmt(enum AVPixelFormat pix_fmt)
yading@10 915 {
yading@10 916 const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(pix_fmt);
yading@10 917 return desc->flags & PIX_FMT_HWACCEL;
yading@10 918 }
yading@10 919
yading@10 920 enum AVPixelFormat avcodec_default_get_format(struct AVCodecContext *s, const enum AVPixelFormat *fmt)
yading@10 921 {
yading@10 922 while (*fmt != AV_PIX_FMT_NONE && is_hwaccel_pix_fmt(*fmt))
yading@10 923 ++fmt;
yading@10 924 return fmt[0];
yading@10 925 }
yading@10 926
yading@10 927 void avcodec_get_frame_defaults(AVFrame *frame)
yading@10 928 {
yading@10 929 #if LIBAVCODEC_VERSION_MAJOR >= 55
yading@10 930 // extended_data should explicitly be freed when needed, this code is unsafe currently
yading@10 931 // also this is not compatible to the <55 ABI/API
yading@10 932 if (frame->extended_data != frame->data && 0)
yading@10 933 av_freep(&frame->extended_data);
yading@10 934 #endif
yading@10 935
yading@10 936 memset(frame, 0, sizeof(AVFrame));
yading@10 937
yading@10 938 frame->pts =
yading@10 939 frame->pkt_dts =
yading@10 940 frame->pkt_pts = AV_NOPTS_VALUE;
yading@10 941 av_frame_set_best_effort_timestamp(frame, AV_NOPTS_VALUE);
yading@10 942 av_frame_set_pkt_duration (frame, 0);
yading@10 943 av_frame_set_pkt_pos (frame, -1);
yading@10 944 av_frame_set_pkt_size (frame, -1);
yading@10 945 frame->key_frame = 1;
yading@10 946 frame->sample_aspect_ratio = (AVRational) {0, 1 };
yading@10 947 frame->format = -1; /* unknown */
yading@10 948 frame->extended_data = frame->data;
yading@10 949 }
yading@10 950
yading@10 951 AVFrame *avcodec_alloc_frame(void)
yading@10 952 {
yading@10 953 AVFrame *frame = av_malloc(sizeof(AVFrame));
yading@10 954
yading@10 955 if (frame == NULL)
yading@10 956 return NULL;
yading@10 957
yading@10 958 frame->extended_data = NULL;
yading@10 959 avcodec_get_frame_defaults(frame);
yading@10 960
yading@10 961 return frame;
yading@10 962 }
yading@10 963
yading@10 964 void avcodec_free_frame(AVFrame **frame)
yading@10 965 {
yading@10 966 AVFrame *f;
yading@10 967
yading@10 968 if (!frame || !*frame)
yading@10 969 return;
yading@10 970
yading@10 971 f = *frame;
yading@10 972
yading@10 973 if (f->extended_data != f->data)
yading@10 974 av_freep(&f->extended_data);
yading@10 975
yading@10 976 av_freep(frame);
yading@10 977 }
yading@10 978
yading@10 979 #define MAKE_ACCESSORS(str, name, type, field) \
yading@10 980 type av_##name##_get_##field(const str *s) { return s->field; } \
yading@10 981 void av_##name##_set_##field(str *s, type v) { s->field = v; }
yading@10 982
yading@10 983 MAKE_ACCESSORS(AVCodecContext, codec, AVRational, pkt_timebase)
yading@10 984 MAKE_ACCESSORS(AVCodecContext, codec, const AVCodecDescriptor *, codec_descriptor)
yading@10 985
yading@10 986 static void avcodec_get_subtitle_defaults(AVSubtitle *sub)
yading@10 987 {
yading@10 988 memset(sub, 0, sizeof(*sub));
yading@10 989 sub->pts = AV_NOPTS_VALUE;
yading@10 990 }
yading@10 991
yading@10 992 static int get_bit_rate(AVCodecContext *ctx)
yading@10 993 {
yading@10 994 int bit_rate;
yading@10 995 int bits_per_sample;
yading@10 996
yading@10 997 switch (ctx->codec_type) {
yading@10 998 case AVMEDIA_TYPE_VIDEO:
yading@10 999 case AVMEDIA_TYPE_DATA:
yading@10 1000 case AVMEDIA_TYPE_SUBTITLE:
yading@10 1001 case AVMEDIA_TYPE_ATTACHMENT:
yading@10 1002 bit_rate = ctx->bit_rate;
yading@10 1003 break;
yading@10 1004 case AVMEDIA_TYPE_AUDIO:
yading@10 1005 bits_per_sample = av_get_bits_per_sample(ctx->codec_id);
yading@10 1006 bit_rate = bits_per_sample ? ctx->sample_rate * ctx->channels * bits_per_sample : ctx->bit_rate;
yading@10 1007 break;
yading@10 1008 default:
yading@10 1009 bit_rate = 0;
yading@10 1010 break;
yading@10 1011 }
yading@10 1012 return bit_rate;
yading@10 1013 }
yading@10 1014
yading@10 1015 #if FF_API_AVCODEC_OPEN
yading@10 1016 int attribute_align_arg avcodec_open(AVCodecContext *avctx, AVCodec *codec)
yading@10 1017 {
yading@10 1018 return avcodec_open2(avctx, codec, NULL);
yading@10 1019 }
yading@10 1020 #endif
yading@10 1021
yading@10 1022 int attribute_align_arg ff_codec_open2_recursive(AVCodecContext *avctx, const AVCodec *codec, AVDictionary **options)
yading@10 1023 {
yading@10 1024 int ret = 0;
yading@10 1025
yading@10 1026 ff_unlock_avcodec();
yading@10 1027
yading@10 1028 ret = avcodec_open2(avctx, codec, options);
yading@10 1029
yading@10 1030 ff_lock_avcodec(avctx);
yading@10 1031 return ret;
yading@10 1032 }
yading@10 1033
yading@10 1034 int attribute_align_arg avcodec_open2(AVCodecContext *avctx, const AVCodec *codec, AVDictionary **options)
yading@10 1035 {
yading@10 1036 int ret = 0;
yading@10 1037 AVDictionary *tmp = NULL;
yading@10 1038
yading@10 1039 if (avcodec_is_open(avctx))
yading@10 1040 return 0;
yading@10 1041
yading@10 1042 if ((!codec && !avctx->codec)) {
yading@10 1043 av_log(avctx, AV_LOG_ERROR, "No codec provided to avcodec_open2()\n");
yading@10 1044 return AVERROR(EINVAL);
yading@10 1045 }
yading@10 1046 if ((codec && avctx->codec && codec != avctx->codec)) {
yading@10 1047 av_log(avctx, AV_LOG_ERROR, "This AVCodecContext was allocated for %s, "
yading@10 1048 "but %s passed to avcodec_open2()\n", avctx->codec->name, codec->name);
yading@10 1049 return AVERROR(EINVAL);
yading@10 1050 }
yading@10 1051 if (!codec)
yading@10 1052 codec = avctx->codec;
yading@10 1053
yading@10 1054 if (avctx->extradata_size < 0 || avctx->extradata_size >= FF_MAX_EXTRADATA_SIZE)
yading@10 1055 return AVERROR(EINVAL);
yading@10 1056
yading@10 1057 if (options)
yading@10 1058 av_dict_copy(&tmp, *options, 0);
yading@10 1059
yading@10 1060 ret = ff_lock_avcodec(avctx);
yading@10 1061 if (ret < 0)
yading@10 1062 return ret;
yading@10 1063
yading@10 1064 avctx->internal = av_mallocz(sizeof(AVCodecInternal));
yading@10 1065 if (!avctx->internal) {
yading@10 1066 ret = AVERROR(ENOMEM);
yading@10 1067 goto end;
yading@10 1068 }
yading@10 1069
yading@10 1070 avctx->internal->pool = av_mallocz(sizeof(*avctx->internal->pool));
yading@10 1071 if (!avctx->internal->pool) {
yading@10 1072 ret = AVERROR(ENOMEM);
yading@10 1073 goto free_and_end;
yading@10 1074 }
yading@10 1075
yading@10 1076 if (codec->priv_data_size > 0) {
yading@10 1077 if (!avctx->priv_data) {
yading@10 1078 avctx->priv_data = av_mallocz(codec->priv_data_size);
yading@10 1079 if (!avctx->priv_data) {
yading@10 1080 ret = AVERROR(ENOMEM);
yading@10 1081 goto end;
yading@10 1082 }
yading@10 1083 if (codec->priv_class) {
yading@10 1084 *(const AVClass **)avctx->priv_data = codec->priv_class;
yading@10 1085 av_opt_set_defaults(avctx->priv_data);
yading@10 1086 }
yading@10 1087 }
yading@10 1088 if (codec->priv_class && (ret = av_opt_set_dict(avctx->priv_data, &tmp)) < 0)
yading@10 1089 goto free_and_end;
yading@10 1090 } else {
yading@10 1091 avctx->priv_data = NULL;
yading@10 1092 }
yading@10 1093 if ((ret = av_opt_set_dict(avctx, &tmp)) < 0)
yading@10 1094 goto free_and_end;
yading@10 1095
yading@10 1096 // only call avcodec_set_dimensions() for non H.264/VP6F codecs so as not to overwrite previously setup dimensions
yading@10 1097 if (!(avctx->coded_width && avctx->coded_height && avctx->width && avctx->height &&
yading@10 1098 (avctx->codec_id == AV_CODEC_ID_H264 || avctx->codec_id == AV_CODEC_ID_VP6F))) {
yading@10 1099 if (avctx->coded_width && avctx->coded_height)
yading@10 1100 avcodec_set_dimensions(avctx, avctx->coded_width, avctx->coded_height);
yading@10 1101 else if (avctx->width && avctx->height)
yading@10 1102 avcodec_set_dimensions(avctx, avctx->width, avctx->height);
yading@10 1103 }
yading@10 1104
yading@10 1105 if ((avctx->coded_width || avctx->coded_height || avctx->width || avctx->height)
yading@10 1106 && ( av_image_check_size(avctx->coded_width, avctx->coded_height, 0, avctx) < 0
yading@10 1107 || av_image_check_size(avctx->width, avctx->height, 0, avctx) < 0)) {
yading@10 1108 av_log(avctx, AV_LOG_WARNING, "Ignoring invalid width/height values\n");
yading@10 1109 avcodec_set_dimensions(avctx, 0, 0);
yading@10 1110 }
yading@10 1111
yading@10 1112 /* if the decoder init function was already called previously,
yading@10 1113 * free the already allocated subtitle_header before overwriting it */
yading@10 1114 if (av_codec_is_decoder(codec))
yading@10 1115 av_freep(&avctx->subtitle_header);
yading@10 1116
yading@10 1117 if (avctx->channels > FF_SANE_NB_CHANNELS) {
yading@10 1118 ret = AVERROR(EINVAL);
yading@10 1119 goto free_and_end;
yading@10 1120 }
yading@10 1121
yading@10 1122 avctx->codec = codec;
yading@10 1123 if ((avctx->codec_type == AVMEDIA_TYPE_UNKNOWN || avctx->codec_type == codec->type) &&
yading@10 1124 avctx->codec_id == AV_CODEC_ID_NONE) {
yading@10 1125 avctx->codec_type = codec->type;
yading@10 1126 avctx->codec_id = codec->id;
yading@10 1127 }
yading@10 1128 if (avctx->codec_id != codec->id || (avctx->codec_type != codec->type
yading@10 1129 && avctx->codec_type != AVMEDIA_TYPE_ATTACHMENT)) {
yading@10 1130 av_log(avctx, AV_LOG_ERROR, "Codec type or id mismatches\n");
yading@10 1131 ret = AVERROR(EINVAL);
yading@10 1132 goto free_and_end;
yading@10 1133 }
yading@10 1134 avctx->frame_number = 0;
yading@10 1135 avctx->codec_descriptor = avcodec_descriptor_get(avctx->codec_id);
yading@10 1136
yading@10 1137 if (avctx->codec->capabilities & CODEC_CAP_EXPERIMENTAL &&
yading@10 1138 avctx->strict_std_compliance > FF_COMPLIANCE_EXPERIMENTAL) {
yading@10 1139 const char *codec_string = av_codec_is_encoder(codec) ? "encoder" : "decoder";
yading@10 1140 AVCodec *codec2;
yading@10 1141 av_log(avctx, AV_LOG_ERROR,
yading@10 1142 "The %s '%s' is experimental but experimental codecs are not enabled, "
yading@10 1143 "add '-strict %d' if you want to use it.\n",
yading@10 1144 codec_string, codec->name, FF_COMPLIANCE_EXPERIMENTAL);
yading@10 1145 codec2 = av_codec_is_encoder(codec) ? avcodec_find_encoder(codec->id) : avcodec_find_decoder(codec->id);
yading@10 1146 if (!(codec2->capabilities & CODEC_CAP_EXPERIMENTAL))
yading@10 1147 av_log(avctx, AV_LOG_ERROR, "Alternatively use the non experimental %s '%s'.\n",
yading@10 1148 codec_string, codec2->name);
yading@10 1149 ret = AVERROR_EXPERIMENTAL;
yading@10 1150 goto free_and_end;
yading@10 1151 }
yading@10 1152
yading@10 1153 if (avctx->codec_type == AVMEDIA_TYPE_AUDIO &&
yading@10 1154 (!avctx->time_base.num || !avctx->time_base.den)) {
yading@10 1155 avctx->time_base.num = 1;
yading@10 1156 avctx->time_base.den = avctx->sample_rate;
yading@10 1157 }
yading@10 1158
yading@10 1159 if (!HAVE_THREADS)
yading@10 1160 av_log(avctx, AV_LOG_WARNING, "Warning: not compiled with thread support, using thread emulation\n");
yading@10 1161
yading@10 1162 if (CONFIG_FRAME_THREAD_ENCODER) {
yading@10 1163 ff_unlock_avcodec(); //we will instanciate a few encoders thus kick the counter to prevent false detection of a problem
yading@10 1164 ret = ff_frame_thread_encoder_init(avctx, options ? *options : NULL);
yading@10 1165 ff_lock_avcodec(avctx);
yading@10 1166 if (ret < 0)
yading@10 1167 goto free_and_end;
yading@10 1168 }
yading@10 1169
yading@10 1170 if (HAVE_THREADS && !avctx->thread_opaque
yading@10 1171 && !(avctx->internal->frame_thread_encoder && (avctx->active_thread_type&FF_THREAD_FRAME))) {
yading@10 1172 ret = ff_thread_init(avctx);
yading@10 1173 if (ret < 0) {
yading@10 1174 goto free_and_end;
yading@10 1175 }
yading@10 1176 }
yading@10 1177 if (!HAVE_THREADS && !(codec->capabilities & CODEC_CAP_AUTO_THREADS))
yading@10 1178 avctx->thread_count = 1;
yading@10 1179
yading@10 1180 if (avctx->codec->max_lowres < avctx->lowres || avctx->lowres < 0) {
yading@10 1181 av_log(avctx, AV_LOG_ERROR, "The maximum value for lowres supported by the decoder is %d\n",
yading@10 1182 avctx->codec->max_lowres);
yading@10 1183 ret = AVERROR(EINVAL);
yading@10 1184 goto free_and_end;
yading@10 1185 }
yading@10 1186
yading@10 1187 if (av_codec_is_encoder(avctx->codec)) {
yading@10 1188 int i;
yading@10 1189 if (avctx->codec->sample_fmts) {
yading@10 1190 for (i = 0; avctx->codec->sample_fmts[i] != AV_SAMPLE_FMT_NONE; i++) {
yading@10 1191 if (avctx->sample_fmt == avctx->codec->sample_fmts[i])
yading@10 1192 break;
yading@10 1193 if (avctx->channels == 1 &&
yading@10 1194 av_get_planar_sample_fmt(avctx->sample_fmt) ==
yading@10 1195 av_get_planar_sample_fmt(avctx->codec->sample_fmts[i])) {
yading@10 1196 avctx->sample_fmt = avctx->codec->sample_fmts[i];
yading@10 1197 break;
yading@10 1198 }
yading@10 1199 }
yading@10 1200 if (avctx->codec->sample_fmts[i] == AV_SAMPLE_FMT_NONE) {
yading@10 1201 char buf[128];
yading@10 1202 snprintf(buf, sizeof(buf), "%d", avctx->sample_fmt);
yading@10 1203 av_log(avctx, AV_LOG_ERROR, "Specified sample format %s is invalid or not supported\n",
yading@10 1204 (char *)av_x_if_null(av_get_sample_fmt_name(avctx->sample_fmt), buf));
yading@10 1205 ret = AVERROR(EINVAL);
yading@10 1206 goto free_and_end;
yading@10 1207 }
yading@10 1208 }
yading@10 1209 if (avctx->codec->pix_fmts) {
yading@10 1210 for (i = 0; avctx->codec->pix_fmts[i] != AV_PIX_FMT_NONE; i++)
yading@10 1211 if (avctx->pix_fmt == avctx->codec->pix_fmts[i])
yading@10 1212 break;
yading@10 1213 if (avctx->codec->pix_fmts[i] == AV_PIX_FMT_NONE
yading@10 1214 && !((avctx->codec_id == AV_CODEC_ID_MJPEG || avctx->codec_id == AV_CODEC_ID_LJPEG)
yading@10 1215 && avctx->strict_std_compliance <= FF_COMPLIANCE_UNOFFICIAL)) {
yading@10 1216 char buf[128];
yading@10 1217 snprintf(buf, sizeof(buf), "%d", avctx->pix_fmt);
yading@10 1218 av_log(avctx, AV_LOG_ERROR, "Specified pixel format %s is invalid or not supported\n",
yading@10 1219 (char *)av_x_if_null(av_get_pix_fmt_name(avctx->pix_fmt), buf));
yading@10 1220 ret = AVERROR(EINVAL);
yading@10 1221 goto free_and_end;
yading@10 1222 }
yading@10 1223 }
yading@10 1224 if (avctx->codec->supported_samplerates) {
yading@10 1225 for (i = 0; avctx->codec->supported_samplerates[i] != 0; i++)
yading@10 1226 if (avctx->sample_rate == avctx->codec->supported_samplerates[i])
yading@10 1227 break;
yading@10 1228 if (avctx->codec->supported_samplerates[i] == 0) {
yading@10 1229 av_log(avctx, AV_LOG_ERROR, "Specified sample rate %d is not supported\n",
yading@10 1230 avctx->sample_rate);
yading@10 1231 ret = AVERROR(EINVAL);
yading@10 1232 goto free_and_end;
yading@10 1233 }
yading@10 1234 }
yading@10 1235 if (avctx->codec->channel_layouts) {
yading@10 1236 if (!avctx->channel_layout) {
yading@10 1237 av_log(avctx, AV_LOG_WARNING, "Channel layout not specified\n");
yading@10 1238 } else {
yading@10 1239 for (i = 0; avctx->codec->channel_layouts[i] != 0; i++)
yading@10 1240 if (avctx->channel_layout == avctx->codec->channel_layouts[i])
yading@10 1241 break;
yading@10 1242 if (avctx->codec->channel_layouts[i] == 0) {
yading@10 1243 char buf[512];
yading@10 1244 av_get_channel_layout_string(buf, sizeof(buf), -1, avctx->channel_layout);
yading@10 1245 av_log(avctx, AV_LOG_ERROR, "Specified channel layout '%s' is not supported\n", buf);
yading@10 1246 ret = AVERROR(EINVAL);
yading@10 1247 goto free_and_end;
yading@10 1248 }
yading@10 1249 }
yading@10 1250 }
yading@10 1251 if (avctx->channel_layout && avctx->channels) {
yading@10 1252 int channels = av_get_channel_layout_nb_channels(avctx->channel_layout);
yading@10 1253 if (channels != avctx->channels) {
yading@10 1254 char buf[512];
yading@10 1255 av_get_channel_layout_string(buf, sizeof(buf), -1, avctx->channel_layout);
yading@10 1256 av_log(avctx, AV_LOG_ERROR,
yading@10 1257 "Channel layout '%s' with %d channels does not match number of specified channels %d\n",
yading@10 1258 buf, channels, avctx->channels);
yading@10 1259 ret = AVERROR(EINVAL);
yading@10 1260 goto free_and_end;
yading@10 1261 }
yading@10 1262 } else if (avctx->channel_layout) {
yading@10 1263 avctx->channels = av_get_channel_layout_nb_channels(avctx->channel_layout);
yading@10 1264 }
yading@10 1265 if(avctx->codec_type == AVMEDIA_TYPE_VIDEO &&
yading@10 1266 avctx->codec_id != AV_CODEC_ID_PNG // For mplayer
yading@10 1267 ) {
yading@10 1268 if (avctx->width <= 0 || avctx->height <= 0) {
yading@10 1269 av_log(avctx, AV_LOG_ERROR, "dimensions not set\n");
yading@10 1270 ret = AVERROR(EINVAL);
yading@10 1271 goto free_and_end;
yading@10 1272 }
yading@10 1273 }
yading@10 1274 if ( (avctx->codec_type == AVMEDIA_TYPE_VIDEO || avctx->codec_type == AVMEDIA_TYPE_AUDIO)
yading@10 1275 && avctx->bit_rate>0 && avctx->bit_rate<1000) {
yading@10 1276 av_log(avctx, AV_LOG_WARNING, "Bitrate %d is extremely low, maybe you mean %dk\n", avctx->bit_rate, avctx->bit_rate);
yading@10 1277 }
yading@10 1278
yading@10 1279 if (!avctx->rc_initial_buffer_occupancy)
yading@10 1280 avctx->rc_initial_buffer_occupancy = avctx->rc_buffer_size * 3 / 4;
yading@10 1281 }
yading@10 1282
yading@10 1283 avctx->pts_correction_num_faulty_pts =
yading@10 1284 avctx->pts_correction_num_faulty_dts = 0;
yading@10 1285 avctx->pts_correction_last_pts =
yading@10 1286 avctx->pts_correction_last_dts = INT64_MIN;
yading@10 1287
yading@10 1288 if ( avctx->codec->init && (!(avctx->active_thread_type&FF_THREAD_FRAME)
yading@10 1289 || avctx->internal->frame_thread_encoder)) {
yading@10 1290 ret = avctx->codec->init(avctx);
yading@10 1291 if (ret < 0) {
yading@10 1292 goto free_and_end;
yading@10 1293 }
yading@10 1294 }
yading@10 1295
yading@10 1296 ret=0;
yading@10 1297
yading@10 1298 if (av_codec_is_decoder(avctx->codec)) {
yading@10 1299 if (!avctx->bit_rate)
yading@10 1300 avctx->bit_rate = get_bit_rate(avctx);
yading@10 1301 /* validate channel layout from the decoder */
yading@10 1302 if (avctx->channel_layout) {
yading@10 1303 int channels = av_get_channel_layout_nb_channels(avctx->channel_layout);
yading@10 1304 if (!avctx->channels)
yading@10 1305 avctx->channels = channels;
yading@10 1306 else if (channels != avctx->channels) {
yading@10 1307 char buf[512];
yading@10 1308 av_get_channel_layout_string(buf, sizeof(buf), -1, avctx->channel_layout);
yading@10 1309 av_log(avctx, AV_LOG_WARNING,
yading@10 1310 "Channel layout '%s' with %d channels does not match specified number of channels %d: "
yading@10 1311 "ignoring specified channel layout\n",
yading@10 1312 buf, channels, avctx->channels);
yading@10 1313 avctx->channel_layout = 0;
yading@10 1314 }
yading@10 1315 }
yading@10 1316 if (avctx->channels && avctx->channels < 0 ||
yading@10 1317 avctx->channels > FF_SANE_NB_CHANNELS) {
yading@10 1318 ret = AVERROR(EINVAL);
yading@10 1319 goto free_and_end;
yading@10 1320 }
yading@10 1321 if (avctx->sub_charenc) {
yading@10 1322 if (avctx->codec_type != AVMEDIA_TYPE_SUBTITLE) {
yading@10 1323 av_log(avctx, AV_LOG_ERROR, "Character encoding is only "
yading@10 1324 "supported with subtitles codecs\n");
yading@10 1325 ret = AVERROR(EINVAL);
yading@10 1326 goto free_and_end;
yading@10 1327 } else if (avctx->codec_descriptor->props & AV_CODEC_PROP_BITMAP_SUB) {
yading@10 1328 av_log(avctx, AV_LOG_WARNING, "Codec '%s' is bitmap-based, "
yading@10 1329 "subtitles character encoding will be ignored\n",
yading@10 1330 avctx->codec_descriptor->name);
yading@10 1331 avctx->sub_charenc_mode = FF_SUB_CHARENC_MODE_DO_NOTHING;
yading@10 1332 } else {
yading@10 1333 /* input character encoding is set for a text based subtitle
yading@10 1334 * codec at this point */
yading@10 1335 if (avctx->sub_charenc_mode == FF_SUB_CHARENC_MODE_AUTOMATIC)
yading@10 1336 avctx->sub_charenc_mode = FF_SUB_CHARENC_MODE_PRE_DECODER;
yading@10 1337
yading@10 1338 if (avctx->sub_charenc_mode == FF_SUB_CHARENC_MODE_PRE_DECODER) {
yading@10 1339 #if CONFIG_ICONV
yading@10 1340 iconv_t cd = iconv_open("UTF-8", avctx->sub_charenc);
yading@10 1341 if (cd == (iconv_t)-1) {
yading@10 1342 av_log(avctx, AV_LOG_ERROR, "Unable to open iconv context "
yading@10 1343 "with input character encoding \"%s\"\n", avctx->sub_charenc);
yading@10 1344 ret = AVERROR(errno);
yading@10 1345 goto free_and_end;
yading@10 1346 }
yading@10 1347 iconv_close(cd);
yading@10 1348 #else
yading@10 1349 av_log(avctx, AV_LOG_ERROR, "Character encoding subtitles "
yading@10 1350 "conversion needs a libavcodec built with iconv support "
yading@10 1351 "for this codec\n");
yading@10 1352 ret = AVERROR(ENOSYS);
yading@10 1353 goto free_and_end;
yading@10 1354 #endif
yading@10 1355 }
yading@10 1356 }
yading@10 1357 }
yading@10 1358 }
yading@10 1359 end:
yading@10 1360 ff_unlock_avcodec();
yading@10 1361 if (options) {
yading@10 1362 av_dict_free(options);
yading@10 1363 *options = tmp;
yading@10 1364 }
yading@10 1365
yading@10 1366 return ret;
yading@10 1367 free_and_end:
yading@10 1368 av_dict_free(&tmp);
yading@10 1369 av_freep(&avctx->priv_data);
yading@10 1370 if (avctx->internal)
yading@10 1371 av_freep(&avctx->internal->pool);
yading@10 1372 av_freep(&avctx->internal);
yading@10 1373 avctx->codec = NULL;
yading@10 1374 goto end;
yading@10 1375 }
yading@10 1376
yading@10 1377 int ff_alloc_packet2(AVCodecContext *avctx, AVPacket *avpkt, int size)
yading@10 1378 {
yading@10 1379 if (size < 0 || avpkt->size < 0 || size > INT_MAX - FF_INPUT_BUFFER_PADDING_SIZE) {
yading@10 1380 av_log(avctx, AV_LOG_ERROR, "Size %d invalid\n", size);
yading@10 1381 return AVERROR(EINVAL);
yading@10 1382 }
yading@10 1383
yading@10 1384 if (avctx) {
yading@10 1385 av_assert0(!avpkt->data || avpkt->data != avctx->internal->byte_buffer);
yading@10 1386 if (!avpkt->data || avpkt->size < size) {
yading@10 1387 av_fast_padded_malloc(&avctx->internal->byte_buffer, &avctx->internal->byte_buffer_size, size);
yading@10 1388 avpkt->data = avctx->internal->byte_buffer;
yading@10 1389 avpkt->size = avctx->internal->byte_buffer_size;
yading@10 1390 avpkt->destruct = NULL;
yading@10 1391 }
yading@10 1392 }
yading@10 1393
yading@10 1394 if (avpkt->data) {
yading@10 1395 AVBufferRef *buf = avpkt->buf;
yading@10 1396 #if FF_API_DESTRUCT_PACKET
yading@10 1397 void *destruct = avpkt->destruct;
yading@10 1398 #endif
yading@10 1399
yading@10 1400 if (avpkt->size < size) {
yading@10 1401 av_log(avctx, AV_LOG_ERROR, "User packet is too small (%d < %d)\n", avpkt->size, size);
yading@10 1402 return AVERROR(EINVAL);
yading@10 1403 }
yading@10 1404
yading@10 1405 av_init_packet(avpkt);
yading@10 1406 #if FF_API_DESTRUCT_PACKET
yading@10 1407 avpkt->destruct = destruct;
yading@10 1408 #endif
yading@10 1409 avpkt->buf = buf;
yading@10 1410 avpkt->size = size;
yading@10 1411 return 0;
yading@10 1412 } else {
yading@10 1413 int ret = av_new_packet(avpkt, size);
yading@10 1414 if (ret < 0)
yading@10 1415 av_log(avctx, AV_LOG_ERROR, "Failed to allocate packet of size %d\n", size);
yading@10 1416 return ret;
yading@10 1417 }
yading@10 1418 }
yading@10 1419
yading@10 1420 int ff_alloc_packet(AVPacket *avpkt, int size)
yading@10 1421 {
yading@10 1422 return ff_alloc_packet2(NULL, avpkt, size);
yading@10 1423 }
yading@10 1424
yading@10 1425 /**
yading@10 1426 * Pad last frame with silence.
yading@10 1427 */
yading@10 1428 static int pad_last_frame(AVCodecContext *s, AVFrame **dst, const AVFrame *src)
yading@10 1429 {
yading@10 1430 AVFrame *frame = NULL;
yading@10 1431 uint8_t *buf = NULL;
yading@10 1432 int ret;
yading@10 1433
yading@10 1434 if (!(frame = avcodec_alloc_frame()))
yading@10 1435 return AVERROR(ENOMEM);
yading@10 1436 *frame = *src;
yading@10 1437
yading@10 1438 if ((ret = av_samples_get_buffer_size(&frame->linesize[0], s->channels,
yading@10 1439 s->frame_size, s->sample_fmt, 0)) < 0)
yading@10 1440 goto fail;
yading@10 1441
yading@10 1442 if (!(buf = av_malloc(ret))) {
yading@10 1443 ret = AVERROR(ENOMEM);
yading@10 1444 goto fail;
yading@10 1445 }
yading@10 1446
yading@10 1447 frame->nb_samples = s->frame_size;
yading@10 1448 if ((ret = avcodec_fill_audio_frame(frame, s->channels, s->sample_fmt,
yading@10 1449 buf, ret, 0)) < 0)
yading@10 1450 goto fail;
yading@10 1451 if ((ret = av_samples_copy(frame->extended_data, src->extended_data, 0, 0,
yading@10 1452 src->nb_samples, s->channels, s->sample_fmt)) < 0)
yading@10 1453 goto fail;
yading@10 1454 if ((ret = av_samples_set_silence(frame->extended_data, src->nb_samples,
yading@10 1455 frame->nb_samples - src->nb_samples,
yading@10 1456 s->channels, s->sample_fmt)) < 0)
yading@10 1457 goto fail;
yading@10 1458
yading@10 1459 *dst = frame;
yading@10 1460
yading@10 1461 return 0;
yading@10 1462
yading@10 1463 fail:
yading@10 1464 if (frame->extended_data != frame->data)
yading@10 1465 av_freep(&frame->extended_data);
yading@10 1466 av_freep(&buf);
yading@10 1467 av_freep(&frame);
yading@10 1468 return ret;
yading@10 1469 }
yading@10 1470
yading@10 1471 int attribute_align_arg avcodec_encode_audio2(AVCodecContext *avctx,
yading@10 1472 AVPacket *avpkt,
yading@10 1473 const AVFrame *frame,
yading@10 1474 int *got_packet_ptr)
yading@10 1475 {
yading@10 1476 AVFrame tmp;
yading@10 1477 AVFrame *padded_frame = NULL;
yading@10 1478 int ret;
yading@10 1479 AVPacket user_pkt = *avpkt;
yading@10 1480 int needs_realloc = !user_pkt.data;
yading@10 1481
yading@10 1482 *got_packet_ptr = 0;
yading@10 1483
yading@10 1484 if (!(avctx->codec->capabilities & CODEC_CAP_DELAY) && !frame) {
yading@10 1485 av_free_packet(avpkt);
yading@10 1486 av_init_packet(avpkt);
yading@10 1487 return 0;
yading@10 1488 }
yading@10 1489
yading@10 1490 /* ensure that extended_data is properly set */
yading@10 1491 if (frame && !frame->extended_data) {
yading@10 1492 if (av_sample_fmt_is_planar(avctx->sample_fmt) &&
yading@10 1493 avctx->channels > AV_NUM_DATA_POINTERS) {
yading@10 1494 av_log(avctx, AV_LOG_ERROR, "Encoding to a planar sample format, "
yading@10 1495 "with more than %d channels, but extended_data is not set.\n",
yading@10 1496 AV_NUM_DATA_POINTERS);
yading@10 1497 return AVERROR(EINVAL);
yading@10 1498 }
yading@10 1499 av_log(avctx, AV_LOG_WARNING, "extended_data is not set.\n");
yading@10 1500
yading@10 1501 tmp = *frame;
yading@10 1502 tmp.extended_data = tmp.data;
yading@10 1503 frame = &tmp;
yading@10 1504 }
yading@10 1505
yading@10 1506 /* check for valid frame size */
yading@10 1507 if (frame) {
yading@10 1508 if (avctx->codec->capabilities & CODEC_CAP_SMALL_LAST_FRAME) {
yading@10 1509 if (frame->nb_samples > avctx->frame_size) {
yading@10 1510 av_log(avctx, AV_LOG_ERROR, "more samples than frame size (avcodec_encode_audio2)\n");
yading@10 1511 return AVERROR(EINVAL);
yading@10 1512 }
yading@10 1513 } else if (!(avctx->codec->capabilities & CODEC_CAP_VARIABLE_FRAME_SIZE)) {
yading@10 1514 if (frame->nb_samples < avctx->frame_size &&
yading@10 1515 !avctx->internal->last_audio_frame) {
yading@10 1516 ret = pad_last_frame(avctx, &padded_frame, frame);
yading@10 1517 if (ret < 0)
yading@10 1518 return ret;
yading@10 1519
yading@10 1520 frame = padded_frame;
yading@10 1521 avctx->internal->last_audio_frame = 1;
yading@10 1522 }
yading@10 1523
yading@10 1524 if (frame->nb_samples != avctx->frame_size) {
yading@10 1525 av_log(avctx, AV_LOG_ERROR, "nb_samples (%d) != frame_size (%d) (avcodec_encode_audio2)\n", frame->nb_samples, avctx->frame_size);
yading@10 1526 ret = AVERROR(EINVAL);
yading@10 1527 goto end;
yading@10 1528 }
yading@10 1529 }
yading@10 1530 }
yading@10 1531
yading@10 1532 ret = avctx->codec->encode2(avctx, avpkt, frame, got_packet_ptr);
yading@10 1533 if (!ret) {
yading@10 1534 if (*got_packet_ptr) {
yading@10 1535 if (!(avctx->codec->capabilities & CODEC_CAP_DELAY)) {
yading@10 1536 if (avpkt->pts == AV_NOPTS_VALUE)
yading@10 1537 avpkt->pts = frame->pts;
yading@10 1538 if (!avpkt->duration)
yading@10 1539 avpkt->duration = ff_samples_to_time_base(avctx,
yading@10 1540 frame->nb_samples);
yading@10 1541 }
yading@10 1542 avpkt->dts = avpkt->pts;
yading@10 1543 } else {
yading@10 1544 avpkt->size = 0;
yading@10 1545 }
yading@10 1546 }
yading@10 1547 if (avpkt->data && avpkt->data == avctx->internal->byte_buffer) {
yading@10 1548 needs_realloc = 0;
yading@10 1549 if (user_pkt.data) {
yading@10 1550 if (user_pkt.size >= avpkt->size) {
yading@10 1551 memcpy(user_pkt.data, avpkt->data, avpkt->size);
yading@10 1552 } else {
yading@10 1553 av_log(avctx, AV_LOG_ERROR, "Provided packet is too small, needs to be %d\n", avpkt->size);
yading@10 1554 avpkt->size = user_pkt.size;
yading@10 1555 ret = -1;
yading@10 1556 }
yading@10 1557 avpkt->buf = user_pkt.buf;
yading@10 1558 avpkt->data = user_pkt.data;
yading@10 1559 avpkt->destruct = user_pkt.destruct;
yading@10 1560 } else {
yading@10 1561 if (av_dup_packet(avpkt) < 0) {
yading@10 1562 ret = AVERROR(ENOMEM);
yading@10 1563 }
yading@10 1564 }
yading@10 1565 }
yading@10 1566
yading@10 1567 if (!ret) {
yading@10 1568 if (needs_realloc && avpkt->data) {
yading@10 1569 ret = av_buffer_realloc(&avpkt->buf, avpkt->size + FF_INPUT_BUFFER_PADDING_SIZE);
yading@10 1570 if (ret >= 0)
yading@10 1571 avpkt->data = avpkt->buf->data;
yading@10 1572 }
yading@10 1573
yading@10 1574 avctx->frame_number++;
yading@10 1575 }
yading@10 1576
yading@10 1577 if (ret < 0 || !*got_packet_ptr) {
yading@10 1578 av_free_packet(avpkt);
yading@10 1579 av_init_packet(avpkt);
yading@10 1580 goto end;
yading@10 1581 }
yading@10 1582
yading@10 1583 /* NOTE: if we add any audio encoders which output non-keyframe packets,
yading@10 1584 * this needs to be moved to the encoders, but for now we can do it
yading@10 1585 * here to simplify things */
yading@10 1586 avpkt->flags |= AV_PKT_FLAG_KEY;
yading@10 1587
yading@10 1588 end:
yading@10 1589 if (padded_frame) {
yading@10 1590 av_freep(&padded_frame->data[0]);
yading@10 1591 if (padded_frame->extended_data != padded_frame->data)
yading@10 1592 av_freep(&padded_frame->extended_data);
yading@10 1593 av_freep(&padded_frame);
yading@10 1594 }
yading@10 1595
yading@10 1596 return ret;
yading@10 1597 }
yading@10 1598
yading@10 1599 #if FF_API_OLD_ENCODE_AUDIO
yading@10 1600 int attribute_align_arg avcodec_encode_audio(AVCodecContext *avctx,
yading@10 1601 uint8_t *buf, int buf_size,
yading@10 1602 const short *samples)
yading@10 1603 {
yading@10 1604 AVPacket pkt;
yading@10 1605 AVFrame frame0 = { { 0 } };
yading@10 1606 AVFrame *frame;
yading@10 1607 int ret, samples_size, got_packet;
yading@10 1608
yading@10 1609 av_init_packet(&pkt);
yading@10 1610 pkt.data = buf;
yading@10 1611 pkt.size = buf_size;
yading@10 1612
yading@10 1613 if (samples) {
yading@10 1614 frame = &frame0;
yading@10 1615 avcodec_get_frame_defaults(frame);
yading@10 1616
yading@10 1617 if (avctx->frame_size) {
yading@10 1618 frame->nb_samples = avctx->frame_size;
yading@10 1619 } else {
yading@10 1620 /* if frame_size is not set, the number of samples must be
yading@10 1621 * calculated from the buffer size */
yading@10 1622 int64_t nb_samples;
yading@10 1623 if (!av_get_bits_per_sample(avctx->codec_id)) {
yading@10 1624 av_log(avctx, AV_LOG_ERROR, "avcodec_encode_audio() does not "
yading@10 1625 "support this codec\n");
yading@10 1626 return AVERROR(EINVAL);
yading@10 1627 }
yading@10 1628 nb_samples = (int64_t)buf_size * 8 /
yading@10 1629 (av_get_bits_per_sample(avctx->codec_id) *
yading@10 1630 avctx->channels);
yading@10 1631 if (nb_samples >= INT_MAX)
yading@10 1632 return AVERROR(EINVAL);
yading@10 1633 frame->nb_samples = nb_samples;
yading@10 1634 }
yading@10 1635
yading@10 1636 /* it is assumed that the samples buffer is large enough based on the
yading@10 1637 * relevant parameters */
yading@10 1638 samples_size = av_samples_get_buffer_size(NULL, avctx->channels,
yading@10 1639 frame->nb_samples,
yading@10 1640 avctx->sample_fmt, 1);
yading@10 1641 if ((ret = avcodec_fill_audio_frame(frame, avctx->channels,
yading@10 1642 avctx->sample_fmt,
yading@10 1643 (const uint8_t *)samples,
yading@10 1644 samples_size, 1)) < 0)
yading@10 1645 return ret;
yading@10 1646
yading@10 1647 /* fabricate frame pts from sample count.
yading@10 1648 * this is needed because the avcodec_encode_audio() API does not have
yading@10 1649 * a way for the user to provide pts */
yading@10 1650 if (avctx->sample_rate && avctx->time_base.num)
yading@10 1651 frame->pts = ff_samples_to_time_base(avctx,
yading@10 1652 avctx->internal->sample_count);
yading@10 1653 else
yading@10 1654 frame->pts = AV_NOPTS_VALUE;
yading@10 1655 avctx->internal->sample_count += frame->nb_samples;
yading@10 1656 } else {
yading@10 1657 frame = NULL;
yading@10 1658 }
yading@10 1659
yading@10 1660 got_packet = 0;
yading@10 1661 ret = avcodec_encode_audio2(avctx, &pkt, frame, &got_packet);
yading@10 1662 if (!ret && got_packet && avctx->coded_frame) {
yading@10 1663 avctx->coded_frame->pts = pkt.pts;
yading@10 1664 avctx->coded_frame->key_frame = !!(pkt.flags & AV_PKT_FLAG_KEY);
yading@10 1665 }
yading@10 1666 /* free any side data since we cannot return it */
yading@10 1667 ff_packet_free_side_data(&pkt);
yading@10 1668
yading@10 1669 if (frame && frame->extended_data != frame->data)
yading@10 1670 av_freep(&frame->extended_data);
yading@10 1671
yading@10 1672 return ret ? ret : pkt.size;
yading@10 1673 }
yading@10 1674
yading@10 1675 #endif
yading@10 1676
yading@10 1677 #if FF_API_OLD_ENCODE_VIDEO
yading@10 1678 int attribute_align_arg avcodec_encode_video(AVCodecContext *avctx, uint8_t *buf, int buf_size,
yading@10 1679 const AVFrame *pict)
yading@10 1680 {
yading@10 1681 AVPacket pkt;
yading@10 1682 int ret, got_packet = 0;
yading@10 1683
yading@10 1684 if (buf_size < FF_MIN_BUFFER_SIZE) {
yading@10 1685 av_log(avctx, AV_LOG_ERROR, "buffer smaller than minimum size\n");
yading@10 1686 return -1;
yading@10 1687 }
yading@10 1688
yading@10 1689 av_init_packet(&pkt);
yading@10 1690 pkt.data = buf;
yading@10 1691 pkt.size = buf_size;
yading@10 1692
yading@10 1693 ret = avcodec_encode_video2(avctx, &pkt, pict, &got_packet);
yading@10 1694 if (!ret && got_packet && avctx->coded_frame) {
yading@10 1695 avctx->coded_frame->pts = pkt.pts;
yading@10 1696 avctx->coded_frame->key_frame = !!(pkt.flags & AV_PKT_FLAG_KEY);
yading@10 1697 }
yading@10 1698
yading@10 1699 /* free any side data since we cannot return it */
yading@10 1700 if (pkt.side_data_elems > 0) {
yading@10 1701 int i;
yading@10 1702 for (i = 0; i < pkt.side_data_elems; i++)
yading@10 1703 av_free(pkt.side_data[i].data);
yading@10 1704 av_freep(&pkt.side_data);
yading@10 1705 pkt.side_data_elems = 0;
yading@10 1706 }
yading@10 1707
yading@10 1708 return ret ? ret : pkt.size;
yading@10 1709 }
yading@10 1710
yading@10 1711 #endif
yading@10 1712
yading@10 1713 int attribute_align_arg avcodec_encode_video2(AVCodecContext *avctx,
yading@10 1714 AVPacket *avpkt,
yading@10 1715 const AVFrame *frame,
yading@10 1716 int *got_packet_ptr)
yading@10 1717 {
yading@10 1718 int ret;
yading@10 1719 AVPacket user_pkt = *avpkt;
yading@10 1720 int needs_realloc = !user_pkt.data;
yading@10 1721
yading@10 1722 *got_packet_ptr = 0;
yading@10 1723
yading@10 1724 if(CONFIG_FRAME_THREAD_ENCODER &&
yading@10 1725 avctx->internal->frame_thread_encoder && (avctx->active_thread_type&FF_THREAD_FRAME))
yading@10 1726 return ff_thread_video_encode_frame(avctx, avpkt, frame, got_packet_ptr);
yading@10 1727
yading@10 1728 if ((avctx->flags&CODEC_FLAG_PASS1) && avctx->stats_out)
yading@10 1729 avctx->stats_out[0] = '\0';
yading@10 1730
yading@10 1731 if (!(avctx->codec->capabilities & CODEC_CAP_DELAY) && !frame) {
yading@10 1732 av_free_packet(avpkt);
yading@10 1733 av_init_packet(avpkt);
yading@10 1734 avpkt->size = 0;
yading@10 1735 return 0;
yading@10 1736 }
yading@10 1737
yading@10 1738 if (av_image_check_size(avctx->width, avctx->height, 0, avctx))
yading@10 1739 return AVERROR(EINVAL);
yading@10 1740
yading@10 1741 av_assert0(avctx->codec->encode2);
yading@10 1742
yading@10 1743 ret = avctx->codec->encode2(avctx, avpkt, frame, got_packet_ptr);
yading@10 1744 av_assert0(ret <= 0);
yading@10 1745
yading@10 1746 if (avpkt->data && avpkt->data == avctx->internal->byte_buffer) {
yading@10 1747 needs_realloc = 0;
yading@10 1748 if (user_pkt.data) {
yading@10 1749 if (user_pkt.size >= avpkt->size) {
yading@10 1750 memcpy(user_pkt.data, avpkt->data, avpkt->size);
yading@10 1751 } else {
yading@10 1752 av_log(avctx, AV_LOG_ERROR, "Provided packet is too small, needs to be %d\n", avpkt->size);
yading@10 1753 avpkt->size = user_pkt.size;
yading@10 1754 ret = -1;
yading@10 1755 }
yading@10 1756 avpkt->buf = user_pkt.buf;
yading@10 1757 avpkt->data = user_pkt.data;
yading@10 1758 avpkt->destruct = user_pkt.destruct;
yading@10 1759 } else {
yading@10 1760 if (av_dup_packet(avpkt) < 0) {
yading@10 1761 ret = AVERROR(ENOMEM);
yading@10 1762 }
yading@10 1763 }
yading@10 1764 }
yading@10 1765
yading@10 1766 if (!ret) {
yading@10 1767 if (!*got_packet_ptr)
yading@10 1768 avpkt->size = 0;
yading@10 1769 else if (!(avctx->codec->capabilities & CODEC_CAP_DELAY))
yading@10 1770 avpkt->pts = avpkt->dts = frame->pts;
yading@10 1771
yading@10 1772 if (needs_realloc && avpkt->data) {
yading@10 1773 ret = av_buffer_realloc(&avpkt->buf, avpkt->size + FF_INPUT_BUFFER_PADDING_SIZE);
yading@10 1774 if (ret >= 0)
yading@10 1775 avpkt->data = avpkt->buf->data;
yading@10 1776 }
yading@10 1777
yading@10 1778 avctx->frame_number++;
yading@10 1779 }
yading@10 1780
yading@10 1781 if (ret < 0 || !*got_packet_ptr)
yading@10 1782 av_free_packet(avpkt);
yading@10 1783 else
yading@10 1784 av_packet_merge_side_data(avpkt);
yading@10 1785
yading@10 1786 emms_c();
yading@10 1787 return ret;
yading@10 1788 }
yading@10 1789
yading@10 1790 int avcodec_encode_subtitle(AVCodecContext *avctx, uint8_t *buf, int buf_size,
yading@10 1791 const AVSubtitle *sub)
yading@10 1792 {
yading@10 1793 int ret;
yading@10 1794 if (sub->start_display_time) {
yading@10 1795 av_log(avctx, AV_LOG_ERROR, "start_display_time must be 0.\n");
yading@10 1796 return -1;
yading@10 1797 }
yading@10 1798
yading@10 1799 ret = avctx->codec->encode_sub(avctx, buf, buf_size, sub);
yading@10 1800 avctx->frame_number++;
yading@10 1801 return ret;
yading@10 1802 }
yading@10 1803
yading@10 1804 /**
yading@10 1805 * Attempt to guess proper monotonic timestamps for decoded video frames
yading@10 1806 * which might have incorrect times. Input timestamps may wrap around, in
yading@10 1807 * which case the output will as well.
yading@10 1808 *
yading@10 1809 * @param pts the pts field of the decoded AVPacket, as passed through
yading@10 1810 * AVFrame.pkt_pts
yading@10 1811 * @param dts the dts field of the decoded AVPacket
yading@10 1812 * @return one of the input values, may be AV_NOPTS_VALUE
yading@10 1813 */
yading@10 1814 static int64_t guess_correct_pts(AVCodecContext *ctx,
yading@10 1815 int64_t reordered_pts, int64_t dts)
yading@10 1816 {
yading@10 1817 int64_t pts = AV_NOPTS_VALUE;
yading@10 1818
yading@10 1819 if (dts != AV_NOPTS_VALUE) {
yading@10 1820 ctx->pts_correction_num_faulty_dts += dts <= ctx->pts_correction_last_dts;
yading@10 1821 ctx->pts_correction_last_dts = dts;
yading@10 1822 }
yading@10 1823 if (reordered_pts != AV_NOPTS_VALUE) {
yading@10 1824 ctx->pts_correction_num_faulty_pts += reordered_pts <= ctx->pts_correction_last_pts;
yading@10 1825 ctx->pts_correction_last_pts = reordered_pts;
yading@10 1826 }
yading@10 1827 if ((ctx->pts_correction_num_faulty_pts<=ctx->pts_correction_num_faulty_dts || dts == AV_NOPTS_VALUE)
yading@10 1828 && reordered_pts != AV_NOPTS_VALUE)
yading@10 1829 pts = reordered_pts;
yading@10 1830 else
yading@10 1831 pts = dts;
yading@10 1832
yading@10 1833 return pts;
yading@10 1834 }
yading@10 1835
yading@10 1836 static void apply_param_change(AVCodecContext *avctx, AVPacket *avpkt)
yading@10 1837 {
yading@10 1838 int size = 0;
yading@10 1839 const uint8_t *data;
yading@10 1840 uint32_t flags;
yading@10 1841
yading@10 1842 if (!(avctx->codec->capabilities & CODEC_CAP_PARAM_CHANGE))
yading@10 1843 return;
yading@10 1844
yading@10 1845 data = av_packet_get_side_data(avpkt, AV_PKT_DATA_PARAM_CHANGE, &size);
yading@10 1846 if (!data || size < 4)
yading@10 1847 return;
yading@10 1848 flags = bytestream_get_le32(&data);
yading@10 1849 size -= 4;
yading@10 1850 if (size < 4) /* Required for any of the changes */
yading@10 1851 return;
yading@10 1852 if (flags & AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_COUNT) {
yading@10 1853 avctx->channels = bytestream_get_le32(&data);
yading@10 1854 size -= 4;
yading@10 1855 }
yading@10 1856 if (flags & AV_SIDE_DATA_PARAM_CHANGE_CHANNEL_LAYOUT) {
yading@10 1857 if (size < 8)
yading@10 1858 return;
yading@10 1859 avctx->channel_layout = bytestream_get_le64(&data);
yading@10 1860 size -= 8;
yading@10 1861 }
yading@10 1862 if (size < 4)
yading@10 1863 return;
yading@10 1864 if (flags & AV_SIDE_DATA_PARAM_CHANGE_SAMPLE_RATE) {
yading@10 1865 avctx->sample_rate = bytestream_get_le32(&data);
yading@10 1866 size -= 4;
yading@10 1867 }
yading@10 1868 if (flags & AV_SIDE_DATA_PARAM_CHANGE_DIMENSIONS) {
yading@10 1869 if (size < 8)
yading@10 1870 return;
yading@10 1871 avctx->width = bytestream_get_le32(&data);
yading@10 1872 avctx->height = bytestream_get_le32(&data);
yading@10 1873 avcodec_set_dimensions(avctx, avctx->width, avctx->height);
yading@10 1874 size -= 8;
yading@10 1875 }
yading@10 1876 }
yading@10 1877
yading@10 1878 static int add_metadata_from_side_data(AVCodecContext *avctx, AVFrame *frame)
yading@10 1879 {
yading@10 1880 int size, ret = 0;
yading@10 1881 const uint8_t *side_metadata;
yading@10 1882 const uint8_t *end;
yading@10 1883
yading@10 1884 side_metadata = av_packet_get_side_data(avctx->pkt,
yading@10 1885 AV_PKT_DATA_STRINGS_METADATA, &size);
yading@10 1886 if (!side_metadata)
yading@10 1887 goto end;
yading@10 1888 end = side_metadata + size;
yading@10 1889 while (side_metadata < end) {
yading@10 1890 const uint8_t *key = side_metadata;
yading@10 1891 const uint8_t *val = side_metadata + strlen(key) + 1;
yading@10 1892 int ret = av_dict_set(avpriv_frame_get_metadatap(frame), key, val, 0);
yading@10 1893 if (ret < 0)
yading@10 1894 break;
yading@10 1895 side_metadata = val + strlen(val) + 1;
yading@10 1896 }
yading@10 1897 end:
yading@10 1898 return ret;
yading@10 1899 }
yading@10 1900
yading@10 1901 int attribute_align_arg avcodec_decode_video2(AVCodecContext *avctx, AVFrame *picture,
yading@10 1902 int *got_picture_ptr,
yading@10 1903 const AVPacket *avpkt)
yading@10 1904 {
yading@10 1905 AVCodecInternal *avci = avctx->internal;
yading@10 1906 int ret;
yading@10 1907 // copy to ensure we do not change avpkt
yading@10 1908 AVPacket tmp = *avpkt;
yading@10 1909
yading@10 1910 if (avctx->codec->type != AVMEDIA_TYPE_VIDEO) {
yading@10 1911 av_log(avctx, AV_LOG_ERROR, "Invalid media type for video\n");
yading@10 1912 return AVERROR(EINVAL);
yading@10 1913 }
yading@10 1914
yading@10 1915 *got_picture_ptr = 0;
yading@10 1916 if ((avctx->coded_width || avctx->coded_height) && av_image_check_size(avctx->coded_width, avctx->coded_height, 0, avctx))
yading@10 1917 return AVERROR(EINVAL);
yading@10 1918
yading@10 1919 avcodec_get_frame_defaults(picture);
yading@10 1920
yading@10 1921 if (!avctx->refcounted_frames)
yading@10 1922 av_frame_unref(&avci->to_free);
yading@10 1923
yading@10 1924 if ((avctx->codec->capabilities & CODEC_CAP_DELAY) || avpkt->size || (avctx->active_thread_type & FF_THREAD_FRAME)) {
yading@10 1925 int did_split = av_packet_split_side_data(&tmp);
yading@10 1926 apply_param_change(avctx, &tmp);
yading@10 1927 avctx->pkt = &tmp;
yading@10 1928 if (HAVE_THREADS && avctx->active_thread_type & FF_THREAD_FRAME)
yading@10 1929 ret = ff_thread_decode_frame(avctx, picture, got_picture_ptr,
yading@10 1930 &tmp);
yading@10 1931 else {
yading@10 1932 ret = avctx->codec->decode(avctx, picture, got_picture_ptr,
yading@10 1933 &tmp);
yading@10 1934 picture->pkt_dts = avpkt->dts;
yading@10 1935
yading@10 1936 if(!avctx->has_b_frames){
yading@10 1937 av_frame_set_pkt_pos(picture, avpkt->pos);
yading@10 1938 }
yading@10 1939 //FIXME these should be under if(!avctx->has_b_frames)
yading@10 1940 /* get_buffer is supposed to set frame parameters */
yading@10 1941 if (!(avctx->codec->capabilities & CODEC_CAP_DR1)) {
yading@10 1942 if (!picture->sample_aspect_ratio.num) picture->sample_aspect_ratio = avctx->sample_aspect_ratio;
yading@10 1943 if (!picture->width) picture->width = avctx->width;
yading@10 1944 if (!picture->height) picture->height = avctx->height;
yading@10 1945 if (picture->format == AV_PIX_FMT_NONE) picture->format = avctx->pix_fmt;
yading@10 1946 }
yading@10 1947 }
yading@10 1948 add_metadata_from_side_data(avctx, picture);
yading@10 1949
yading@10 1950 emms_c(); //needed to avoid an emms_c() call before every return;
yading@10 1951
yading@10 1952 avctx->pkt = NULL;
yading@10 1953 if (did_split) {
yading@10 1954 ff_packet_free_side_data(&tmp);
yading@10 1955 if(ret == tmp.size)
yading@10 1956 ret = avpkt->size;
yading@10 1957 }
yading@10 1958
yading@10 1959 if (ret < 0 && picture->data[0])
yading@10 1960 av_frame_unref(picture);
yading@10 1961
yading@10 1962 if (*got_picture_ptr) {
yading@10 1963 if (!avctx->refcounted_frames) {
yading@10 1964 avci->to_free = *picture;
yading@10 1965 avci->to_free.extended_data = avci->to_free.data;
yading@10 1966 }
yading@10 1967
yading@10 1968 avctx->frame_number++;
yading@10 1969 av_frame_set_best_effort_timestamp(picture,
yading@10 1970 guess_correct_pts(avctx,
yading@10 1971 picture->pkt_pts,
yading@10 1972 picture->pkt_dts));
yading@10 1973 }
yading@10 1974 } else
yading@10 1975 ret = 0;
yading@10 1976
yading@10 1977 /* many decoders assign whole AVFrames, thus overwriting extended_data;
yading@10 1978 * make sure it's set correctly */
yading@10 1979 picture->extended_data = picture->data;
yading@10 1980
yading@10 1981 return ret;
yading@10 1982 }
yading@10 1983
yading@10 1984 #if FF_API_OLD_DECODE_AUDIO
yading@10 1985 int attribute_align_arg avcodec_decode_audio3(AVCodecContext *avctx, int16_t *samples,
yading@10 1986 int *frame_size_ptr,
yading@10 1987 AVPacket *avpkt)
yading@10 1988 {
yading@10 1989 AVFrame frame = { { 0 } };
yading@10 1990 int ret, got_frame = 0;
yading@10 1991
yading@10 1992 if (avctx->get_buffer != avcodec_default_get_buffer) {
yading@10 1993 av_log(avctx, AV_LOG_ERROR, "Custom get_buffer() for use with"
yading@10 1994 "avcodec_decode_audio3() detected. Overriding with avcodec_default_get_buffer\n");
yading@10 1995 av_log(avctx, AV_LOG_ERROR, "Please port your application to "
yading@10 1996 "avcodec_decode_audio4()\n");
yading@10 1997 avctx->get_buffer = avcodec_default_get_buffer;
yading@10 1998 avctx->release_buffer = avcodec_default_release_buffer;
yading@10 1999 }
yading@10 2000
yading@10 2001 ret = avcodec_decode_audio4(avctx, &frame, &got_frame, avpkt);
yading@10 2002
yading@10 2003 if (ret >= 0 && got_frame) {
yading@10 2004 int ch, plane_size;
yading@10 2005 int planar = av_sample_fmt_is_planar(avctx->sample_fmt);
yading@10 2006 int data_size = av_samples_get_buffer_size(&plane_size, avctx->channels,
yading@10 2007 frame.nb_samples,
yading@10 2008 avctx->sample_fmt, 1);
yading@10 2009 if (*frame_size_ptr < data_size) {
yading@10 2010 av_log(avctx, AV_LOG_ERROR, "output buffer size is too small for "
yading@10 2011 "the current frame (%d < %d)\n", *frame_size_ptr, data_size);
yading@10 2012 return AVERROR(EINVAL);
yading@10 2013 }
yading@10 2014
yading@10 2015 memcpy(samples, frame.extended_data[0], plane_size);
yading@10 2016
yading@10 2017 if (planar && avctx->channels > 1) {
yading@10 2018 uint8_t *out = ((uint8_t *)samples) + plane_size;
yading@10 2019 for (ch = 1; ch < avctx->channels; ch++) {
yading@10 2020 memcpy(out, frame.extended_data[ch], plane_size);
yading@10 2021 out += plane_size;
yading@10 2022 }
yading@10 2023 }
yading@10 2024 *frame_size_ptr = data_size;
yading@10 2025 } else {
yading@10 2026 *frame_size_ptr = 0;
yading@10 2027 }
yading@10 2028 return ret;
yading@10 2029 }
yading@10 2030
yading@10 2031 #endif
yading@10 2032
yading@10 2033 int attribute_align_arg avcodec_decode_audio4(AVCodecContext *avctx,
yading@10 2034 AVFrame *frame,
yading@10 2035 int *got_frame_ptr,
yading@10 2036 const AVPacket *avpkt)
yading@10 2037 {
yading@10 2038 AVCodecInternal *avci = avctx->internal;
yading@10 2039 int planar, channels;
yading@10 2040 int ret = 0;
yading@10 2041
yading@10 2042 *got_frame_ptr = 0;
yading@10 2043
yading@10 2044 if (!avpkt->data && avpkt->size) {
yading@10 2045 av_log(avctx, AV_LOG_ERROR, "invalid packet: NULL data, size != 0\n");
yading@10 2046 return AVERROR(EINVAL);
yading@10 2047 }
yading@10 2048 if (avctx->codec->type != AVMEDIA_TYPE_AUDIO) {
yading@10 2049 av_log(avctx, AV_LOG_ERROR, "Invalid media type for audio\n");
yading@10 2050 return AVERROR(EINVAL);
yading@10 2051 }
yading@10 2052
yading@10 2053 avcodec_get_frame_defaults(frame);
yading@10 2054
yading@10 2055 if (!avctx->refcounted_frames)
yading@10 2056 av_frame_unref(&avci->to_free);
yading@10 2057
yading@10 2058 if ((avctx->codec->capabilities & CODEC_CAP_DELAY) || avpkt->size) {
yading@10 2059 uint8_t *side;
yading@10 2060 int side_size;
yading@10 2061 // copy to ensure we do not change avpkt
yading@10 2062 AVPacket tmp = *avpkt;
yading@10 2063 int did_split = av_packet_split_side_data(&tmp);
yading@10 2064 apply_param_change(avctx, &tmp);
yading@10 2065
yading@10 2066 avctx->pkt = &tmp;
yading@10 2067 ret = avctx->codec->decode(avctx, frame, got_frame_ptr, &tmp);
yading@10 2068 if (ret >= 0 && *got_frame_ptr) {
yading@10 2069 add_metadata_from_side_data(avctx, frame);
yading@10 2070 avctx->frame_number++;
yading@10 2071 frame->pkt_dts = avpkt->dts;
yading@10 2072 av_frame_set_best_effort_timestamp(frame,
yading@10 2073 guess_correct_pts(avctx,
yading@10 2074 frame->pkt_pts,
yading@10 2075 frame->pkt_dts));
yading@10 2076 if (frame->format == AV_SAMPLE_FMT_NONE)
yading@10 2077 frame->format = avctx->sample_fmt;
yading@10 2078 if (!frame->channel_layout)
yading@10 2079 frame->channel_layout = avctx->channel_layout;
yading@10 2080 if (!av_frame_get_channels(frame))
yading@10 2081 av_frame_set_channels(frame, avctx->channels);
yading@10 2082 if (!frame->sample_rate)
yading@10 2083 frame->sample_rate = avctx->sample_rate;
yading@10 2084 if (!avctx->refcounted_frames) {
yading@10 2085 avci->to_free = *frame;
yading@10 2086 avci->to_free.extended_data = avci->to_free.data;
yading@10 2087 }
yading@10 2088 }
yading@10 2089
yading@10 2090 side= av_packet_get_side_data(avctx->pkt, AV_PKT_DATA_SKIP_SAMPLES, &side_size);
yading@10 2091 if(side && side_size>=10) {
yading@10 2092 avctx->internal->skip_samples = AV_RL32(side);
yading@10 2093 av_log(avctx, AV_LOG_DEBUG, "skip %d samples due to side data\n",
yading@10 2094 avctx->internal->skip_samples);
yading@10 2095 }
yading@10 2096 if (avctx->internal->skip_samples && *got_frame_ptr) {
yading@10 2097 if(frame->nb_samples <= avctx->internal->skip_samples){
yading@10 2098 *got_frame_ptr = 0;
yading@10 2099 avctx->internal->skip_samples -= frame->nb_samples;
yading@10 2100 av_log(avctx, AV_LOG_DEBUG, "skip whole frame, skip left: %d\n",
yading@10 2101 avctx->internal->skip_samples);
yading@10 2102 } else {
yading@10 2103 av_samples_copy(frame->extended_data, frame->extended_data, 0, avctx->internal->skip_samples,
yading@10 2104 frame->nb_samples - avctx->internal->skip_samples, avctx->channels, frame->format);
yading@10 2105 if(avctx->pkt_timebase.num && avctx->sample_rate) {
yading@10 2106 int64_t diff_ts = av_rescale_q(avctx->internal->skip_samples,
yading@10 2107 (AVRational){1, avctx->sample_rate},
yading@10 2108 avctx->pkt_timebase);
yading@10 2109 if(frame->pkt_pts!=AV_NOPTS_VALUE)
yading@10 2110 frame->pkt_pts += diff_ts;
yading@10 2111 if(frame->pkt_dts!=AV_NOPTS_VALUE)
yading@10 2112 frame->pkt_dts += diff_ts;
yading@10 2113 if (av_frame_get_pkt_duration(frame) >= diff_ts)
yading@10 2114 av_frame_set_pkt_duration(frame, av_frame_get_pkt_duration(frame) - diff_ts);
yading@10 2115 } else {
yading@10 2116 av_log(avctx, AV_LOG_WARNING, "Could not update timestamps for skipped samples.\n");
yading@10 2117 }
yading@10 2118 av_log(avctx, AV_LOG_DEBUG, "skip %d/%d samples\n",
yading@10 2119 avctx->internal->skip_samples, frame->nb_samples);
yading@10 2120 frame->nb_samples -= avctx->internal->skip_samples;
yading@10 2121 avctx->internal->skip_samples = 0;
yading@10 2122 }
yading@10 2123 }
yading@10 2124
yading@10 2125 avctx->pkt = NULL;
yading@10 2126 if (did_split) {
yading@10 2127 ff_packet_free_side_data(&tmp);
yading@10 2128 if(ret == tmp.size)
yading@10 2129 ret = avpkt->size;
yading@10 2130 }
yading@10 2131
yading@10 2132 if (ret < 0 && frame->data[0])
yading@10 2133 av_frame_unref(frame);
yading@10 2134 }
yading@10 2135
yading@10 2136 /* many decoders assign whole AVFrames, thus overwriting extended_data;
yading@10 2137 * make sure it's set correctly; assume decoders that actually use
yading@10 2138 * extended_data are doing it correctly */
yading@10 2139 if (*got_frame_ptr) {
yading@10 2140 planar = av_sample_fmt_is_planar(frame->format);
yading@10 2141 channels = av_frame_get_channels(frame);
yading@10 2142 if (!(planar && channels > AV_NUM_DATA_POINTERS))
yading@10 2143 frame->extended_data = frame->data;
yading@10 2144 } else {
yading@10 2145 frame->extended_data = NULL;
yading@10 2146 }
yading@10 2147
yading@10 2148 return ret;
yading@10 2149 }
yading@10 2150
yading@10 2151 #define UTF8_MAX_BYTES 4 /* 5 and 6 bytes sequences should not be used */
yading@10 2152 static int recode_subtitle(AVCodecContext *avctx,
yading@10 2153 AVPacket *outpkt, const AVPacket *inpkt)
yading@10 2154 {
yading@10 2155 #if CONFIG_ICONV
yading@10 2156 iconv_t cd = (iconv_t)-1;
yading@10 2157 int ret = 0;
yading@10 2158 char *inb, *outb;
yading@10 2159 size_t inl, outl;
yading@10 2160 AVPacket tmp;
yading@10 2161 #endif
yading@10 2162
yading@10 2163 if (avctx->sub_charenc_mode != FF_SUB_CHARENC_MODE_PRE_DECODER)
yading@10 2164 return 0;
yading@10 2165
yading@10 2166 #if CONFIG_ICONV
yading@10 2167 cd = iconv_open("UTF-8", avctx->sub_charenc);
yading@10 2168 av_assert0(cd != (iconv_t)-1);
yading@10 2169
yading@10 2170 inb = inpkt->data;
yading@10 2171 inl = inpkt->size;
yading@10 2172
yading@10 2173 if (inl >= INT_MAX / UTF8_MAX_BYTES - FF_INPUT_BUFFER_PADDING_SIZE) {
yading@10 2174 av_log(avctx, AV_LOG_ERROR, "Subtitles packet is too big for recoding\n");
yading@10 2175 ret = AVERROR(ENOMEM);
yading@10 2176 goto end;
yading@10 2177 }
yading@10 2178
yading@10 2179 ret = av_new_packet(&tmp, inl * UTF8_MAX_BYTES);
yading@10 2180 if (ret < 0)
yading@10 2181 goto end;
yading@10 2182 outpkt->buf = tmp.buf;
yading@10 2183 outpkt->data = tmp.data;
yading@10 2184 outpkt->size = tmp.size;
yading@10 2185 outb = outpkt->data;
yading@10 2186 outl = outpkt->size;
yading@10 2187
yading@10 2188 if (iconv(cd, &inb, &inl, &outb, &outl) == (size_t)-1 ||
yading@10 2189 iconv(cd, NULL, NULL, &outb, &outl) == (size_t)-1 ||
yading@10 2190 outl >= outpkt->size || inl != 0) {
yading@10 2191 av_log(avctx, AV_LOG_ERROR, "Unable to recode subtitle event \"%s\" "
yading@10 2192 "from %s to UTF-8\n", inpkt->data, avctx->sub_charenc);
yading@10 2193 av_free_packet(&tmp);
yading@10 2194 ret = AVERROR(errno);
yading@10 2195 goto end;
yading@10 2196 }
yading@10 2197 outpkt->size -= outl;
yading@10 2198 memset(outpkt->data + outpkt->size, 0, outl);
yading@10 2199
yading@10 2200 end:
yading@10 2201 if (cd != (iconv_t)-1)
yading@10 2202 iconv_close(cd);
yading@10 2203 return ret;
yading@10 2204 #else
yading@10 2205 av_assert0(!"requesting subtitles recoding without iconv");
yading@10 2206 #endif
yading@10 2207 }
yading@10 2208
yading@10 2209 int avcodec_decode_subtitle2(AVCodecContext *avctx, AVSubtitle *sub,
yading@10 2210 int *got_sub_ptr,
yading@10 2211 AVPacket *avpkt)
yading@10 2212 {
yading@10 2213 int ret = 0;
yading@10 2214
yading@10 2215 if (avctx->codec->type != AVMEDIA_TYPE_SUBTITLE) {
yading@10 2216 av_log(avctx, AV_LOG_ERROR, "Invalid media type for subtitles\n");
yading@10 2217 return AVERROR(EINVAL);
yading@10 2218 }
yading@10 2219
yading@10 2220 *got_sub_ptr = 0;
yading@10 2221 avcodec_get_subtitle_defaults(sub);
yading@10 2222
yading@10 2223 if (avpkt->size) {
yading@10 2224 AVPacket pkt_recoded;
yading@10 2225 AVPacket tmp = *avpkt;
yading@10 2226 int did_split = av_packet_split_side_data(&tmp);
yading@10 2227 //apply_param_change(avctx, &tmp);
yading@10 2228
yading@10 2229 pkt_recoded = tmp;
yading@10 2230 ret = recode_subtitle(avctx, &pkt_recoded, &tmp);
yading@10 2231 if (ret < 0) {
yading@10 2232 *got_sub_ptr = 0;
yading@10 2233 } else {
yading@10 2234 avctx->pkt = &pkt_recoded;
yading@10 2235
yading@10 2236 if (avctx->pkt_timebase.den && avpkt->pts != AV_NOPTS_VALUE)
yading@10 2237 sub->pts = av_rescale_q(avpkt->pts,
yading@10 2238 avctx->pkt_timebase, AV_TIME_BASE_Q);
yading@10 2239 ret = avctx->codec->decode(avctx, sub, got_sub_ptr, &pkt_recoded);
yading@10 2240 av_assert1((ret >= 0) >= !!*got_sub_ptr &&
yading@10 2241 !!*got_sub_ptr >= !!sub->num_rects);
yading@10 2242
yading@10 2243 if (sub->num_rects && !sub->end_display_time && avpkt->duration &&
yading@10 2244 avctx->pkt_timebase.num) {
yading@10 2245 AVRational ms = { 1, 1000 };
yading@10 2246 sub->end_display_time = av_rescale_q(avpkt->duration,
yading@10 2247 avctx->pkt_timebase, ms);
yading@10 2248 }
yading@10 2249
yading@10 2250 if (tmp.data != pkt_recoded.data) { // did we recode?
yading@10 2251 /* prevent from destroying side data from original packet */
yading@10 2252 pkt_recoded.side_data = NULL;
yading@10 2253 pkt_recoded.side_data_elems = 0;
yading@10 2254
yading@10 2255 av_free_packet(&pkt_recoded);
yading@10 2256 }
yading@10 2257 sub->format = !(avctx->codec_descriptor->props & AV_CODEC_PROP_BITMAP_SUB);
yading@10 2258 avctx->pkt = NULL;
yading@10 2259 }
yading@10 2260
yading@10 2261 if (did_split) {
yading@10 2262 ff_packet_free_side_data(&tmp);
yading@10 2263 if(ret == tmp.size)
yading@10 2264 ret = avpkt->size;
yading@10 2265 }
yading@10 2266
yading@10 2267 if (*got_sub_ptr)
yading@10 2268 avctx->frame_number++;
yading@10 2269 }
yading@10 2270
yading@10 2271 return ret;
yading@10 2272 }
yading@10 2273
yading@10 2274 void avsubtitle_free(AVSubtitle *sub)
yading@10 2275 {
yading@10 2276 int i;
yading@10 2277
yading@10 2278 for (i = 0; i < sub->num_rects; i++) {
yading@10 2279 av_freep(&sub->rects[i]->pict.data[0]);
yading@10 2280 av_freep(&sub->rects[i]->pict.data[1]);
yading@10 2281 av_freep(&sub->rects[i]->pict.data[2]);
yading@10 2282 av_freep(&sub->rects[i]->pict.data[3]);
yading@10 2283 av_freep(&sub->rects[i]->text);
yading@10 2284 av_freep(&sub->rects[i]->ass);
yading@10 2285 av_freep(&sub->rects[i]);
yading@10 2286 }
yading@10 2287
yading@10 2288 av_freep(&sub->rects);
yading@10 2289
yading@10 2290 memset(sub, 0, sizeof(AVSubtitle));
yading@10 2291 }
yading@10 2292
yading@10 2293 av_cold int ff_codec_close_recursive(AVCodecContext *avctx)
yading@10 2294 {
yading@10 2295 int ret = 0;
yading@10 2296
yading@10 2297 ff_unlock_avcodec();
yading@10 2298
yading@10 2299 ret = avcodec_close(avctx);
yading@10 2300
yading@10 2301 ff_lock_avcodec(NULL);
yading@10 2302 return ret;
yading@10 2303 }
yading@10 2304
yading@10 2305 av_cold int avcodec_close(AVCodecContext *avctx)
yading@10 2306 {
yading@10 2307 int ret = ff_lock_avcodec(avctx);
yading@10 2308 if (ret < 0)
yading@10 2309 return ret;
yading@10 2310
yading@10 2311 if (avcodec_is_open(avctx)) {
yading@10 2312 FramePool *pool = avctx->internal->pool;
yading@10 2313 int i;
yading@10 2314 if (CONFIG_FRAME_THREAD_ENCODER &&
yading@10 2315 avctx->internal->frame_thread_encoder && avctx->thread_count > 1) {
yading@10 2316 ff_unlock_avcodec();
yading@10 2317 ff_frame_thread_encoder_free(avctx);
yading@10 2318 ff_lock_avcodec(avctx);
yading@10 2319 }
yading@10 2320 if (HAVE_THREADS && avctx->thread_opaque)
yading@10 2321 ff_thread_free(avctx);
yading@10 2322 if (avctx->codec && avctx->codec->close)
yading@10 2323 avctx->codec->close(avctx);
yading@10 2324 avctx->coded_frame = NULL;
yading@10 2325 avctx->internal->byte_buffer_size = 0;
yading@10 2326 av_freep(&avctx->internal->byte_buffer);
yading@10 2327 if (!avctx->refcounted_frames)
yading@10 2328 av_frame_unref(&avctx->internal->to_free);
yading@10 2329 for (i = 0; i < FF_ARRAY_ELEMS(pool->pools); i++)
yading@10 2330 av_buffer_pool_uninit(&pool->pools[i]);
yading@10 2331 av_freep(&avctx->internal->pool);
yading@10 2332 av_freep(&avctx->internal);
yading@10 2333 }
yading@10 2334
yading@10 2335 if (avctx->priv_data && avctx->codec && avctx->codec->priv_class)
yading@10 2336 av_opt_free(avctx->priv_data);
yading@10 2337 av_opt_free(avctx);
yading@10 2338 av_freep(&avctx->priv_data);
yading@10 2339 if (av_codec_is_encoder(avctx->codec))
yading@10 2340 av_freep(&avctx->extradata);
yading@10 2341 avctx->codec = NULL;
yading@10 2342 avctx->active_thread_type = 0;
yading@10 2343
yading@10 2344 ff_unlock_avcodec();
yading@10 2345 return 0;
yading@10 2346 }
yading@10 2347
yading@10 2348 static enum AVCodecID remap_deprecated_codec_id(enum AVCodecID id)
yading@10 2349 {
yading@10 2350 switch(id){
yading@10 2351 //This is for future deprecatec codec ids, its empty since
yading@10 2352 //last major bump but will fill up again over time, please don't remove it
yading@10 2353 // case AV_CODEC_ID_UTVIDEO_DEPRECATED: return AV_CODEC_ID_UTVIDEO;
yading@10 2354 case AV_CODEC_ID_OPUS_DEPRECATED: return AV_CODEC_ID_OPUS;
yading@10 2355 case AV_CODEC_ID_TAK_DEPRECATED : return AV_CODEC_ID_TAK;
yading@10 2356 default : return id;
yading@10 2357 }
yading@10 2358 }
yading@10 2359
yading@10 2360 static AVCodec *find_encdec(enum AVCodecID id, int encoder)
yading@10 2361 {
yading@10 2362 AVCodec *p, *experimental = NULL;
yading@10 2363 p = first_avcodec;
yading@10 2364 id= remap_deprecated_codec_id(id);
yading@10 2365 while (p) {
yading@10 2366 if ((encoder ? av_codec_is_encoder(p) : av_codec_is_decoder(p)) &&
yading@10 2367 p->id == id) {
yading@10 2368 if (p->capabilities & CODEC_CAP_EXPERIMENTAL && !experimental) {
yading@10 2369 experimental = p;
yading@10 2370 } else
yading@10 2371 return p;
yading@10 2372 }
yading@10 2373 p = p->next;
yading@10 2374 }
yading@10 2375 return experimental;
yading@10 2376 }
yading@10 2377
yading@10 2378 AVCodec *avcodec_find_encoder(enum AVCodecID id)
yading@10 2379 {
yading@10 2380 return find_encdec(id, 1);
yading@10 2381 }
yading@10 2382
yading@10 2383 AVCodec *avcodec_find_encoder_by_name(const char *name)
yading@10 2384 {
yading@10 2385 AVCodec *p;
yading@10 2386 if (!name)
yading@10 2387 return NULL;
yading@10 2388 p = first_avcodec;
yading@10 2389 while (p) {
yading@10 2390 if (av_codec_is_encoder(p) && strcmp(name, p->name) == 0)
yading@10 2391 return p;
yading@10 2392 p = p->next;
yading@10 2393 }
yading@10 2394 return NULL;
yading@10 2395 }
yading@10 2396
yading@10 2397 AVCodec *avcodec_find_decoder(enum AVCodecID id)
yading@10 2398 {
yading@10 2399 return find_encdec(id, 0);
yading@10 2400 }
yading@10 2401
yading@10 2402 AVCodec *avcodec_find_decoder_by_name(const char *name)
yading@10 2403 {
yading@10 2404 AVCodec *p;
yading@10 2405 if (!name)
yading@10 2406 return NULL;
yading@10 2407 p = first_avcodec;
yading@10 2408 while (p) {
yading@10 2409 if (av_codec_is_decoder(p) && strcmp(name, p->name) == 0)
yading@10 2410 return p;
yading@10 2411 p = p->next;
yading@10 2412 }
yading@10 2413 return NULL;
yading@10 2414 }
yading@10 2415
yading@10 2416 const char *avcodec_get_name(enum AVCodecID id)
yading@10 2417 {
yading@10 2418 const AVCodecDescriptor *cd;
yading@10 2419 AVCodec *codec;
yading@10 2420
yading@10 2421 if (id == AV_CODEC_ID_NONE)
yading@10 2422 return "none";
yading@10 2423 cd = avcodec_descriptor_get(id);
yading@10 2424 if (cd)
yading@10 2425 return cd->name;
yading@10 2426 av_log(NULL, AV_LOG_WARNING, "Codec 0x%x is not in the full list.\n", id);
yading@10 2427 codec = avcodec_find_decoder(id);
yading@10 2428 if (codec)
yading@10 2429 return codec->name;
yading@10 2430 codec = avcodec_find_encoder(id);
yading@10 2431 if (codec)
yading@10 2432 return codec->name;
yading@10 2433 return "unknown_codec";
yading@10 2434 }
yading@10 2435
yading@10 2436 size_t av_get_codec_tag_string(char *buf, size_t buf_size, unsigned int codec_tag)
yading@10 2437 {
yading@10 2438 int i, len, ret = 0;
yading@10 2439
yading@10 2440 #define TAG_PRINT(x) \
yading@10 2441 (((x) >= '0' && (x) <= '9') || \
yading@10 2442 ((x) >= 'a' && (x) <= 'z') || ((x) >= 'A' && (x) <= 'Z') || \
yading@10 2443 ((x) == '.' || (x) == ' ' || (x) == '-' || (x) == '_'))
yading@10 2444
yading@10 2445 for (i = 0; i < 4; i++) {
yading@10 2446 len = snprintf(buf, buf_size,
yading@10 2447 TAG_PRINT(codec_tag & 0xFF) ? "%c" : "[%d]", codec_tag & 0xFF);
yading@10 2448 buf += len;
yading@10 2449 buf_size = buf_size > len ? buf_size - len : 0;
yading@10 2450 ret += len;
yading@10 2451 codec_tag >>= 8;
yading@10 2452 }
yading@10 2453 return ret;
yading@10 2454 }
yading@10 2455
yading@10 2456 void avcodec_string(char *buf, int buf_size, AVCodecContext *enc, int encode)
yading@10 2457 {
yading@10 2458 const char *codec_type;
yading@10 2459 const char *codec_name;
yading@10 2460 const char *profile = NULL;
yading@10 2461 const AVCodec *p;
yading@10 2462 int bitrate;
yading@10 2463 AVRational display_aspect_ratio;
yading@10 2464
yading@10 2465 if (!buf || buf_size <= 0)
yading@10 2466 return;
yading@10 2467 codec_type = av_get_media_type_string(enc->codec_type);
yading@10 2468 codec_name = avcodec_get_name(enc->codec_id);
yading@10 2469 if (enc->profile != FF_PROFILE_UNKNOWN) {
yading@10 2470 if (enc->codec)
yading@10 2471 p = enc->codec;
yading@10 2472 else
yading@10 2473 p = encode ? avcodec_find_encoder(enc->codec_id) :
yading@10 2474 avcodec_find_decoder(enc->codec_id);
yading@10 2475 if (p)
yading@10 2476 profile = av_get_profile_name(p, enc->profile);
yading@10 2477 }
yading@10 2478
yading@10 2479 snprintf(buf, buf_size, "%s: %s%s", codec_type ? codec_type : "unknown",
yading@10 2480 codec_name, enc->mb_decision ? " (hq)" : "");
yading@10 2481 buf[0] ^= 'a' ^ 'A'; /* first letter in uppercase */
yading@10 2482 if (profile)
yading@10 2483 snprintf(buf + strlen(buf), buf_size - strlen(buf), " (%s)", profile);
yading@10 2484 if (enc->codec_tag) {
yading@10 2485 char tag_buf[32];
yading@10 2486 av_get_codec_tag_string(tag_buf, sizeof(tag_buf), enc->codec_tag);
yading@10 2487 snprintf(buf + strlen(buf), buf_size - strlen(buf),
yading@10 2488 " (%s / 0x%04X)", tag_buf, enc->codec_tag);
yading@10 2489 }
yading@10 2490
yading@10 2491 switch (enc->codec_type) {
yading@10 2492 case AVMEDIA_TYPE_VIDEO:
yading@10 2493 if (enc->pix_fmt != AV_PIX_FMT_NONE) {
yading@10 2494 snprintf(buf + strlen(buf), buf_size - strlen(buf),
yading@10 2495 ", %s",
yading@10 2496 av_get_pix_fmt_name(enc->pix_fmt));
yading@10 2497 if (enc->bits_per_raw_sample &&
yading@10 2498 enc->bits_per_raw_sample <= av_pix_fmt_desc_get(enc->pix_fmt)->comp[0].depth_minus1)
yading@10 2499 snprintf(buf + strlen(buf), buf_size - strlen(buf),
yading@10 2500 " (%d bpc)", enc->bits_per_raw_sample);
yading@10 2501 }
yading@10 2502 if (enc->width) {
yading@10 2503 snprintf(buf + strlen(buf), buf_size - strlen(buf),
yading@10 2504 ", %dx%d",
yading@10 2505 enc->width, enc->height);
yading@10 2506 if (enc->sample_aspect_ratio.num) {
yading@10 2507 av_reduce(&display_aspect_ratio.num, &display_aspect_ratio.den,
yading@10 2508 enc->width * enc->sample_aspect_ratio.num,
yading@10 2509 enc->height * enc->sample_aspect_ratio.den,
yading@10 2510 1024 * 1024);
yading@10 2511 snprintf(buf + strlen(buf), buf_size - strlen(buf),
yading@10 2512 " [SAR %d:%d DAR %d:%d]",
yading@10 2513 enc->sample_aspect_ratio.num, enc->sample_aspect_ratio.den,
yading@10 2514 display_aspect_ratio.num, display_aspect_ratio.den);
yading@10 2515 }
yading@10 2516 if (av_log_get_level() >= AV_LOG_DEBUG) {
yading@10 2517 int g = av_gcd(enc->time_base.num, enc->time_base.den);
yading@10 2518 snprintf(buf + strlen(buf), buf_size - strlen(buf),
yading@10 2519 ", %d/%d",
yading@10 2520 enc->time_base.num / g, enc->time_base.den / g);
yading@10 2521 }
yading@10 2522 }
yading@10 2523 if (encode) {
yading@10 2524 snprintf(buf + strlen(buf), buf_size - strlen(buf),
yading@10 2525 ", q=%d-%d", enc->qmin, enc->qmax);
yading@10 2526 }
yading@10 2527 break;
yading@10 2528 case AVMEDIA_TYPE_AUDIO:
yading@10 2529 if (enc->sample_rate) {
yading@10 2530 snprintf(buf + strlen(buf), buf_size - strlen(buf),
yading@10 2531 ", %d Hz", enc->sample_rate);
yading@10 2532 }
yading@10 2533 av_strlcat(buf, ", ", buf_size);
yading@10 2534 av_get_channel_layout_string(buf + strlen(buf), buf_size - strlen(buf), enc->channels, enc->channel_layout);
yading@10 2535 if (enc->sample_fmt != AV_SAMPLE_FMT_NONE) {
yading@10 2536 snprintf(buf + strlen(buf), buf_size - strlen(buf),
yading@10 2537 ", %s", av_get_sample_fmt_name(enc->sample_fmt));
yading@10 2538 }
yading@10 2539 break;
yading@10 2540 case AVMEDIA_TYPE_DATA:
yading@10 2541 if (av_log_get_level() >= AV_LOG_DEBUG) {
yading@10 2542 int g = av_gcd(enc->time_base.num, enc->time_base.den);
yading@10 2543 if (g)
yading@10 2544 snprintf(buf + strlen(buf), buf_size - strlen(buf),
yading@10 2545 ", %d/%d",
yading@10 2546 enc->time_base.num / g, enc->time_base.den / g);
yading@10 2547 }
yading@10 2548 break;
yading@10 2549 default:
yading@10 2550 return;
yading@10 2551 }
yading@10 2552 if (encode) {
yading@10 2553 if (enc->flags & CODEC_FLAG_PASS1)
yading@10 2554 snprintf(buf + strlen(buf), buf_size - strlen(buf),
yading@10 2555 ", pass 1");
yading@10 2556 if (enc->flags & CODEC_FLAG_PASS2)
yading@10 2557 snprintf(buf + strlen(buf), buf_size - strlen(buf),
yading@10 2558 ", pass 2");
yading@10 2559 }
yading@10 2560 bitrate = get_bit_rate(enc);
yading@10 2561 if (bitrate != 0) {
yading@10 2562 snprintf(buf + strlen(buf), buf_size - strlen(buf),
yading@10 2563 ", %d kb/s", bitrate / 1000);
yading@10 2564 }
yading@10 2565 }
yading@10 2566
yading@10 2567 const char *av_get_profile_name(const AVCodec *codec, int profile)
yading@10 2568 {
yading@10 2569 const AVProfile *p;
yading@10 2570 if (profile == FF_PROFILE_UNKNOWN || !codec->profiles)
yading@10 2571 return NULL;
yading@10 2572
yading@10 2573 for (p = codec->profiles; p->profile != FF_PROFILE_UNKNOWN; p++)
yading@10 2574 if (p->profile == profile)
yading@10 2575 return p->name;
yading@10 2576
yading@10 2577 return NULL;
yading@10 2578 }
yading@10 2579
yading@10 2580 unsigned avcodec_version(void)
yading@10 2581 {
yading@10 2582 // av_assert0(AV_CODEC_ID_V410==164);
yading@10 2583 av_assert0(AV_CODEC_ID_PCM_S8_PLANAR==65563);
yading@10 2584 av_assert0(AV_CODEC_ID_ADPCM_G722==69660);
yading@10 2585 // av_assert0(AV_CODEC_ID_BMV_AUDIO==86071);
yading@10 2586 av_assert0(AV_CODEC_ID_SRT==94216);
yading@10 2587 av_assert0(LIBAVCODEC_VERSION_MICRO >= 100);
yading@10 2588
yading@10 2589 av_assert0(CODEC_ID_CLLC == AV_CODEC_ID_CLLC);
yading@10 2590 av_assert0(CODEC_ID_PCM_S8_PLANAR == AV_CODEC_ID_PCM_S8_PLANAR);
yading@10 2591 av_assert0(CODEC_ID_ADPCM_IMA_APC == AV_CODEC_ID_ADPCM_IMA_APC);
yading@10 2592 av_assert0(CODEC_ID_ILBC == AV_CODEC_ID_ILBC);
yading@10 2593 av_assert0(CODEC_ID_SRT == AV_CODEC_ID_SRT);
yading@10 2594 return LIBAVCODEC_VERSION_INT;
yading@10 2595 }
yading@10 2596
yading@10 2597 const char *avcodec_configuration(void)
yading@10 2598 {
yading@10 2599 return FFMPEG_CONFIGURATION;
yading@10 2600 }
yading@10 2601
yading@10 2602 const char *avcodec_license(void)
yading@10 2603 {
yading@10 2604 #define LICENSE_PREFIX "libavcodec license: "
yading@10 2605 return LICENSE_PREFIX FFMPEG_LICENSE + sizeof(LICENSE_PREFIX) - 1;
yading@10 2606 }
yading@10 2607
yading@10 2608 void avcodec_flush_buffers(AVCodecContext *avctx)
yading@10 2609 {
yading@10 2610 if (HAVE_THREADS && avctx->active_thread_type & FF_THREAD_FRAME)
yading@10 2611 ff_thread_flush(avctx);
yading@10 2612 else if (avctx->codec->flush)
yading@10 2613 avctx->codec->flush(avctx);
yading@10 2614
yading@10 2615 avctx->pts_correction_last_pts =
yading@10 2616 avctx->pts_correction_last_dts = INT64_MIN;
yading@10 2617 }
yading@10 2618
yading@10 2619 int av_get_exact_bits_per_sample(enum AVCodecID codec_id)
yading@10 2620 {
yading@10 2621 switch (codec_id) {
yading@10 2622 case AV_CODEC_ID_8SVX_EXP:
yading@10 2623 case AV_CODEC_ID_8SVX_FIB:
yading@10 2624 case AV_CODEC_ID_ADPCM_CT:
yading@10 2625 case AV_CODEC_ID_ADPCM_IMA_APC:
yading@10 2626 case AV_CODEC_ID_ADPCM_IMA_EA_SEAD:
yading@10 2627 case AV_CODEC_ID_ADPCM_IMA_OKI:
yading@10 2628 case AV_CODEC_ID_ADPCM_IMA_WS:
yading@10 2629 case AV_CODEC_ID_ADPCM_G722:
yading@10 2630 case AV_CODEC_ID_ADPCM_YAMAHA:
yading@10 2631 return 4;
yading@10 2632 case AV_CODEC_ID_PCM_ALAW:
yading@10 2633 case AV_CODEC_ID_PCM_MULAW:
yading@10 2634 case AV_CODEC_ID_PCM_S8:
yading@10 2635 case AV_CODEC_ID_PCM_S8_PLANAR:
yading@10 2636 case AV_CODEC_ID_PCM_U8:
yading@10 2637 case AV_CODEC_ID_PCM_ZORK:
yading@10 2638 return 8;
yading@10 2639 case AV_CODEC_ID_PCM_S16BE:
yading@10 2640 case AV_CODEC_ID_PCM_S16BE_PLANAR:
yading@10 2641 case AV_CODEC_ID_PCM_S16LE:
yading@10 2642 case AV_CODEC_ID_PCM_S16LE_PLANAR:
yading@10 2643 case AV_CODEC_ID_PCM_U16BE:
yading@10 2644 case AV_CODEC_ID_PCM_U16LE:
yading@10 2645 return 16;
yading@10 2646 case AV_CODEC_ID_PCM_S24DAUD:
yading@10 2647 case AV_CODEC_ID_PCM_S24BE:
yading@10 2648 case AV_CODEC_ID_PCM_S24LE:
yading@10 2649 case AV_CODEC_ID_PCM_S24LE_PLANAR:
yading@10 2650 case AV_CODEC_ID_PCM_U24BE:
yading@10 2651 case AV_CODEC_ID_PCM_U24LE:
yading@10 2652 return 24;
yading@10 2653 case AV_CODEC_ID_PCM_S32BE:
yading@10 2654 case AV_CODEC_ID_PCM_S32LE:
yading@10 2655 case AV_CODEC_ID_PCM_S32LE_PLANAR:
yading@10 2656 case AV_CODEC_ID_PCM_U32BE:
yading@10 2657 case AV_CODEC_ID_PCM_U32LE:
yading@10 2658 case AV_CODEC_ID_PCM_F32BE:
yading@10 2659 case AV_CODEC_ID_PCM_F32LE:
yading@10 2660 return 32;
yading@10 2661 case AV_CODEC_ID_PCM_F64BE:
yading@10 2662 case AV_CODEC_ID_PCM_F64LE:
yading@10 2663 return 64;
yading@10 2664 default:
yading@10 2665 return 0;
yading@10 2666 }
yading@10 2667 }
yading@10 2668
yading@10 2669 enum AVCodecID av_get_pcm_codec(enum AVSampleFormat fmt, int be)
yading@10 2670 {
yading@10 2671 static const enum AVCodecID map[AV_SAMPLE_FMT_NB][2] = {
yading@10 2672 [AV_SAMPLE_FMT_U8 ] = { AV_CODEC_ID_PCM_U8, AV_CODEC_ID_PCM_U8 },
yading@10 2673 [AV_SAMPLE_FMT_S16 ] = { AV_CODEC_ID_PCM_S16LE, AV_CODEC_ID_PCM_S16BE },
yading@10 2674 [AV_SAMPLE_FMT_S32 ] = { AV_CODEC_ID_PCM_S32LE, AV_CODEC_ID_PCM_S32BE },
yading@10 2675 [AV_SAMPLE_FMT_FLT ] = { AV_CODEC_ID_PCM_F32LE, AV_CODEC_ID_PCM_F32BE },
yading@10 2676 [AV_SAMPLE_FMT_DBL ] = { AV_CODEC_ID_PCM_F64LE, AV_CODEC_ID_PCM_F64BE },
yading@10 2677 [AV_SAMPLE_FMT_U8P ] = { AV_CODEC_ID_PCM_U8, AV_CODEC_ID_PCM_U8 },
yading@10 2678 [AV_SAMPLE_FMT_S16P] = { AV_CODEC_ID_PCM_S16LE, AV_CODEC_ID_PCM_S16BE },
yading@10 2679 [AV_SAMPLE_FMT_S32P] = { AV_CODEC_ID_PCM_S32LE, AV_CODEC_ID_PCM_S32BE },
yading@10 2680 [AV_SAMPLE_FMT_FLTP] = { AV_CODEC_ID_PCM_F32LE, AV_CODEC_ID_PCM_F32BE },
yading@10 2681 [AV_SAMPLE_FMT_DBLP] = { AV_CODEC_ID_PCM_F64LE, AV_CODEC_ID_PCM_F64BE },
yading@10 2682 };
yading@10 2683 if (fmt < 0 || fmt >= AV_SAMPLE_FMT_NB)
yading@10 2684 return AV_CODEC_ID_NONE;
yading@10 2685 if (be < 0 || be > 1)
yading@10 2686 be = AV_NE(1, 0);
yading@10 2687 return map[fmt][be];
yading@10 2688 }
yading@10 2689
yading@10 2690 int av_get_bits_per_sample(enum AVCodecID codec_id)
yading@10 2691 {
yading@10 2692 switch (codec_id) {
yading@10 2693 case AV_CODEC_ID_ADPCM_SBPRO_2:
yading@10 2694 return 2;
yading@10 2695 case AV_CODEC_ID_ADPCM_SBPRO_3:
yading@10 2696 return 3;
yading@10 2697 case AV_CODEC_ID_ADPCM_SBPRO_4:
yading@10 2698 case AV_CODEC_ID_ADPCM_IMA_WAV:
yading@10 2699 case AV_CODEC_ID_ADPCM_IMA_QT:
yading@10 2700 case AV_CODEC_ID_ADPCM_SWF:
yading@10 2701 case AV_CODEC_ID_ADPCM_MS:
yading@10 2702 return 4;
yading@10 2703 default:
yading@10 2704 return av_get_exact_bits_per_sample(codec_id);
yading@10 2705 }
yading@10 2706 }
yading@10 2707
yading@10 2708 int av_get_audio_frame_duration(AVCodecContext *avctx, int frame_bytes)
yading@10 2709 {
yading@10 2710 int id, sr, ch, ba, tag, bps;
yading@10 2711
yading@10 2712 id = avctx->codec_id;
yading@10 2713 sr = avctx->sample_rate;
yading@10 2714 ch = avctx->channels;
yading@10 2715 ba = avctx->block_align;
yading@10 2716 tag = avctx->codec_tag;
yading@10 2717 bps = av_get_exact_bits_per_sample(avctx->codec_id);
yading@10 2718
yading@10 2719 /* codecs with an exact constant bits per sample */
yading@10 2720 if (bps > 0 && ch > 0 && frame_bytes > 0 && ch < 32768 && bps < 32768)
yading@10 2721 return (frame_bytes * 8LL) / (bps * ch);
yading@10 2722 bps = avctx->bits_per_coded_sample;
yading@10 2723
yading@10 2724 /* codecs with a fixed packet duration */
yading@10 2725 switch (id) {
yading@10 2726 case AV_CODEC_ID_ADPCM_ADX: return 32;
yading@10 2727 case AV_CODEC_ID_ADPCM_IMA_QT: return 64;
yading@10 2728 case AV_CODEC_ID_ADPCM_EA_XAS: return 128;
yading@10 2729 case AV_CODEC_ID_AMR_NB:
yading@10 2730 case AV_CODEC_ID_EVRC:
yading@10 2731 case AV_CODEC_ID_GSM:
yading@10 2732 case AV_CODEC_ID_QCELP:
yading@10 2733 case AV_CODEC_ID_RA_288: return 160;
yading@10 2734 case AV_CODEC_ID_AMR_WB:
yading@10 2735 case AV_CODEC_ID_GSM_MS: return 320;
yading@10 2736 case AV_CODEC_ID_MP1: return 384;
yading@10 2737 case AV_CODEC_ID_ATRAC1: return 512;
yading@10 2738 case AV_CODEC_ID_ATRAC3: return 1024;
yading@10 2739 case AV_CODEC_ID_MP2:
yading@10 2740 case AV_CODEC_ID_MUSEPACK7: return 1152;
yading@10 2741 case AV_CODEC_ID_AC3: return 1536;
yading@10 2742 }
yading@10 2743
yading@10 2744 if (sr > 0) {
yading@10 2745 /* calc from sample rate */
yading@10 2746 if (id == AV_CODEC_ID_TTA)
yading@10 2747 return 256 * sr / 245;
yading@10 2748
yading@10 2749 if (ch > 0) {
yading@10 2750 /* calc from sample rate and channels */
yading@10 2751 if (id == AV_CODEC_ID_BINKAUDIO_DCT)
yading@10 2752 return (480 << (sr / 22050)) / ch;
yading@10 2753 }
yading@10 2754 }
yading@10 2755
yading@10 2756 if (ba > 0) {
yading@10 2757 /* calc from block_align */
yading@10 2758 if (id == AV_CODEC_ID_SIPR) {
yading@10 2759 switch (ba) {
yading@10 2760 case 20: return 160;
yading@10 2761 case 19: return 144;
yading@10 2762 case 29: return 288;
yading@10 2763 case 37: return 480;
yading@10 2764 }
yading@10 2765 } else if (id == AV_CODEC_ID_ILBC) {
yading@10 2766 switch (ba) {
yading@10 2767 case 38: return 160;
yading@10 2768 case 50: return 240;
yading@10 2769 }
yading@10 2770 }
yading@10 2771 }
yading@10 2772
yading@10 2773 if (frame_bytes > 0) {
yading@10 2774 /* calc from frame_bytes only */
yading@10 2775 if (id == AV_CODEC_ID_TRUESPEECH)
yading@10 2776 return 240 * (frame_bytes / 32);
yading@10 2777 if (id == AV_CODEC_ID_NELLYMOSER)
yading@10 2778 return 256 * (frame_bytes / 64);
yading@10 2779 if (id == AV_CODEC_ID_RA_144)
yading@10 2780 return 160 * (frame_bytes / 20);
yading@10 2781 if (id == AV_CODEC_ID_G723_1)
yading@10 2782 return 240 * (frame_bytes / 24);
yading@10 2783
yading@10 2784 if (bps > 0) {
yading@10 2785 /* calc from frame_bytes and bits_per_coded_sample */
yading@10 2786 if (id == AV_CODEC_ID_ADPCM_G726)
yading@10 2787 return frame_bytes * 8 / bps;
yading@10 2788 }
yading@10 2789
yading@10 2790 if (ch > 0) {
yading@10 2791 /* calc from frame_bytes and channels */
yading@10 2792 switch (id) {
yading@10 2793 case AV_CODEC_ID_ADPCM_AFC:
yading@10 2794 return frame_bytes / (9 * ch) * 16;
yading@10 2795 case AV_CODEC_ID_ADPCM_4XM:
yading@10 2796 case AV_CODEC_ID_ADPCM_IMA_ISS:
yading@10 2797 return (frame_bytes - 4 * ch) * 2 / ch;
yading@10 2798 case AV_CODEC_ID_ADPCM_IMA_SMJPEG:
yading@10 2799 return (frame_bytes - 4) * 2 / ch;
yading@10 2800 case AV_CODEC_ID_ADPCM_IMA_AMV:
yading@10 2801 return (frame_bytes - 8) * 2 / ch;
yading@10 2802 case AV_CODEC_ID_ADPCM_XA:
yading@10 2803 return (frame_bytes / 128) * 224 / ch;
yading@10 2804 case AV_CODEC_ID_INTERPLAY_DPCM:
yading@10 2805 return (frame_bytes - 6 - ch) / ch;
yading@10 2806 case AV_CODEC_ID_ROQ_DPCM:
yading@10 2807 return (frame_bytes - 8) / ch;
yading@10 2808 case AV_CODEC_ID_XAN_DPCM:
yading@10 2809 return (frame_bytes - 2 * ch) / ch;
yading@10 2810 case AV_CODEC_ID_MACE3:
yading@10 2811 return 3 * frame_bytes / ch;
yading@10 2812 case AV_CODEC_ID_MACE6:
yading@10 2813 return 6 * frame_bytes / ch;
yading@10 2814 case AV_CODEC_ID_PCM_LXF:
yading@10 2815 return 2 * (frame_bytes / (5 * ch));
yading@10 2816 case AV_CODEC_ID_IAC:
yading@10 2817 case AV_CODEC_ID_IMC:
yading@10 2818 return 4 * frame_bytes / ch;
yading@10 2819 }
yading@10 2820
yading@10 2821 if (tag) {
yading@10 2822 /* calc from frame_bytes, channels, and codec_tag */
yading@10 2823 if (id == AV_CODEC_ID_SOL_DPCM) {
yading@10 2824 if (tag == 3)
yading@10 2825 return frame_bytes / ch;
yading@10 2826 else
yading@10 2827 return frame_bytes * 2 / ch;
yading@10 2828 }
yading@10 2829 }
yading@10 2830
yading@10 2831 if (ba > 0) {
yading@10 2832 /* calc from frame_bytes, channels, and block_align */
yading@10 2833 int blocks = frame_bytes / ba;
yading@10 2834 switch (avctx->codec_id) {
yading@10 2835 case AV_CODEC_ID_ADPCM_IMA_WAV:
yading@10 2836 return blocks * (1 + (ba - 4 * ch) / (4 * ch) * 8);
yading@10 2837 case AV_CODEC_ID_ADPCM_IMA_DK3:
yading@10 2838 return blocks * (((ba - 16) * 2 / 3 * 4) / ch);
yading@10 2839 case AV_CODEC_ID_ADPCM_IMA_DK4:
yading@10 2840 return blocks * (1 + (ba - 4 * ch) * 2 / ch);
yading@10 2841 case AV_CODEC_ID_ADPCM_MS:
yading@10 2842 return blocks * (2 + (ba - 7 * ch) * 2 / ch);
yading@10 2843 }
yading@10 2844 }
yading@10 2845
yading@10 2846 if (bps > 0) {
yading@10 2847 /* calc from frame_bytes, channels, and bits_per_coded_sample */
yading@10 2848 switch (avctx->codec_id) {
yading@10 2849 case AV_CODEC_ID_PCM_DVD:
yading@10 2850 if(bps<4)
yading@10 2851 return 0;
yading@10 2852 return 2 * (frame_bytes / ((bps * 2 / 8) * ch));
yading@10 2853 case AV_CODEC_ID_PCM_BLURAY:
yading@10 2854 if(bps<4)
yading@10 2855 return 0;
yading@10 2856 return frame_bytes / ((FFALIGN(ch, 2) * bps) / 8);
yading@10 2857 case AV_CODEC_ID_S302M:
yading@10 2858 return 2 * (frame_bytes / ((bps + 4) / 4)) / ch;
yading@10 2859 }
yading@10 2860 }
yading@10 2861 }
yading@10 2862 }
yading@10 2863
yading@10 2864 return 0;
yading@10 2865 }
yading@10 2866
yading@10 2867 #if !HAVE_THREADS
yading@10 2868 int ff_thread_init(AVCodecContext *s)
yading@10 2869 {
yading@10 2870 return -1;
yading@10 2871 }
yading@10 2872
yading@10 2873 #endif
yading@10 2874
yading@10 2875 unsigned int av_xiphlacing(unsigned char *s, unsigned int v)
yading@10 2876 {
yading@10 2877 unsigned int n = 0;
yading@10 2878
yading@10 2879 while (v >= 0xff) {
yading@10 2880 *s++ = 0xff;
yading@10 2881 v -= 0xff;
yading@10 2882 n++;
yading@10 2883 }
yading@10 2884 *s = v;
yading@10 2885 n++;
yading@10 2886 return n;
yading@10 2887 }
yading@10 2888
yading@10 2889 int ff_match_2uint16(const uint16_t(*tab)[2], int size, int a, int b)
yading@10 2890 {
yading@10 2891 int i;
yading@10 2892 for (i = 0; i < size && !(tab[i][0] == a && tab[i][1] == b); i++) ;
yading@10 2893 return i;
yading@10 2894 }
yading@10 2895
yading@10 2896 #if FF_API_MISSING_SAMPLE
yading@10 2897 void av_log_missing_feature(void *avc, const char *feature, int want_sample)
yading@10 2898 {
yading@10 2899 av_log(avc, AV_LOG_WARNING, "%s is not implemented. Update your FFmpeg "
yading@10 2900 "version to the newest one from Git. If the problem still "
yading@10 2901 "occurs, it means that your file has a feature which has not "
yading@10 2902 "been implemented.\n", feature);
yading@10 2903 if(want_sample)
yading@10 2904 av_log_ask_for_sample(avc, NULL);
yading@10 2905 }
yading@10 2906
yading@10 2907 void av_log_ask_for_sample(void *avc, const char *msg, ...)
yading@10 2908 {
yading@10 2909 va_list argument_list;
yading@10 2910
yading@10 2911 va_start(argument_list, msg);
yading@10 2912
yading@10 2913 if (msg)
yading@10 2914 av_vlog(avc, AV_LOG_WARNING, msg, argument_list);
yading@10 2915 av_log(avc, AV_LOG_WARNING, "If you want to help, upload a sample "
yading@10 2916 "of this file to ftp://upload.ffmpeg.org/MPlayer/incoming/ "
yading@10 2917 "and contact the ffmpeg-devel mailing list.\n");
yading@10 2918
yading@10 2919 va_end(argument_list);
yading@10 2920 }
yading@10 2921 #endif /* FF_API_MISSING_SAMPLE */
yading@10 2922
yading@10 2923 static AVHWAccel *first_hwaccel = NULL;
yading@10 2924
yading@10 2925 void av_register_hwaccel(AVHWAccel *hwaccel)
yading@10 2926 {
yading@10 2927 AVHWAccel **p = &first_hwaccel;
yading@10 2928 while (*p)
yading@10 2929 p = &(*p)->next;
yading@10 2930 *p = hwaccel;
yading@10 2931 hwaccel->next = NULL;
yading@10 2932 }
yading@10 2933
yading@10 2934 AVHWAccel *av_hwaccel_next(AVHWAccel *hwaccel)
yading@10 2935 {
yading@10 2936 return hwaccel ? hwaccel->next : first_hwaccel;
yading@10 2937 }
yading@10 2938
yading@10 2939 AVHWAccel *ff_find_hwaccel(enum AVCodecID codec_id, enum AVPixelFormat pix_fmt)
yading@10 2940 {
yading@10 2941 AVHWAccel *hwaccel = NULL;
yading@10 2942
yading@10 2943 while ((hwaccel = av_hwaccel_next(hwaccel)))
yading@10 2944 if (hwaccel->id == codec_id
yading@10 2945 && hwaccel->pix_fmt == pix_fmt)
yading@10 2946 return hwaccel;
yading@10 2947 return NULL;
yading@10 2948 }
yading@10 2949
yading@10 2950 int av_lockmgr_register(int (*cb)(void **mutex, enum AVLockOp op))
yading@10 2951 {
yading@10 2952 if (ff_lockmgr_cb) {
yading@10 2953 if (ff_lockmgr_cb(&codec_mutex, AV_LOCK_DESTROY))
yading@10 2954 return -1;
yading@10 2955 if (ff_lockmgr_cb(&avformat_mutex, AV_LOCK_DESTROY))
yading@10 2956 return -1;
yading@10 2957 }
yading@10 2958
yading@10 2959 ff_lockmgr_cb = cb;
yading@10 2960
yading@10 2961 if (ff_lockmgr_cb) {
yading@10 2962 if (ff_lockmgr_cb(&codec_mutex, AV_LOCK_CREATE))
yading@10 2963 return -1;
yading@10 2964 if (ff_lockmgr_cb(&avformat_mutex, AV_LOCK_CREATE))
yading@10 2965 return -1;
yading@10 2966 }
yading@10 2967 return 0;
yading@10 2968 }
yading@10 2969
yading@10 2970 int ff_lock_avcodec(AVCodecContext *log_ctx)
yading@10 2971 {
yading@10 2972 if (ff_lockmgr_cb) {
yading@10 2973 if ((*ff_lockmgr_cb)(&codec_mutex, AV_LOCK_OBTAIN))
yading@10 2974 return -1;
yading@10 2975 }
yading@10 2976 entangled_thread_counter++;
yading@10 2977 if (entangled_thread_counter != 1) {
yading@10 2978 av_log(log_ctx, AV_LOG_ERROR, "Insufficient thread locking around avcodec_open/close()\n");
yading@10 2979 ff_avcodec_locked = 1;
yading@10 2980 ff_unlock_avcodec();
yading@10 2981 return AVERROR(EINVAL);
yading@10 2982 }
yading@10 2983 av_assert0(!ff_avcodec_locked);
yading@10 2984 ff_avcodec_locked = 1;
yading@10 2985 return 0;
yading@10 2986 }
yading@10 2987
yading@10 2988 int ff_unlock_avcodec(void)
yading@10 2989 {
yading@10 2990 av_assert0(ff_avcodec_locked);
yading@10 2991 ff_avcodec_locked = 0;
yading@10 2992 entangled_thread_counter--;
yading@10 2993 if (ff_lockmgr_cb) {
yading@10 2994 if ((*ff_lockmgr_cb)(&codec_mutex, AV_LOCK_RELEASE))
yading@10 2995 return -1;
yading@10 2996 }
yading@10 2997 return 0;
yading@10 2998 }
yading@10 2999
yading@10 3000 int avpriv_lock_avformat(void)
yading@10 3001 {
yading@10 3002 if (ff_lockmgr_cb) {
yading@10 3003 if ((*ff_lockmgr_cb)(&avformat_mutex, AV_LOCK_OBTAIN))
yading@10 3004 return -1;
yading@10 3005 }
yading@10 3006 return 0;
yading@10 3007 }
yading@10 3008
yading@10 3009 int avpriv_unlock_avformat(void)
yading@10 3010 {
yading@10 3011 if (ff_lockmgr_cb) {
yading@10 3012 if ((*ff_lockmgr_cb)(&avformat_mutex, AV_LOCK_RELEASE))
yading@10 3013 return -1;
yading@10 3014 }
yading@10 3015 return 0;
yading@10 3016 }
yading@10 3017
yading@10 3018 unsigned int avpriv_toupper4(unsigned int x)
yading@10 3019 {
yading@10 3020 return av_toupper(x & 0xFF) +
yading@10 3021 (av_toupper((x >> 8) & 0xFF) << 8) +
yading@10 3022 (av_toupper((x >> 16) & 0xFF) << 16) +
yading@10 3023 (av_toupper((x >> 24) & 0xFF) << 24);
yading@10 3024 }
yading@10 3025
yading@10 3026 int ff_thread_ref_frame(ThreadFrame *dst, ThreadFrame *src)
yading@10 3027 {
yading@10 3028 int ret;
yading@10 3029
yading@10 3030 dst->owner = src->owner;
yading@10 3031
yading@10 3032 ret = av_frame_ref(dst->f, src->f);
yading@10 3033 if (ret < 0)
yading@10 3034 return ret;
yading@10 3035
yading@10 3036 if (src->progress &&
yading@10 3037 !(dst->progress = av_buffer_ref(src->progress))) {
yading@10 3038 ff_thread_release_buffer(dst->owner, dst);
yading@10 3039 return AVERROR(ENOMEM);
yading@10 3040 }
yading@10 3041
yading@10 3042 return 0;
yading@10 3043 }
yading@10 3044
yading@10 3045 #if !HAVE_THREADS
yading@10 3046
yading@10 3047 enum AVPixelFormat ff_thread_get_format(AVCodecContext *avctx, const enum AVPixelFormat *fmt)
yading@10 3048 {
yading@10 3049 return avctx->get_format(avctx, fmt);
yading@10 3050 }
yading@10 3051
yading@10 3052 int ff_thread_get_buffer(AVCodecContext *avctx, ThreadFrame *f, int flags)
yading@10 3053 {
yading@10 3054 f->owner = avctx;
yading@10 3055 return ff_get_buffer(avctx, f->f, flags);
yading@10 3056 }
yading@10 3057
yading@10 3058 void ff_thread_release_buffer(AVCodecContext *avctx, ThreadFrame *f)
yading@10 3059 {
yading@10 3060 av_frame_unref(f->f);
yading@10 3061 }
yading@10 3062
yading@10 3063 void ff_thread_finish_setup(AVCodecContext *avctx)
yading@10 3064 {
yading@10 3065 }
yading@10 3066
yading@10 3067 void ff_thread_report_progress(ThreadFrame *f, int progress, int field)
yading@10 3068 {
yading@10 3069 }
yading@10 3070
yading@10 3071 void ff_thread_await_progress(ThreadFrame *f, int progress, int field)
yading@10 3072 {
yading@10 3073 }
yading@10 3074
yading@10 3075 int ff_thread_can_start_frame(AVCodecContext *avctx)
yading@10 3076 {
yading@10 3077 return 1;
yading@10 3078 }
yading@10 3079
yading@10 3080 #endif
yading@10 3081
yading@10 3082 enum AVMediaType avcodec_get_type(enum AVCodecID codec_id)
yading@10 3083 {
yading@10 3084 AVCodec *c= avcodec_find_decoder(codec_id);
yading@10 3085 if(!c)
yading@10 3086 c= avcodec_find_encoder(codec_id);
yading@10 3087 if(c)
yading@10 3088 return c->type;
yading@10 3089
yading@10 3090 if (codec_id <= AV_CODEC_ID_NONE)
yading@10 3091 return AVMEDIA_TYPE_UNKNOWN;
yading@10 3092 else if (codec_id < AV_CODEC_ID_FIRST_AUDIO)
yading@10 3093 return AVMEDIA_TYPE_VIDEO;
yading@10 3094 else if (codec_id < AV_CODEC_ID_FIRST_SUBTITLE)
yading@10 3095 return AVMEDIA_TYPE_AUDIO;
yading@10 3096 else if (codec_id < AV_CODEC_ID_FIRST_UNKNOWN)
yading@10 3097 return AVMEDIA_TYPE_SUBTITLE;
yading@10 3098
yading@10 3099 return AVMEDIA_TYPE_UNKNOWN;
yading@10 3100 }
yading@10 3101
yading@10 3102 int avcodec_is_open(AVCodecContext *s)
yading@10 3103 {
yading@10 3104 return !!s->internal;
yading@10 3105 }
yading@10 3106
yading@10 3107 int avpriv_bprint_to_extradata(AVCodecContext *avctx, struct AVBPrint *buf)
yading@10 3108 {
yading@10 3109 int ret;
yading@10 3110 char *str;
yading@10 3111
yading@10 3112 ret = av_bprint_finalize(buf, &str);
yading@10 3113 if (ret < 0)
yading@10 3114 return ret;
yading@10 3115 avctx->extradata = str;
yading@10 3116 /* Note: the string is NUL terminated (so extradata can be read as a
yading@10 3117 * string), but the ending character is not accounted in the size (in
yading@10 3118 * binary formats you are likely not supposed to mux that character). When
yading@10 3119 * extradata is copied, it is also padded with FF_INPUT_BUFFER_PADDING_SIZE
yading@10 3120 * zeros. */
yading@10 3121 avctx->extradata_size = buf->len;
yading@10 3122 return 0;
yading@10 3123 }
yading@10 3124
yading@10 3125 const uint8_t *avpriv_find_start_code(const uint8_t *av_restrict p,
yading@10 3126 const uint8_t *end,
yading@10 3127 uint32_t *av_restrict state)
yading@10 3128 {
yading@10 3129 int i;
yading@10 3130
yading@10 3131 assert(p <= end);
yading@10 3132 if (p >= end)
yading@10 3133 return end;
yading@10 3134
yading@10 3135 for (i = 0; i < 3; i++) {
yading@10 3136 uint32_t tmp = *state << 8;
yading@10 3137 *state = tmp + *(p++);
yading@10 3138 if (tmp == 0x100 || p == end)
yading@10 3139 return p;
yading@10 3140 }
yading@10 3141
yading@10 3142 while (p < end) {
yading@10 3143 if (p[-1] > 1 ) p += 3;
yading@10 3144 else if (p[-2] ) p += 2;
yading@10 3145 else if (p[-3]|(p[-1]-1)) p++;
yading@10 3146 else {
yading@10 3147 p++;
yading@10 3148 break;
yading@10 3149 }
yading@10 3150 }
yading@10 3151
yading@10 3152 p = FFMIN(p, end) - 4;
yading@10 3153 *state = AV_RB32(p);
yading@10 3154
yading@10 3155 return p + 4;
yading@10 3156 }