3 * Copyright (c) 2002 Fabrice Bellard.
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2 of the License, or (at your option) any later version.
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with this library; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21 #include "mpegvideo.h"
22 #include "simple_idct.h"
24 #define NTSC_FRAME_SIZE 120000
25 #define PAL_FRAME_SIZE 144000
27 #define TEX_VLC_BITS 9
29 typedef struct DVVideoDecodeContext
{
30 AVCodecContext
*avctx
;
33 int sampling_411
; /* 0 = 420, 1 = 411 */
35 UINT8
*current_picture
[3]; /* picture structure */
38 DCTELEM block
[5*6][64] __align8
;
39 UINT8 dv_zigzag
[2][64];
40 UINT8 idct_permutation
[64];
41 /* XXX: move it to static storage ? */
42 UINT8 dv_shift
[2][22][64];
43 void (*idct_put
[2])(UINT8
*dest
, int line_size
, DCTELEM
*block
);
44 } DVVideoDecodeContext
;
49 /* XXX: also include quantization */
50 static RL_VLC_ELEM
*dv_rl_vlc
[1];
52 static void dv_build_unquantize_tables(DVVideoDecodeContext
*s
)
56 /* NOTE: max left shift is 6 */
57 for(q
= 0; q
< 22; q
++) {
59 for(i
= 1; i
< 64; i
++) {
61 j
= s
->idct_permutation
[i
];
62 s
->dv_shift
[0][q
][j
] =
63 dv_quant_shifts
[q
][dv_88_areas
[i
]] + 1;
67 for(i
= 1; i
< 64; i
++) {
69 s
->dv_shift
[1][q
][i
] =
70 dv_quant_shifts
[q
][dv_248_areas
[i
]] + 1;
75 static int dvvideo_decode_init(AVCodecContext
*avctx
)
77 DVVideoDecodeContext
*s
= avctx
->priv_data
;
86 /* NOTE: as a trick, we use the fact the no codes are unused
87 to accelerate the parsing of partial codes */
88 init_vlc(&dv_vlc
, TEX_VLC_BITS
, NB_DV_VLC
,
89 dv_vlc_len
, 1, 1, dv_vlc_bits
, 2, 2);
91 dv_rl_vlc
[0] = av_malloc(dv_vlc
.table_size
* sizeof(RL_VLC_ELEM
));
92 for(i
= 0; i
< dv_vlc
.table_size
; i
++){
93 int code
= dv_vlc
.table
[i
][0];
94 int len
= dv_vlc
.table
[i
][1];
97 if(len
<0){ //more bits needed
100 } else if (code
== (NB_DV_VLC
- 1)) {
105 run
= dv_vlc_run
[code
] + 1;
106 level
= dv_vlc_level
[code
];
108 dv_rl_vlc
[0][i
].len
= len
;
109 dv_rl_vlc
[0][i
].level
= level
;
110 dv_rl_vlc
[0][i
].run
= run
;
114 /* ugly way to get the idct & scantable */
116 memset(&s2
, 0, sizeof(MpegEncContext
));
118 dsputil_init(&s2
.dsp
, avctx
->dsp_mask
);
119 if (DCT_common_init(&s2
) < 0)
122 s
->idct_put
[0] = s2
.idct_put
;
123 memcpy(s
->idct_permutation
, s2
.idct_permutation
, 64);
124 memcpy(s
->dv_zigzag
[0], s2
.intra_scantable
.permutated
, 64);
126 /* XXX: use MMX also for idct248 */
127 s
->idct_put
[1] = simple_idct248_put
;
128 memcpy(s
->dv_zigzag
[1], dv_248_zigzag
, 64);
130 /* XXX: do it only for constant case */
131 dv_build_unquantize_tables(s
);
138 typedef struct BlockInfo
{
139 const UINT8
*shift_table
;
140 const UINT8
*scan_table
;
141 UINT8 pos
; /* position in block */
142 UINT8 eob_reached
; /* true if EOB has been reached */
144 UINT8 partial_bit_count
;
145 UINT16 partial_bit_buffer
;
149 /* block size in bits */
150 static const UINT16 block_sizes
[6] = {
151 112, 112, 112, 112, 80, 80
154 #ifndef ALT_BITSTREAM_READER
155 #error only works with ALT_BITSTREAM_READER
158 /* decode ac coefs */
159 static void dv_decode_ac(DVVideoDecodeContext
*s
,
160 BlockInfo
*mb
, INT16
*block
, int last_index
)
163 int shift_offset
= mb
->shift_offset
;
164 const UINT8
*scan_table
= mb
->scan_table
;
165 const UINT8
*shift_table
= mb
->shift_table
;
167 int level
, pos1
, sign
, run
;
168 int partial_bit_count
;
170 OPEN_READER(re
, &s
->gb
);
176 /* if we must parse a partial vlc, we do it here */
177 partial_bit_count
= mb
->partial_bit_count
;
178 if (partial_bit_count
> 0) {
184 /* build the dummy bit buffer */
185 l
= 16 - partial_bit_count
;
186 UPDATE_CACHE(re
, &s
->gb
);
188 printf("show=%04x\n", SHOW_UBITS(re
, &s
->gb
, 16));
190 v
= (mb
->partial_bit_buffer
<< l
) | SHOW_UBITS(re
, &s
->gb
, l
);
194 printf("v=%04x cnt=%d %04x\n",
195 v
, partial_bit_count
, (mb
->partial_bit_buffer
<< l
));
197 /* try to read the codeword */
198 init_get_bits(&gb1
, buf
, 4);
200 OPEN_READER(re1
, &gb1
);
201 UPDATE_CACHE(re1
, &gb1
);
202 GET_RL_VLC(level
, run
, re1
, &gb1
, dv_rl_vlc
[0],
205 CLOSE_READER(re1
, &gb1
);
208 printf("****run=%d level=%d size=%d\n", run
, level
, l
);
210 /* compute codeword length */
211 l1
= (level
!= 256 && level
!= 0);
212 /* if too long, we cannot parse */
213 l
-= partial_bit_count
;
214 if ((re_index
+ l
+ l1
) > last_index
)
217 last_re_index
= 0; /* avoid warning */
219 /* by definition, if we can read the vlc, all partial bits
220 will be read (otherwise we could have read the vlc before) */
221 mb
->partial_bit_count
= 0;
222 UPDATE_CACHE(re
, &s
->gb
);
226 /* get the AC coefficients until last_index is reached */
228 UPDATE_CACHE(re
, &s
->gb
);
230 printf("%2d: bits=%04x index=%d\n",
231 pos
, SHOW_UBITS(re
, &s
->gb
, 16), re_index
);
233 last_re_index
= re_index
;
234 GET_RL_VLC(level
, run
, re
, &s
->gb
, dv_rl_vlc
[0],
238 printf("run=%d level=%d\n", run
, level
);
241 if (re_index
> last_index
) {
243 /* put position before read code */
244 re_index
= last_re_index
;
251 } else if (level
!= 0) {
252 if ((re_index
+ 1) > last_index
)
254 sign
= SHOW_SBITS(re
, &s
->gb
, 1);
255 level
= (level
^ sign
) - sign
;
256 LAST_SKIP_BITS(re
, &s
->gb
, 1);
262 pos1
= scan_table
[pos
];
263 level
= level
<< (shift_table
[pos1
] + shift_offset
);
265 // printf("run=%d level=%d shift=%d\n", run, level, shift_table[pos1]);
267 if (re_index
> last_index
)
269 /* level is zero: means run without coding. No
275 #if defined(VLC_DEBUG) || 1
276 printf("error pos=%d\n", pos
);
278 /* for errors, we consider the eob is reached */
284 CLOSE_READER(re
, &s
->gb
);
288 static inline void bit_copy(PutBitContext
*pb
, GetBitContext
*gb
, int bits_left
)
290 while (bits_left
>= 16) {
291 put_bits(pb
, 16, get_bits(gb
, 16));
295 put_bits(pb
, bits_left
, get_bits(gb
, bits_left
));
299 /* mb_x and mb_y are in units of 8 pixels */
300 static inline void dv_decode_video_segment(DVVideoDecodeContext
*s
,
302 const UINT16
*mb_pos_ptr
)
304 int quant
, dc
, dct_mode
, class1
, j
;
305 int mb_index
, mb_x
, mb_y
, v
, last_index
;
306 DCTELEM
*block
, *block1
;
307 int c_offset
, bits_left
;
309 BlockInfo mb_data
[5 * 6], *mb
, *mb1
;
310 void (*idct_put
)(UINT8
*dest
, int line_size
, DCTELEM
*block
);
312 PutBitContext pb
, vs_pb
;
313 UINT8 mb_bit_buffer
[80 + 4]; /* allow some slack */
315 UINT8 vs_bit_buffer
[5 * 80 + 4]; /* allow some slack */
318 memset(s
->block
, 0, sizeof(s
->block
));
320 /* pass 1 : read DC and AC coefficients in blocks */
322 block1
= &s
->block
[0][0];
324 init_put_bits(&vs_pb
, vs_bit_buffer
, 5 * 80, NULL
, NULL
);
326 for(mb_index
= 0; mb_index
< 5; mb_index
++) {
328 quant
= buf_ptr
[3] & 0x0f;
330 init_put_bits(&pb
, mb_bit_buffer
, 80, NULL
, NULL
);
334 for(j
= 0;j
< 6; j
++) {
335 /* NOTE: size is not important here */
336 init_get_bits(&s
->gb
, buf_ptr
, 14);
339 dc
= get_bits(&s
->gb
, 9);
340 dc
= (dc
<< (32 - 9)) >> (32 - 9);
341 dct_mode
= get_bits1(&s
->gb
);
342 mb
->dct_mode
= dct_mode
;
343 mb
->scan_table
= s
->dv_zigzag
[dct_mode
];
344 class1
= get_bits(&s
->gb
, 2);
345 mb
->shift_offset
= (class1
== 3);
346 mb
->shift_table
= s
->dv_shift
[dct_mode
]
347 [quant
+ dv_quant_offset
[class1
]];
349 /* convert to unsigned because 128 is not added in the
353 last_index
= block_sizes
[j
];
354 buf_ptr
+= last_index
>> 3;
356 mb
->partial_bit_count
= 0;
358 dv_decode_ac(s
, mb
, block
, last_index
);
360 /* write the remaining bits in a new buffer only if the
362 bits_left
= last_index
- s
->gb
.index
;
363 if (mb
->eob_reached
) {
364 mb
->partial_bit_count
= 0;
365 mb_bit_count
+= bits_left
;
366 bit_copy(&pb
, &s
->gb
, bits_left
);
368 /* should be < 16 bits otherwise a codeword could have
370 mb
->partial_bit_count
= bits_left
;
371 mb
->partial_bit_buffer
= get_bits(&s
->gb
, bits_left
);
379 /* pass 2 : we can do it just after */
381 printf("***pass 2 size=%d\n", mb_bit_count
);
385 init_get_bits(&s
->gb
, mb_bit_buffer
, 80);
386 for(j
= 0;j
< 6; j
++) {
387 if (!mb
->eob_reached
&& s
->gb
.index
< mb_bit_count
) {
388 dv_decode_ac(s
, mb
, block
, mb_bit_count
);
389 /* if still not finished, no need to parse other blocks */
390 if (!mb
->eob_reached
) {
391 /* we could not parse the current AC coefficient,
392 so we add the remaining bytes */
393 bits_left
= mb_bit_count
- s
->gb
.index
;
395 mb
->partial_bit_count
+= bits_left
;
396 mb
->partial_bit_buffer
=
397 (mb
->partial_bit_buffer
<< bits_left
) |
398 get_bits(&s
->gb
, bits_left
);
406 /* all blocks are finished, so the extra bytes can be used at
407 the video segment level */
408 bits_left
= mb_bit_count
- s
->gb
.index
;
409 vs_bit_count
+= bits_left
;
410 bit_copy(&vs_pb
, &s
->gb
, bits_left
);
416 /* we need a pass other the whole video segment */
417 flush_put_bits(&vs_pb
);
420 printf("***pass 3 size=%d\n", vs_bit_count
);
422 block
= &s
->block
[0][0];
424 init_get_bits(&s
->gb
, vs_bit_buffer
, 5 * 80);
425 for(mb_index
= 0; mb_index
< 5; mb_index
++) {
426 for(j
= 0;j
< 6; j
++) {
427 if (!mb
->eob_reached
) {
429 printf("start %d:%d\n", mb_index
, j
);
431 dv_decode_ac(s
, mb
, block
, vs_bit_count
);
438 /* compute idct and place blocks */
439 block
= &s
->block
[0][0];
441 for(mb_index
= 0; mb_index
< 5; mb_index
++) {
445 y_ptr
= s
->current_picture
[0] + (mb_y
* s
->linesize
[0] * 8) + (mb_x
* 8);
447 c_offset
= (mb_y
* s
->linesize
[1] * 8) + ((mb_x
>> 2) * 8);
449 c_offset
= ((mb_y
>> 1) * s
->linesize
[1] * 8) + ((mb_x
>> 1) * 8);
450 for(j
= 0;j
< 6; j
++) {
451 idct_put
= s
->idct_put
[mb
->dct_mode
];
453 if (s
->sampling_411
&& mb_x
< (704 / 8)) {
454 /* NOTE: at end of line, the macroblock is handled as 420 */
455 idct_put(y_ptr
+ (j
* 8), s
->linesize
[0], block
);
457 idct_put(y_ptr
+ ((j
& 1) * 8) + ((j
>> 1) * 8 * s
->linesize
[0]),
458 s
->linesize
[0], block
);
461 if (s
->sampling_411
&& mb_x
>= (704 / 8)) {
462 uint8_t pixels
[64], *c_ptr
, *c_ptr1
, *ptr
;
464 /* NOTE: at end of line, the macroblock is handled as 420 */
465 idct_put(pixels
, 8, block
);
466 linesize
= s
->linesize
[6 - j
];
467 c_ptr
= s
->current_picture
[6 - j
] + c_offset
;
469 for(y
= 0;y
< 8; y
++) {
470 /* convert to 411P */
471 c_ptr1
= c_ptr
+ linesize
;
472 c_ptr1
[0] = c_ptr
[0] = (ptr
[0] + ptr
[1]) >> 1;
473 c_ptr1
[1] = c_ptr
[1] = (ptr
[2] + ptr
[3]) >> 1;
474 c_ptr1
[2] = c_ptr
[2] = (ptr
[4] + ptr
[5]) >> 1;
475 c_ptr1
[3] = c_ptr
[3] = (ptr
[6] + ptr
[7]) >> 1;
476 c_ptr
+= linesize
* 2;
480 /* don't ask me why they inverted Cb and Cr ! */
481 idct_put(s
->current_picture
[6 - j
] + c_offset
,
482 s
->linesize
[6 - j
], block
);
492 /* NOTE: exactly one frame must be given (120000 bytes for NTSC,
493 144000 bytes for PAL) */
494 static int dvvideo_decode_frame(AVCodecContext
*avctx
,
495 void *data
, int *data_size
,
496 UINT8
*buf
, int buf_size
)
498 DVVideoDecodeContext
*s
= avctx
->priv_data
;
499 int sct
, dsf
, apt
, ds
, nb_dif_segs
, vs
, width
, height
, i
, packet_size
;
502 const UINT16
*mb_pos_ptr
;
505 init_get_bits(&s
->gb
, buf
, buf_size
);
506 sct
= get_bits(&s
->gb
, 3);
509 skip_bits(&s
->gb
, 5);
510 get_bits(&s
->gb
, 4); /* dsn (sequence number */
511 get_bits(&s
->gb
, 1); /* fsc (channel number) */
512 skip_bits(&s
->gb
, 3);
513 get_bits(&s
->gb
, 8); /* dbn (diff block number 0-134) */
515 dsf
= get_bits(&s
->gb
, 1); /* 0 = NTSC 1 = PAL */
516 if (get_bits(&s
->gb
, 1) != 0)
518 skip_bits(&s
->gb
, 11);
519 apt
= get_bits(&s
->gb
, 3); /* apt */
521 get_bits(&s
->gb
, 1); /* tf1 */
522 skip_bits(&s
->gb
, 4);
523 get_bits(&s
->gb
, 3); /* ap1 */
525 get_bits(&s
->gb
, 1); /* tf2 */
526 skip_bits(&s
->gb
, 4);
527 get_bits(&s
->gb
, 3); /* ap2 */
529 get_bits(&s
->gb
, 1); /* tf3 */
530 skip_bits(&s
->gb
, 4);
531 get_bits(&s
->gb
, 3); /* ap3 */
536 avctx
->frame_rate
= 25 * FRAME_RATE_BASE
;
537 packet_size
= PAL_FRAME_SIZE
;
541 avctx
->frame_rate
= 30 * FRAME_RATE_BASE
;
542 packet_size
= NTSC_FRAME_SIZE
;
546 /* NOTE: we only accept several full frames */
547 if (buf_size
< packet_size
)
550 /* XXX: is it correct to assume that 420 is always used in PAL
552 s
->sampling_411
= !dsf
;
553 if (s
->sampling_411
) {
554 mb_pos_ptr
= dv_place_411
;
555 avctx
->pix_fmt
= PIX_FMT_YUV411P
;
557 mb_pos_ptr
= dv_place_420
;
558 avctx
->pix_fmt
= PIX_FMT_YUV420P
;
561 avctx
->width
= width
;
562 avctx
->height
= height
;
564 s
->picture
.reference
= 0;
565 if(avctx
->get_buffer(avctx
, &s
->picture
) < 0) {
566 fprintf(stderr
, "get_buffer() failed\n");
571 s
->current_picture
[i
] = s
->picture
.data
[i
];
572 s
->linesize
[i
] = s
->picture
.linesize
[i
];
573 if (!s
->current_picture
[i
])
579 /* for each DIF segment */
581 for (ds
= 0; ds
< nb_dif_segs
; ds
++) {
582 buf_ptr
+= 6 * 80; /* skip DIF segment header */
584 for(vs
= 0; vs
< 27; vs
++) {
586 /* skip audio block */
589 dv_decode_video_segment(s
, buf_ptr
, mb_pos_ptr
);
598 *data_size
= sizeof(AVFrame
);
599 *(AVFrame
*)data
= s
->picture
;
601 avctx
->release_buffer(avctx
, &s
->picture
);
606 static int dvvideo_decode_end(AVCodecContext
*avctx
)
608 DVVideoDecodeContext
*s
= avctx
->priv_data
;
611 if(avctx
->get_buffer
== avcodec_default_get_buffer
){
613 av_freep(&s
->picture
.base
[i
]);
614 s
->picture
.data
[i
]= NULL
;
616 av_freep(&s
->picture
.opaque
);
622 AVCodec dvvideo_decoder
= {
626 sizeof(DVVideoDecodeContext
),
630 dvvideo_decode_frame
,
635 typedef struct DVAudioDecodeContext
{
636 AVCodecContext
*avctx
;
639 } DVAudioDecodeContext
;
641 static int dvaudio_decode_init(AVCodecContext
*avctx
)
643 // DVAudioDecodeContext *s = avctx->priv_data;
647 /* NOTE: exactly one frame must be given (120000 bytes for NTSC,
648 144000 bytes for PAL) */
649 static int dvaudio_decode_frame(AVCodecContext
*avctx
,
650 void *data
, int *data_size
,
651 UINT8
*buf
, int buf_size
)
653 // DVAudioDecodeContext *s = avctx->priv_data;
657 static int dvaudio_decode_end(AVCodecContext
*avctx
)
659 // DVAudioDecodeContext *s = avctx->priv_data;
663 AVCodec dvaudio_decoder
= {
667 sizeof(DVAudioDecodeContext
),
671 dvaudio_decode_frame
,