3 * Copyright (c) 2002 Fabrice Bellard
4 * Copyright (c) 2004 Roman Shaposhnik
6 * 50 Mbps (DVCPRO50) support
7 * Copyright (c) 2006 Daniel Maas <dmaas@maasdigital.com>
9 * 100 Mbps (DVCPRO HD) support
10 * Initial code by Daniel Maas <dmaas@maasdigital.com> (funded by BBC R&D)
11 * Final code by Roman Shaposhnik
13 * Many thanks to Dan Dennedy <dan@dennedy.org> for providing wealth
14 * of DV technical info.
16 * This file is part of Libav.
18 * Libav is free software; you can redistribute it and/or
19 * modify it under the terms of the GNU Lesser General Public
20 * License as published by the Free Software Foundation; either
21 * version 2.1 of the License, or (at your option) any later version.
23 * Libav is distributed in the hope that it will be useful,
24 * but WITHOUT ANY WARRANTY; without even the implied warranty of
25 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
26 * Lesser General Public License for more details.
28 * You should have received a copy of the GNU Lesser General Public
29 * License along with Libav; if not, write to the Free Software
30 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
38 #include "libavutil/imgutils.h"
39 #include "libavutil/internal.h"
40 #include "libavutil/pixdesc.h"
49 #include "simple_idct.h"
51 typedef struct BlockInfo
{
52 const uint32_t *factor_table
;
53 const uint8_t *scan_table
;
54 uint8_t pos
; /* position in block */
55 void (*idct_put
)(uint8_t *dest
, int line_size
, int16_t *block
);
56 uint8_t partial_bit_count
;
57 uint32_t partial_bit_buffer
;
61 static const int dv_iweight_bits
= 14;
63 static av_cold
int dvvideo_decode_init(AVCodecContext
*avctx
)
65 DVVideoContext
*s
= avctx
->priv_data
;
69 ff_idctdsp_init(&idsp
, avctx
);
71 for (i
= 0; i
< 64; i
++)
72 s
->dv_zigzag
[0][i
] = idsp
.idct_permutation
[ff_zigzag_direct
[i
]];
74 memcpy(s
->dv_zigzag
[1], ff_dv_zigzag248_direct
, sizeof(s
->dv_zigzag
[1]));
76 s
->idct_put
[0] = idsp
.idct_put
;
77 s
->idct_put
[1] = ff_simple_idct248_put
;
79 return ff_dvvideo_init(avctx
);
82 /* decode AC coefficients */
83 static void dv_decode_ac(GetBitContext
*gb
, BlockInfo
*mb
, int16_t *block
)
85 int last_index
= gb
->size_in_bits
;
86 const uint8_t *scan_table
= mb
->scan_table
;
87 const uint32_t *factor_table
= mb
->factor_table
;
89 int partial_bit_count
= mb
->partial_bit_count
;
90 int level
, run
, vlc_len
, index
;
92 OPEN_READER_NOSIZE(re
, gb
);
95 /* if we must parse a partial VLC, we do it here */
96 if (partial_bit_count
> 0) {
97 re_cache
= re_cache
>> partial_bit_count
|
98 mb
->partial_bit_buffer
;
99 re_index
-= partial_bit_count
;
100 mb
->partial_bit_count
= 0;
103 /* get the AC coefficients until last_index is reached */
105 ff_dlog(NULL
, "%2d: bits=%04x index=%d\n", pos
, SHOW_UBITS(re
, gb
, 16),
107 /* our own optimized GET_RL_VLC */
108 index
= NEG_USR32(re_cache
, TEX_VLC_BITS
);
109 vlc_len
= ff_dv_rl_vlc
[index
].len
;
111 index
= NEG_USR32((unsigned) re_cache
<< TEX_VLC_BITS
, -vlc_len
) +
112 ff_dv_rl_vlc
[index
].level
;
113 vlc_len
= TEX_VLC_BITS
- vlc_len
;
115 level
= ff_dv_rl_vlc
[index
].level
;
116 run
= ff_dv_rl_vlc
[index
].run
;
118 /* gotta check if we're still within gb boundaries */
119 if (re_index
+ vlc_len
> last_index
) {
120 /* should be < 16 bits otherwise a codeword could have been parsed */
121 mb
->partial_bit_count
= last_index
- re_index
;
122 mb
->partial_bit_buffer
= re_cache
& ~(-1u >> mb
->partial_bit_count
);
123 re_index
= last_index
;
128 ff_dlog(NULL
, "run=%d level=%d\n", run
, level
);
133 level
= (level
* factor_table
[pos
] + (1 << (dv_iweight_bits
- 1))) >>
135 block
[scan_table
[pos
]] = level
;
137 UPDATE_CACHE(re
, gb
);
139 CLOSE_READER(re
, gb
);
143 static inline void bit_copy(PutBitContext
*pb
, GetBitContext
*gb
)
145 int bits_left
= get_bits_left(gb
);
146 while (bits_left
>= MIN_CACHE_BITS
) {
147 put_bits(pb
, MIN_CACHE_BITS
, get_bits(gb
, MIN_CACHE_BITS
));
148 bits_left
-= MIN_CACHE_BITS
;
151 put_bits(pb
, bits_left
, get_bits(gb
, bits_left
));
154 /* mb_x and mb_y are in units of 8 pixels */
155 static int dv_decode_video_segment(AVCodecContext
*avctx
, void *arg
)
157 DVVideoContext
*s
= avctx
->priv_data
;
158 DVwork_chunk
*work_chunk
= arg
;
159 int quant
, dc
, dct_mode
, class1
, j
;
160 int mb_index
, mb_x
, mb_y
, last_index
;
161 int y_stride
, linesize
;
162 int16_t *block
, *block1
;
165 const uint8_t *buf_ptr
;
166 PutBitContext pb
, vs_pb
;
168 BlockInfo mb_data
[5 * DV_MAX_BPM
], *mb
, *mb1
;
169 LOCAL_ALIGNED_16(int16_t, sblock
, [5 * DV_MAX_BPM
], [64]);
170 LOCAL_ALIGNED_16(uint8_t, mb_bit_buffer
, [80 + AV_INPUT_BUFFER_PADDING_SIZE
]); /* allow some slack */
171 LOCAL_ALIGNED_16(uint8_t, vs_bit_buffer
, [80 * 5 + AV_INPUT_BUFFER_PADDING_SIZE
]); /* allow some slack */
172 const int log2_blocksize
= 3;
173 int is_field_mode
[5];
175 assert((((int) mb_bit_buffer
) & 7) == 0);
176 assert((((int) vs_bit_buffer
) & 7) == 0);
178 memset(sblock
, 0, 5 * DV_MAX_BPM
* sizeof(*sblock
));
180 /* pass 1: read DC and AC coefficients in blocks */
181 buf_ptr
= &s
->buf
[work_chunk
->buf_offset
* 80];
182 block1
= &sblock
[0][0];
184 init_put_bits(&vs_pb
, vs_bit_buffer
, 5 * 80);
185 for (mb_index
= 0; mb_index
< 5; mb_index
++, mb1
+= s
->sys
->bpm
, block1
+= s
->sys
->bpm
* 64) {
187 quant
= buf_ptr
[3] & 0x0f;
189 init_put_bits(&pb
, mb_bit_buffer
, 80);
192 is_field_mode
[mb_index
] = 0;
193 for (j
= 0; j
< s
->sys
->bpm
; j
++) {
194 last_index
= s
->sys
->block_sizes
[j
];
195 init_get_bits(&gb
, buf_ptr
, last_index
);
198 dc
= get_sbits(&gb
, 9);
199 dct_mode
= get_bits1(&gb
);
200 class1
= get_bits(&gb
, 2);
201 if (DV_PROFILE_IS_HD(s
->sys
)) {
202 mb
->idct_put
= s
->idct_put
[0];
203 mb
->scan_table
= s
->dv_zigzag
[0];
204 mb
->factor_table
= &s
->idct_factor
[(j
>= 4) * 4 * 16 * 64 +
207 is_field_mode
[mb_index
] |= !j
&& dct_mode
;
209 mb
->idct_put
= s
->idct_put
[dct_mode
&& log2_blocksize
== 3];
210 mb
->scan_table
= s
->dv_zigzag
[dct_mode
];
212 &s
->idct_factor
[(class1
== 3) * 2 * 22 * 64 +
214 (quant
+ ff_dv_quant_offset
[class1
]) * 64];
217 /* convert to unsigned because 128 is not added in the
221 buf_ptr
+= last_index
>> 3;
223 mb
->partial_bit_count
= 0;
225 ff_dlog(avctx
, "MB block: %d, %d ", mb_index
, j
);
226 dv_decode_ac(&gb
, mb
, block
);
228 /* write the remaining bits in a new buffer only if the
229 * block is finished */
237 /* pass 2: we can do it just after */
238 ff_dlog(avctx
, "***pass 2 size=%d MB#=%d\n", put_bits_count(&pb
), mb_index
);
241 init_get_bits(&gb
, mb_bit_buffer
, put_bits_count(&pb
));
242 put_bits32(&pb
, 0); // padding must be zeroed
244 for (j
= 0; j
< s
->sys
->bpm
; j
++, block
+= 64, mb
++) {
245 if (mb
->pos
< 64 && get_bits_left(&gb
) > 0) {
246 dv_decode_ac(&gb
, mb
, block
);
247 /* if still not finished, no need to parse other blocks */
252 /* all blocks are finished, so the extra bytes can be used at
253 * the video segment level */
254 if (j
>= s
->sys
->bpm
)
255 bit_copy(&vs_pb
, &gb
);
258 /* we need a pass over the whole video segment */
259 ff_dlog(avctx
, "***pass 3 size=%d\n", put_bits_count(&vs_pb
));
260 block
= &sblock
[0][0];
262 init_get_bits(&gb
, vs_bit_buffer
, put_bits_count(&vs_pb
));
263 put_bits32(&vs_pb
, 0); // padding must be zeroed
264 flush_put_bits(&vs_pb
);
265 for (mb_index
= 0; mb_index
< 5; mb_index
++) {
266 for (j
= 0; j
< s
->sys
->bpm
; j
++) {
268 ff_dlog(avctx
, "start %d:%d\n", mb_index
, j
);
269 dv_decode_ac(&gb
, mb
, block
);
271 if (mb
->pos
>= 64 && mb
->pos
< 127)
272 av_log(avctx
, AV_LOG_ERROR
,
273 "AC EOB marker is absent pos=%d\n", mb
->pos
);
279 /* compute idct and place blocks */
280 block
= &sblock
[0][0];
282 for (mb_index
= 0; mb_index
< 5; mb_index
++) {
283 dv_calculate_mb_xy(s
, work_chunk
, mb_index
, &mb_x
, &mb_y
);
285 /* idct_put'ting luminance */
286 if ((s
->sys
->pix_fmt
== AV_PIX_FMT_YUV420P
) ||
287 (s
->sys
->pix_fmt
== AV_PIX_FMT_YUV411P
&& mb_x
>= (704 / 8)) ||
288 (s
->sys
->height
>= 720 && mb_y
!= 134)) {
289 y_stride
= (s
->frame
->linesize
[0] <<
290 ((!is_field_mode
[mb_index
]) * log2_blocksize
));
292 y_stride
= (2 << log2_blocksize
);
294 y_ptr
= s
->frame
->data
[0] +
295 ((mb_y
* s
->frame
->linesize
[0] + mb_x
) << log2_blocksize
);
296 linesize
= s
->frame
->linesize
[0] << is_field_mode
[mb_index
];
297 mb
[0].idct_put(y_ptr
, linesize
, block
+ 0 * 64);
298 if (s
->sys
->video_stype
== 4) { /* SD 422 */
299 mb
[2].idct_put(y_ptr
+ (1 << log2_blocksize
), linesize
, block
+ 2 * 64);
301 mb
[1].idct_put(y_ptr
+ (1 << log2_blocksize
), linesize
, block
+ 1 * 64);
302 mb
[2].idct_put(y_ptr
+ y_stride
, linesize
, block
+ 2 * 64);
303 mb
[3].idct_put(y_ptr
+ (1 << log2_blocksize
) + y_stride
, linesize
, block
+ 3 * 64);
308 /* idct_put'ting chrominance */
309 c_offset
= (((mb_y
>> (s
->sys
->pix_fmt
== AV_PIX_FMT_YUV420P
)) * s
->frame
->linesize
[1] +
310 (mb_x
>> ((s
->sys
->pix_fmt
== AV_PIX_FMT_YUV411P
) ?
2 : 1))) << log2_blocksize
);
311 for (j
= 2; j
; j
--) {
312 uint8_t *c_ptr
= s
->frame
->data
[j
] + c_offset
;
313 if (s
->sys
->pix_fmt
== AV_PIX_FMT_YUV411P
&& mb_x
>= (704 / 8)) {
314 uint64_t aligned_pixels
[64 / 8];
315 uint8_t *pixels
= (uint8_t *) aligned_pixels
;
316 uint8_t *c_ptr1
, *ptr1
;
318 mb
->idct_put(pixels
, 8, block
);
319 for (y
= 0; y
< (1 << log2_blocksize
); y
++, c_ptr
+= s
->frame
->linesize
[j
], pixels
+= 8) {
320 ptr1
= pixels
+ (1 << (log2_blocksize
- 1));
321 c_ptr1
= c_ptr
+ (s
->frame
->linesize
[j
] << log2_blocksize
);
322 for (x
= 0; x
< (1 << (log2_blocksize
- 1)); x
++) {
323 c_ptr
[x
] = pixels
[x
];
330 y_stride
= (mb_y
== 134) ?
(1 << log2_blocksize
) :
331 s
->frame
->linesize
[j
] << ((!is_field_mode
[mb_index
]) * log2_blocksize
);
332 linesize
= s
->frame
->linesize
[j
] << is_field_mode
[mb_index
];
333 (mb
++)->idct_put(c_ptr
, linesize
, block
);
335 if (s
->sys
->bpm
== 8) {
336 (mb
++)->idct_put(c_ptr
+ y_stride
, linesize
, block
);
345 /* NOTE: exactly one frame must be given (120000 bytes for NTSC,
346 * 144000 bytes for PAL - or twice those for 50Mbps) */
347 static int dvvideo_decode_frame(AVCodecContext
*avctx
, void *data
,
348 int *got_frame
, AVPacket
*avpkt
)
350 uint8_t *buf
= avpkt
->data
;
351 int buf_size
= avpkt
->size
;
352 DVVideoContext
*s
= avctx
->priv_data
;
353 const uint8_t *vsc_pack
;
354 int apt
, is16_9
, ret
;
355 const AVDVProfile
*sys
;
357 sys
= av_dv_frame_profile(s
->sys
, buf
, buf_size
);
358 if (!sys
|| buf_size
< sys
->frame_size
) {
359 av_log(avctx
, AV_LOG_ERROR
, "could not find dv frame profile\n");
360 return -1; /* NOTE: we only accept several full frames */
364 ret
= ff_dv_init_dynamic_tables(s
, sys
);
366 av_log(avctx
, AV_LOG_ERROR
, "Error initializing the work tables.\n");
373 s
->frame
->key_frame
= 1;
374 s
->frame
->pict_type
= AV_PICTURE_TYPE_I
;
375 avctx
->pix_fmt
= s
->sys
->pix_fmt
;
376 avctx
->framerate
= av_inv_q(s
->sys
->time_base
);
378 ret
= ff_set_dimensions(avctx
, s
->sys
->width
, s
->sys
->height
);
382 /* Determine the codec's sample_aspect ratio from the packet */
383 vsc_pack
= buf
+ 80 * 5 + 48 + 5;
384 if (*vsc_pack
== dv_video_control
) {
386 is16_9
= (vsc_pack
[2] & 0x07) == 0x02 ||
387 (!apt
&& (vsc_pack
[2] & 0x07) == 0x07);
388 ff_set_sar(avctx
, s
->sys
->sar
[is16_9
]);
391 if (ff_get_buffer(avctx
, s
->frame
, 0) < 0) {
392 av_log(avctx
, AV_LOG_ERROR
, "get_buffer() failed\n");
395 s
->frame
->interlaced_frame
= 1;
396 s
->frame
->top_field_first
= 0;
399 avctx
->execute(avctx
, dv_decode_video_segment
, s
->work_chunks
, NULL
,
400 dv_work_pool_size(s
->sys
), sizeof(DVwork_chunk
));
407 return s
->sys
->frame_size
;
410 AVCodec ff_dvvideo_decoder
= {
412 .long_name
= NULL_IF_CONFIG_SMALL("DV (Digital Video)"),
413 .type
= AVMEDIA_TYPE_VIDEO
,
414 .id
= AV_CODEC_ID_DVVIDEO
,
415 .priv_data_size
= sizeof(DVVideoContext
),
416 .init
= dvvideo_decode_init
,
417 .decode
= dvvideo_decode_frame
,
418 .capabilities
= AV_CODEC_CAP_DR1
| AV_CODEC_CAP_SLICE_THREADS
,