mirror of https://git.ffmpeg.org/ffmpeg.git
libavcodec/dnxhd: add support more dnxhr header prefixes
Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
This commit is contained in:
parent
df9cc7f0a9
commit
ed0dc14ebb
|
@ -34,8 +34,6 @@
|
||||||
/** Frame headers, extra 0x00 added to end for parser */
|
/** Frame headers, extra 0x00 added to end for parser */
|
||||||
#define DNXHD_HEADER_INITIAL 0x000002800100
|
#define DNXHD_HEADER_INITIAL 0x000002800100
|
||||||
#define DNXHD_HEADER_444 0x000002800200
|
#define DNXHD_HEADER_444 0x000002800200
|
||||||
#define DNXHD_HEADER_HR1 0x000002800300
|
|
||||||
#define DNXHD_HEADER_HR2 0x0000038C0300
|
|
||||||
|
|
||||||
/** Indicate that a CIDEntry value must be read in the bitstream */
|
/** Indicate that a CIDEntry value must be read in the bitstream */
|
||||||
#define DNXHD_VARIABLE 0
|
#define DNXHD_VARIABLE 0
|
||||||
|
@ -65,12 +63,21 @@ int ff_dnxhd_get_cid_table(int cid);
|
||||||
int ff_dnxhd_find_cid(AVCodecContext *avctx, int bit_depth);
|
int ff_dnxhd_find_cid(AVCodecContext *avctx, int bit_depth);
|
||||||
void ff_dnxhd_print_profiles(AVCodecContext *avctx, int loglevel);
|
void ff_dnxhd_print_profiles(AVCodecContext *avctx, int loglevel);
|
||||||
|
|
||||||
|
static av_always_inline uint64_t ff_dnxhd_check_header_prefix_hr(uint64_t prefix)
|
||||||
|
{
|
||||||
|
uint64_t data_offset = prefix >> 16;
|
||||||
|
if ((prefix & 0xFFFF0000FFFFLL) == 0x0300 &&
|
||||||
|
data_offset >= 0x0280 && data_offset <= 0x2170 &&
|
||||||
|
data_offset % 4 == 0)
|
||||||
|
return prefix;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static av_always_inline uint64_t ff_dnxhd_check_header_prefix(uint64_t prefix)
|
static av_always_inline uint64_t ff_dnxhd_check_header_prefix(uint64_t prefix)
|
||||||
{
|
{
|
||||||
if (prefix == DNXHD_HEADER_INITIAL ||
|
if (prefix == DNXHD_HEADER_INITIAL ||
|
||||||
prefix == DNXHD_HEADER_444 ||
|
prefix == DNXHD_HEADER_444 ||
|
||||||
prefix == DNXHD_HEADER_HR1 ||
|
ff_dnxhd_check_header_prefix_hr(prefix))
|
||||||
prefix == DNXHD_HEADER_HR2)
|
|
||||||
return prefix;
|
return prefix;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -275,7 +275,7 @@ static int dnxhd_decode_header(DNXHDContext *ctx, AVFrame *frame,
|
||||||
ctx->bit_depth, ctx->mbaff, ctx->act);
|
ctx->bit_depth, ctx->mbaff, ctx->act);
|
||||||
|
|
||||||
// Newer format supports variable mb_scan_index sizes
|
// 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);
|
ctx->data_offset = 0x170 + (ctx->mb_height << 2);
|
||||||
} else {
|
} else {
|
||||||
if (ctx->mb_height > 68 ||
|
if (ctx->mb_height > 68 ||
|
||||||
|
|
Loading…
Reference in New Issue