X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Fdnxhddec.c;h=4d3a4a6d222897d61576974c4a2a8775407fcd88;hb=78c7197ea0e5c53393849a32dd6f49e3b89f7815;hp=18080803fa30654588c4bdf36019f1b457efcddc;hpb=bf7d0162191791abe445aadd4f0eef2667cd4cb0;p=ffmpeg diff --git a/libavcodec/dnxhddec.c b/libavcodec/dnxhddec.c index 18080803fa3..4d3a4a6d222 100644 --- a/libavcodec/dnxhddec.c +++ b/libavcodec/dnxhddec.c @@ -33,6 +33,7 @@ #include "dnxhddata.h" #include "idctdsp.h" #include "internal.h" +#include "profiles.h" #include "thread.h" typedef struct RowContext { @@ -159,6 +160,23 @@ static av_cold int dnxhd_decode_init_thread_copy(AVCodecContext *avctx) return 0; } +static int dnxhd_get_profile(int cid) +{ + switch(cid) { + case 1270: + return FF_PROFILE_DNXHR_444; + case 1271: + return FF_PROFILE_DNXHR_HQX; + case 1272: + return FF_PROFILE_DNXHR_HQ; + case 1273: + return FF_PROFILE_DNXHR_SQ; + case 1274: + return FF_PROFILE_DNXHR_LB; + } + return FF_PROFILE_DNXHD; +} + static int dnxhd_decode_header(DNXHDContext *ctx, AVFrame *frame, const uint8_t *buf, int buf_size, int first_field) @@ -172,7 +190,7 @@ static int dnxhd_decode_header(DNXHDContext *ctx, AVFrame *frame, return AVERROR_INVALIDDATA; } - header_prefix = avpriv_dnxhd_parse_header_prefix(buf); + header_prefix = ff_dnxhd_parse_header_prefix(buf); if (header_prefix == 0) { av_log(ctx->avctx, AV_LOG_ERROR, "unknown header 0x%02X 0x%02X 0x%02X 0x%02X 0x%02X\n", @@ -204,6 +222,9 @@ static int dnxhd_decode_header(DNXHDContext *ctx, AVFrame *frame, } cid = AV_RB32(buf + 0x28); + + ctx->avctx->profile = dnxhd_get_profile(cid); + if ((ret = dnxhd_init_vlc(ctx, cid, bitdepth)) < 0) return ret; if (ctx->mbaff && ctx->cid_table->cid != 1260) @@ -275,7 +296,7 @@ static int dnxhd_decode_header(DNXHDContext *ctx, AVFrame *frame, ctx->bit_depth, ctx->mbaff, ctx->act); // Newer format supports variable mb_scan_index sizes - if (header_prefix == DNXHD_HEADER_HR2) { + if (ctx->mb_height > 68 && ff_dnxhd_check_header_prefix_hr(header_prefix)) { ctx->data_offset = 0x170 + (ctx->mb_height << 2); } else { if (ctx->mb_height > 68 || @@ -692,4 +713,5 @@ AVCodec ff_dnxhd_decoder = { .capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_FRAME_THREADS | AV_CODEC_CAP_SLICE_THREADS, .init_thread_copy = ONLY_IF_THREADS_ENABLED(dnxhd_decode_init_thread_copy), + .profiles = NULL_IF_CONFIG_SMALL(ff_dnxhd_profiles), };