3 * Copyright (c) 2007 SmartJog S.A., Baptiste Coudurier <baptiste dot coudurier at smartjog dot com>
4 * Copyright (c) 2011 MirriAd Ltd
6 * 10 bit support added by MirriAd Ltd, Joseph Artsimovich <joseph@mirriad.com>
8 * This file is part of Libav.
10 * Libav is free software; you can redistribute it and/or
11 * modify it under the terms of the GNU Lesser General Public
12 * License as published by the Free Software Foundation; either
13 * version 2.1 of the License, or (at your option) any later version.
15 * Libav is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 * Lesser General Public License for more details.
20 * You should have received a copy of the GNU Lesser General Public
21 * License along with Libav; if not, write to the Free Software
22 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
28 #include "libavutil/imgutils.h"
31 #include "dnxhddata.h"
35 typedef struct DNXHDContext
{
36 AVCodecContext
*avctx
;
38 int cid
; ///< compression id
39 unsigned int width
, height
;
40 unsigned int mb_width
, mb_height
;
41 uint32_t mb_scan_index
[68]; /* max for 1080p */
42 int cur_field
; ///< current interlaced field
43 VLC ac_vlc
, dc_vlc
, run_vlc
;
46 DECLARE_ALIGNED(16, int16_t, blocks
)[8][64];
48 const CIDEntry
*cid_table
;
49 int bit_depth
; // 8, 10 or 0 if not initialized at all.
50 void (*decode_dct_block
)(struct DNXHDContext
*ctx
, int16_t *block
,
54 #define DNXHD_VLC_BITS 9
55 #define DNXHD_DC_VLC_BITS 7
57 static void dnxhd_decode_dct_block_8(DNXHDContext
*ctx
, int16_t *block
, int n
, int qscale
);
58 static void dnxhd_decode_dct_block_10(DNXHDContext
*ctx
, int16_t *block
, int n
, int qscale
);
60 static av_cold
int dnxhd_decode_init(AVCodecContext
*avctx
)
62 DNXHDContext
*ctx
= avctx
->priv_data
;
68 static int dnxhd_init_vlc(DNXHDContext
*ctx
, int cid
)
70 if (cid
!= ctx
->cid
) {
73 if ((index
= ff_dnxhd_get_cid_table(cid
)) < 0) {
74 av_log(ctx
->avctx
, AV_LOG_ERROR
, "unsupported cid %d\n", cid
);
77 ctx
->cid_table
= &ff_dnxhd_cid_table
[index
];
79 ff_free_vlc(&ctx
->ac_vlc
);
80 ff_free_vlc(&ctx
->dc_vlc
);
81 ff_free_vlc(&ctx
->run_vlc
);
83 init_vlc(&ctx
->ac_vlc
, DNXHD_VLC_BITS
, 257,
84 ctx
->cid_table
->ac_bits
, 1, 1,
85 ctx
->cid_table
->ac_codes
, 2, 2, 0);
86 init_vlc(&ctx
->dc_vlc
, DNXHD_DC_VLC_BITS
, ctx
->bit_depth
+ 4,
87 ctx
->cid_table
->dc_bits
, 1, 1,
88 ctx
->cid_table
->dc_codes
, 1, 1, 0);
89 init_vlc(&ctx
->run_vlc
, DNXHD_VLC_BITS
, 62,
90 ctx
->cid_table
->run_bits
, 1, 1,
91 ctx
->cid_table
->run_codes
, 2, 2, 0);
93 ff_init_scantable(ctx
->dsp
.idct_permutation
, &ctx
->scantable
, ff_zigzag_direct
);
99 static int dnxhd_decode_header(DNXHDContext
*ctx
, AVFrame
*frame
,
100 const uint8_t *buf
, int buf_size
, int first_field
)
102 static const uint8_t header_prefix
[] = { 0x00, 0x00, 0x02, 0x80, 0x01 };
105 if (buf_size
< 0x280)
108 if (memcmp(buf
, header_prefix
, 5)) {
109 av_log(ctx
->avctx
, AV_LOG_ERROR
, "error in header\n");
112 if (buf
[5] & 2) { /* interlaced */
113 ctx
->cur_field
= buf
[5] & 1;
114 frame
->interlaced_frame
= 1;
115 frame
->top_field_first
= first_field
^ ctx
->cur_field
;
116 av_log(ctx
->avctx
, AV_LOG_DEBUG
, "interlaced %d, cur field %d\n", buf
[5] & 3, ctx
->cur_field
);
119 ctx
->height
= AV_RB16(buf
+ 0x18);
120 ctx
->width
= AV_RB16(buf
+ 0x1a);
122 av_dlog(ctx
->avctx
, "width %d, height %d\n", ctx
->width
, ctx
->height
);
124 if (buf
[0x21] & 0x40) {
125 ctx
->avctx
->pix_fmt
= AV_PIX_FMT_YUV422P10
;
126 ctx
->avctx
->bits_per_raw_sample
= 10;
127 if (ctx
->bit_depth
!= 10) {
128 ff_dsputil_init(&ctx
->dsp
, ctx
->avctx
);
130 ctx
->decode_dct_block
= dnxhd_decode_dct_block_10
;
133 ctx
->avctx
->pix_fmt
= AV_PIX_FMT_YUV422P
;
134 ctx
->avctx
->bits_per_raw_sample
= 8;
135 if (ctx
->bit_depth
!= 8) {
136 ff_dsputil_init(&ctx
->dsp
, ctx
->avctx
);
138 ctx
->decode_dct_block
= dnxhd_decode_dct_block_8
;
142 cid
= AV_RB32(buf
+ 0x28);
143 av_dlog(ctx
->avctx
, "compression id %d\n", cid
);
145 if (dnxhd_init_vlc(ctx
, cid
) < 0)
148 if (buf_size
< ctx
->cid_table
->coding_unit_size
) {
149 av_log(ctx
->avctx
, AV_LOG_ERROR
, "incorrect frame size\n");
153 ctx
->mb_width
= ctx
->width
>>4;
154 ctx
->mb_height
= buf
[0x16d];
156 av_dlog(ctx
->avctx
, "mb width %d, mb height %d\n", ctx
->mb_width
, ctx
->mb_height
);
158 if ((ctx
->height
+15)>>4 == ctx
->mb_height
&& frame
->interlaced_frame
)
161 if (ctx
->mb_height
> 68 ||
162 (ctx
->mb_height
<< frame
->interlaced_frame
) > (ctx
->height
+15)>>4) {
163 av_log(ctx
->avctx
, AV_LOG_ERROR
, "mb height too big: %d\n", ctx
->mb_height
);
167 for (i
= 0; i
< ctx
->mb_height
; i
++) {
168 ctx
->mb_scan_index
[i
] = AV_RB32(buf
+ 0x170 + (i
<<2));
169 av_dlog(ctx
->avctx
, "mb scan index %d\n", ctx
->mb_scan_index
[i
]);
170 if (buf_size
< ctx
->mb_scan_index
[i
] + 0x280) {
171 av_log(ctx
->avctx
, AV_LOG_ERROR
, "invalid mb scan index\n");
179 static av_always_inline
void dnxhd_decode_dct_block(DNXHDContext
*ctx
,
180 int16_t *block
, int n
,
186 int i
, j
, index1
, index2
, len
;
187 int level
, component
, sign
;
188 const uint8_t *weight_matrix
;
189 OPEN_READER(bs
, &ctx
->gb
);
192 component
= 1 + (n
&1);
193 weight_matrix
= ctx
->cid_table
->chroma_weight
;
196 weight_matrix
= ctx
->cid_table
->luma_weight
;
199 UPDATE_CACHE(bs
, &ctx
->gb
);
200 GET_VLC(len
, bs
, &ctx
->gb
, ctx
->dc_vlc
.table
, DNXHD_DC_VLC_BITS
, 1);
202 level
= GET_CACHE(bs
, &ctx
->gb
);
203 LAST_SKIP_BITS(bs
, &ctx
->gb
, len
);
205 level
= (NEG_USR32(sign
^ level
, len
) ^ sign
) - sign
;
206 ctx
->last_dc
[component
] += level
;
208 block
[0] = ctx
->last_dc
[component
];
211 UPDATE_CACHE(bs
, &ctx
->gb
);
212 GET_VLC(index1
, bs
, &ctx
->gb
, ctx
->ac_vlc
.table
,
214 level
= ctx
->cid_table
->ac_level
[index1
];
215 if (!level
) /* EOB */
218 sign
= SHOW_SBITS(bs
, &ctx
->gb
, 1);
219 SKIP_BITS(bs
, &ctx
->gb
, 1);
221 if (ctx
->cid_table
->ac_index_flag
[index1
]) {
222 level
+= SHOW_UBITS(bs
, &ctx
->gb
, index_bits
) << 6;
223 SKIP_BITS(bs
, &ctx
->gb
, index_bits
);
226 if (ctx
->cid_table
->ac_run_flag
[index1
]) {
227 UPDATE_CACHE(bs
, &ctx
->gb
);
228 GET_VLC(index2
, bs
, &ctx
->gb
, ctx
->run_vlc
.table
,
230 i
+= ctx
->cid_table
->run
[index2
];
234 av_log(ctx
->avctx
, AV_LOG_ERROR
, "ac tex damaged %d, %d\n", n
, i
);
238 j
= ctx
->scantable
.permutated
[i
];
239 level
= (2*level
+1) * qscale
* weight_matrix
[i
];
240 if (level_bias
< 32 || weight_matrix
[i
] != level_bias
)
242 level
>>= level_shift
;
244 block
[j
] = (level
^sign
) - sign
;
247 CLOSE_READER(bs
, &ctx
->gb
);
250 static void dnxhd_decode_dct_block_8(DNXHDContext
*ctx
, int16_t *block
,
253 dnxhd_decode_dct_block(ctx
, block
, n
, qscale
, 4, 32, 6);
256 static void dnxhd_decode_dct_block_10(DNXHDContext
*ctx
, int16_t *block
,
259 dnxhd_decode_dct_block(ctx
, block
, n
, qscale
, 6, 8, 4);
262 static int dnxhd_decode_macroblock(DNXHDContext
*ctx
, AVFrame
*frame
, int x
, int y
)
264 int shift1
= ctx
->bit_depth
== 10;
265 int dct_linesize_luma
= frame
->linesize
[0];
266 int dct_linesize_chroma
= frame
->linesize
[1];
267 uint8_t *dest_y
, *dest_u
, *dest_v
;
268 int dct_y_offset
, dct_x_offset
;
271 qscale
= get_bits(&ctx
->gb
, 11);
272 skip_bits1(&ctx
->gb
);
274 for (i
= 0; i
< 8; i
++) {
275 ctx
->dsp
.clear_block(ctx
->blocks
[i
]);
276 ctx
->decode_dct_block(ctx
, ctx
->blocks
[i
], i
, qscale
);
279 if (frame
->interlaced_frame
) {
280 dct_linesize_luma
<<= 1;
281 dct_linesize_chroma
<<= 1;
284 dest_y
= frame
->data
[0] + ((y
* dct_linesize_luma
) << 4) + (x
<< (4 + shift1
));
285 dest_u
= frame
->data
[1] + ((y
* dct_linesize_chroma
) << 4) + (x
<< (3 + shift1
));
286 dest_v
= frame
->data
[2] + ((y
* dct_linesize_chroma
) << 4) + (x
<< (3 + shift1
));
288 if (ctx
->cur_field
) {
289 dest_y
+= frame
->linesize
[0];
290 dest_u
+= frame
->linesize
[1];
291 dest_v
+= frame
->linesize
[2];
294 dct_y_offset
= dct_linesize_luma
<< 3;
295 dct_x_offset
= 8 << shift1
;
296 ctx
->dsp
.idct_put(dest_y
, dct_linesize_luma
, ctx
->blocks
[0]);
297 ctx
->dsp
.idct_put(dest_y
+ dct_x_offset
, dct_linesize_luma
, ctx
->blocks
[1]);
298 ctx
->dsp
.idct_put(dest_y
+ dct_y_offset
, dct_linesize_luma
, ctx
->blocks
[4]);
299 ctx
->dsp
.idct_put(dest_y
+ dct_y_offset
+ dct_x_offset
, dct_linesize_luma
, ctx
->blocks
[5]);
301 if (!(ctx
->avctx
->flags
& CODEC_FLAG_GRAY
)) {
302 dct_y_offset
= dct_linesize_chroma
<< 3;
303 ctx
->dsp
.idct_put(dest_u
, dct_linesize_chroma
, ctx
->blocks
[2]);
304 ctx
->dsp
.idct_put(dest_v
, dct_linesize_chroma
, ctx
->blocks
[3]);
305 ctx
->dsp
.idct_put(dest_u
+ dct_y_offset
, dct_linesize_chroma
, ctx
->blocks
[6]);
306 ctx
->dsp
.idct_put(dest_v
+ dct_y_offset
, dct_linesize_chroma
, ctx
->blocks
[7]);
312 static int dnxhd_decode_macroblocks(DNXHDContext
*ctx
, AVFrame
*frame
,
313 const uint8_t *buf
, int buf_size
)
316 for (y
= 0; y
< ctx
->mb_height
; y
++) {
319 ctx
->last_dc
[2] = 1 << (ctx
->bit_depth
+ 2); // for levels +2^(bitdepth-1)
320 init_get_bits(&ctx
->gb
, buf
+ ctx
->mb_scan_index
[y
], (buf_size
- ctx
->mb_scan_index
[y
]) << 3);
321 for (x
= 0; x
< ctx
->mb_width
; x
++) {
323 dnxhd_decode_macroblock(ctx
, frame
, x
, y
);
324 //STOP_TIMER("decode macroblock");
330 static int dnxhd_decode_frame(AVCodecContext
*avctx
, void *data
, int *got_frame
,
333 const uint8_t *buf
= avpkt
->data
;
334 int buf_size
= avpkt
->size
;
335 DNXHDContext
*ctx
= avctx
->priv_data
;
336 AVFrame
*picture
= data
;
340 av_dlog(avctx
, "frame size %d\n", buf_size
);
343 if (dnxhd_decode_header(ctx
, picture
, buf
, buf_size
, first_field
) < 0)
346 if ((avctx
->width
|| avctx
->height
) &&
347 (ctx
->width
!= avctx
->width
|| ctx
->height
!= avctx
->height
)) {
348 av_log(avctx
, AV_LOG_WARNING
, "frame size changed: %dx%d -> %dx%d\n",
349 avctx
->width
, avctx
->height
, ctx
->width
, ctx
->height
);
353 if (av_image_check_size(ctx
->width
, ctx
->height
, 0, avctx
))
355 avcodec_set_dimensions(avctx
, ctx
->width
, ctx
->height
);
358 if ((ret
= ff_get_buffer(avctx
, picture
, 0)) < 0) {
359 av_log(avctx
, AV_LOG_ERROR
, "get_buffer() failed\n");
362 picture
->pict_type
= AV_PICTURE_TYPE_I
;
363 picture
->key_frame
= 1;
366 dnxhd_decode_macroblocks(ctx
, picture
, buf
+ 0x280, buf_size
- 0x280);
368 if (first_field
&& picture
->interlaced_frame
) {
369 buf
+= ctx
->cid_table
->coding_unit_size
;
370 buf_size
-= ctx
->cid_table
->coding_unit_size
;
372 goto decode_coding_unit
;
379 static av_cold
int dnxhd_decode_close(AVCodecContext
*avctx
)
381 DNXHDContext
*ctx
= avctx
->priv_data
;
383 ff_free_vlc(&ctx
->ac_vlc
);
384 ff_free_vlc(&ctx
->dc_vlc
);
385 ff_free_vlc(&ctx
->run_vlc
);
389 AVCodec ff_dnxhd_decoder
= {
391 .type
= AVMEDIA_TYPE_VIDEO
,
392 .id
= AV_CODEC_ID_DNXHD
,
393 .priv_data_size
= sizeof(DNXHDContext
),
394 .init
= dnxhd_decode_init
,
395 .close
= dnxhd_decode_close
,
396 .decode
= dnxhd_decode_frame
,
397 .capabilities
= CODEC_CAP_DR1
,
398 .long_name
= NULL_IF_CONFIG_SMALL("VC3/DNxHD"),