60 #define DNXHD_VLC_BITS 9
61 #define DNXHD_DC_VLC_BITS 7
81 if (cid != ctx->
cid) {
120 static const uint8_t header_prefix[] = { 0x00, 0x00, 0x02, 0x80, 0x01 };
121 static const uint8_t header_prefix444[] = { 0x00, 0x00, 0x02, 0x80, 0x02 };
125 if (buf_size < 0x280) {
131 if (memcmp(buf, header_prefix, 5) && memcmp(buf, header_prefix444, 5)) {
133 "unknown header 0x%02X 0x%02X 0x%02X 0x%02X 0x%02X\n",
134 buf[0], buf[1], buf[2], buf[3], buf[4]);
142 "interlaced %d, cur field %d\n", buf[5] & 3, ctx->
cur_field);
152 if (buf[0x21] == 0x58) {
155 if (buf[0x4] == 0x2) {
164 }
else if (buf[0x21] == 0x38) {
213 "mb height too big: %d\n", ctx->
mb_height);
222 "invalid mb scan index (%d < %d).\n",
238 int i, j, index1, index2,
len,
flags;
239 int level, component, sign;
249 component = 1 + (n & 1);
258 component = (n >> 1) % 3;
274 level = (
NEG_USR32(sign ^ level, len) ^ sign) - sign;
277 block[0] = ctx->
last_dc[component];
285 while (index1 != eob_index) {
286 level = ac_level[index1];
287 flags = ac_flags[index1];
311 if (level_bias < 32 || weight_matrix[i] != level_bias)
313 level >>= level_shift;
315 block[j] = (level ^ sign) - sign;
347 int dct_linesize_luma = frame->
linesize[0];
348 int dct_linesize_chroma = frame->
linesize[1];
349 uint8_t *dest_y, *dest_u, *dest_v;
350 int dct_y_offset, dct_x_offset;
357 for (i = 0; i < 64; i++) {
364 for (i = 0; i < 8; i++) {
369 for (; i < 12; i++) {
376 dct_linesize_luma <<= 1;
377 dct_linesize_chroma <<= 1;
380 dest_y = frame->
data[0] + ((y * dct_linesize_luma) << 4) + (x << (4 +
shift1));
381 dest_u = frame->
data[1] + ((y * dct_linesize_chroma) << 4) + (x << (3 + shift1 + ctx->
is_444));
382 dest_v = frame->
data[2] + ((y * dct_linesize_chroma) << 4) + (x << (3 + shift1 + ctx->
is_444));
390 dct_y_offset = dct_linesize_luma << 3;
391 dct_x_offset = 8 <<
shift1;
396 ctx->
idsp.
idct_put(dest_y + dct_y_offset + dct_x_offset, dct_linesize_luma, ctx->
blocks[5]);
399 dct_y_offset = dct_linesize_chroma << 3;
409 ctx->
idsp.
idct_put(dest_y + dct_y_offset + dct_x_offset, dct_linesize_luma, ctx->
blocks[7]);
412 dct_y_offset = dct_linesize_chroma << 3;
416 ctx->
idsp.
idct_put(dest_u + dct_y_offset + dct_x_offset, dct_linesize_chroma, ctx->
blocks[9]);
420 ctx->
idsp.
idct_put(dest_v + dct_y_offset + dct_x_offset, dct_linesize_chroma, ctx->
blocks[11]);
436 for (x = 0; x < ctx->
mb_width; x++) {
449 int buf_size = avpkt->
size;
456 ff_dlog(avctx,
"frame size %d\n", buf_size);
492 goto decode_coding_unit;
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
This structure describes decoded (raw) audio or video data.
ptrdiff_t const GLvoid * data
void(* clear_block)(int16_t *block)
int64_t cid
compression id
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
#define AV_LOG_WARNING
Something somehow does not look correct.
const uint8_t * luma_weight
int ff_set_dimensions(AVCodecContext *s, int width, int height)
Check that the provided frame dimensions are valid and set them on the codec context.
static av_cold int init(AVCodecContext *avctx)
const CIDEntry ff_dnxhd_cid_table[]
const uint16_t * run_codes
#define DECLARE_ALIGNED(n, t, v)
AVRational sample_aspect_ratio
sample aspect ratio (0 if unknown) That is the width of a pixel divided by the height of the pixel...
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
void(* decode_dct_block)(struct DNXHDContext *ctx, int16_t *block, int n, int qscale)
int bits_per_raw_sample
Bits per sample/pixel of internal libavcodec pixel/sample format.
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_WL32 unsigned int_TMPL AV_WL24 unsigned int_TMPL AV_WL16 uint64_t_TMPL AV_WB64 unsigned int_TMPL AV_WB32 unsigned int_TMPL AV_WB24 unsigned int_TMPL AV_RB16
static av_cold int dnxhd_decode_close(AVCodecContext *avctx)
Multithreading support functions.
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_WL32 unsigned int_TMPL AV_WL24 unsigned int_TMPL AV_WL16 uint64_t_TMPL AV_WB64 unsigned int_TMPL AV_RB32
bitstream reader API header.
#define AV_LOG_VERBOSE
Detailed information.
int interlaced_frame
The content of the picture is interlaced.
unsigned int coding_unit_size
#define DNXHD_DC_VLC_BITS
#define AV_CODEC_FLAG_GRAY
Only decode/encode grayscale.
high precision timer, useful to profile code
enum AVPixelFormat pix_fmt
static int first_field(const struct video_data *s)
const uint16_t * ac_codes
#define UPDATE_CACHE(name, gb)
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
int ff_dnxhd_get_cid_table(int cid)
static const int shift1[6]
uint32_t mb_scan_index[68]
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
int flags
AV_CODEC_FLAG_*.
const char * name
Name of the codec implementation.
#define AV_PIX_FMT_YUV444P10
#define CLOSE_READER(name, gb)
Libavcodec external API header.
#define AV_CODEC_CAP_FRAME_THREADS
Codec supports frame-level multithreading.
planar YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples)
const uint8_t * chroma_weight
#define SKIP_BITS(name, gb, num)
int av_reduce(int *dst_num, int *dst_den, int64_t num, int64_t den, int64_t max)
Reduce a fraction.
static av_always_inline void dnxhd_decode_dct_block(DNXHDContext *ctx, int16_t *block, int n, int qscale, int index_bits, int level_bias, int level_shift)
enum AVPictureType pict_type
Picture type of the frame.
int width
picture width / height.
typedef void(APIENTRY *FF_PFNGLACTIVETEXTUREPROC)(GLenum texture)
static void dnxhd_decode_dct_block_10(DNXHDContext *ctx, int16_t *block, int n, int qscale)
#define LAST_SKIP_BITS(name, gb, num)
#define GET_VLC(code, name, gb, table, bits, max_depth)
If the vlc code is invalid and max_depth=1, then no bits will be removed.
uint8_t idct_permutation[64]
IDCT input permutation.
static int dnxhd_init_vlc(DNXHDContext *ctx, uint32_t cid)
#define SHOW_UBITS(name, gb, num)
static int dnxhd_decode_macroblocks(DNXHDContext *ctx, AVFrame *frame, const uint8_t *buf, int buf_size)
void(* idct_put)(uint8_t *dest, int line_size, int16_t *block)
block -> idct -> clip to unsigned 8 bit -> dest.
int cur_field
current interlaced field
av_cold void ff_blockdsp_init(BlockDSPContext *c, AVCodecContext *avctx)
int linesize[AV_NUM_DATA_POINTERS]
For video, size in bytes of each picture line.
int ff_thread_get_buffer(AVCodecContext *avctx, ThreadFrame *f, int flags)
Wrapper around get_buffer() for frame-multithreaded codecs.
main external API structure.
#define OPEN_READER(name, gb)
#define init_vlc(vlc, nb_bits, nb_codes,bits, bits_wrap, bits_size,codes, codes_wrap, codes_size,flags)
static void dnxhd_decode_dct_block_10_444(DNXHDContext *ctx, int16_t *block, int n, int qscale)
static void skip_bits1(GetBitContext *s)
static int init_get_bits(GetBitContext *s, const uint8_t *buffer, int bit_size)
Initialize GetBitContext.
#define GET_CACHE(name, gb)
const uint8_t ff_zigzag_direct[64]
#define AV_PIX_FMT_YUV422P10
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
static void dnxhd_decode_dct_block_8(DNXHDContext *ctx, int16_t *block, int n, int qscale)
static int decode(AVCodecContext *avctx, void *data, int *got_sub, AVPacket *avpkt)
#define SHOW_SBITS(name, gb, num)
common internal api header.
static unsigned bit_depth(uint64_t mask)
static int dnxhd_decode_macroblock(DNXHDContext *ctx, AVFrame *frame, int x, int y)
av_cold void ff_init_scantable(uint8_t *permutation, ScanTable *st, const uint8_t *src_scantable)
av_cold void ff_idctdsp_init(IDCTDSPContext *c, AVCodecContext *avctx)
int top_field_first
If the content is interlaced, is top field displayed first.
static int dnxhd_decode_frame(AVCodecContext *avctx, void *data, int *got_frame, AVPacket *avpkt)
VLC_TYPE(* table)[2]
code, bits
int key_frame
1 -> keyframe, 0-> not
const CIDEntry * cid_table
static int dnxhd_decode_header(DNXHDContext *ctx, AVFrame *frame, const uint8_t *buf, int buf_size, int first_field)
const char * av_get_pix_fmt_name(enum AVPixelFormat pix_fmt)
Return the short name for a pixel format, NULL in case pix_fmt is unknown.
AVPixelFormat
Pixel format.
This structure stores compressed data.
void ff_free_vlc(VLC *vlc)
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() for allocating buffers and supports custom allocators.
static av_cold int dnxhd_decode_init(AVCodecContext *avctx)