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