3 * Copyright (c) 2002 Fabrice Bellard.
4 * Copyright (c) 2004 Roman Shaposhnik.
7 * Copyright (c) 2003 Roman Shaposhnik.
9 * 50 Mbps (DVCPRO50) support
10 * Copyright (c) 2006 Daniel Maas <dmaas@maasdigital.com>
12 * Many thanks to Dan Dennedy <dan@dennedy.org> for providing wealth
13 * of DV technical info.
15 * This library is free software; you can redistribute it and/or
16 * modify it under the terms of the GNU Lesser General Public
17 * License as published by the Free Software Foundation; either
18 * version 2 of the License, or (at your option) any later version.
20 * This library is distributed in the hope that it will be useful,
21 * but WITHOUT ANY WARRANTY; without even the implied warranty of
22 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
23 * Lesser General Public License for more details.
25 * You should have received a copy of the GNU Lesser General Public
26 * License along with this library; if not, write to the Free Software
27 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
36 #include "mpegvideo.h"
37 #include "simple_idct.h"
43 typedef struct DVVideoContext
{
46 AVCodecContext
*avctx
;
49 uint8_t dv_zigzag
[2][64];
50 uint8_t dv_idct_shift
[2][2][22][64];
52 void (*get_pixels
)(DCTELEM
*block
, const uint8_t *pixels
, int line_size
);
53 void (*fdct
[2])(DCTELEM
*block
);
54 void (*idct_put
[2])(uint8_t *dest
, int line_size
, DCTELEM
*block
);
57 /* MultiThreading - dv_anchor applies to entire DV codec, not just the avcontext */
58 /* one element is needed for each video segment in a DV frame */
59 /* at most there are 2 DIF channels * 12 DIF sequences * 27 video segments (PAL 50Mbps) */
60 #define DV_ANCHOR_SIZE (2*12*27)
62 static void* dv_anchor
[DV_ANCHOR_SIZE
];
64 #define TEX_VLC_BITS 9
66 #ifdef DV_CODEC_TINY_TARGET
67 #define DV_VLC_MAP_RUN_SIZE 15
68 #define DV_VLC_MAP_LEV_SIZE 23
70 #define DV_VLC_MAP_RUN_SIZE 64
71 #define DV_VLC_MAP_LEV_SIZE 512 //FIXME sign was removed so this should be /2 but needs check
74 /* XXX: also include quantization */
75 static RL_VLC_ELEM
*dv_rl_vlc
;
76 /* VLC encoding lookup table */
77 static struct dv_vlc_pair
{
80 } (*dv_vlc_map
)[DV_VLC_MAP_LEV_SIZE
] = NULL
;
82 static void dv_build_unquantize_tables(DVVideoContext
*s
, uint8_t* perm
)
86 /* NOTE: max left shift is 6 */
87 for(q
= 0; q
< 22; q
++) {
89 for(i
= 1; i
< 64; i
++) {
92 s
->dv_idct_shift
[0][0][q
][j
] =
93 dv_quant_shifts
[q
][dv_88_areas
[i
]] + 1;
94 s
->dv_idct_shift
[1][0][q
][j
] = s
->dv_idct_shift
[0][0][q
][j
] + 1;
98 for(i
= 1; i
< 64; i
++) {
100 s
->dv_idct_shift
[0][1][q
][i
] =
101 dv_quant_shifts
[q
][dv_248_areas
[i
]] + 1;
102 s
->dv_idct_shift
[1][1][q
][i
] = s
->dv_idct_shift
[0][1][q
][i
] + 1;
107 static int dvvideo_init(AVCodecContext
*avctx
)
109 DVVideoContext
*s
= avctx
->priv_data
;
116 uint16_t new_dv_vlc_bits
[NB_DV_VLC
*2];
117 uint8_t new_dv_vlc_len
[NB_DV_VLC
*2];
118 uint8_t new_dv_vlc_run
[NB_DV_VLC
*2];
119 int16_t new_dv_vlc_level
[NB_DV_VLC
*2];
123 dv_vlc_map
= av_mallocz_static(DV_VLC_MAP_LEV_SIZE
*DV_VLC_MAP_RUN_SIZE
*sizeof(struct dv_vlc_pair
));
127 /* dv_anchor lets each thread know its Id */
128 for (i
=0; i
<DV_ANCHOR_SIZE
; i
++)
129 dv_anchor
[i
] = (void*)(size_t)i
;
131 /* it's faster to include sign bit in a generic VLC parsing scheme */
132 for (i
=0, j
=0; i
<NB_DV_VLC
; i
++, j
++) {
133 new_dv_vlc_bits
[j
] = dv_vlc_bits
[i
];
134 new_dv_vlc_len
[j
] = dv_vlc_len
[i
];
135 new_dv_vlc_run
[j
] = dv_vlc_run
[i
];
136 new_dv_vlc_level
[j
] = dv_vlc_level
[i
];
138 if (dv_vlc_level
[i
]) {
139 new_dv_vlc_bits
[j
] <<= 1;
143 new_dv_vlc_bits
[j
] = (dv_vlc_bits
[i
] << 1) | 1;
144 new_dv_vlc_len
[j
] = dv_vlc_len
[i
] + 1;
145 new_dv_vlc_run
[j
] = dv_vlc_run
[i
];
146 new_dv_vlc_level
[j
] = -dv_vlc_level
[i
];
150 /* NOTE: as a trick, we use the fact the no codes are unused
151 to accelerate the parsing of partial codes */
152 init_vlc(&dv_vlc
, TEX_VLC_BITS
, j
,
153 new_dv_vlc_len
, 1, 1, new_dv_vlc_bits
, 2, 2, 0);
155 dv_rl_vlc
= av_mallocz_static(dv_vlc
.table_size
* sizeof(RL_VLC_ELEM
));
159 for(i
= 0; i
< dv_vlc
.table_size
; i
++){
160 int code
= dv_vlc
.table
[i
][0];
161 int len
= dv_vlc
.table
[i
][1];
164 if(len
<0){ //more bits needed
168 run
= new_dv_vlc_run
[code
] + 1;
169 level
= new_dv_vlc_level
[code
];
171 dv_rl_vlc
[i
].len
= len
;
172 dv_rl_vlc
[i
].level
= level
;
173 dv_rl_vlc
[i
].run
= run
;
177 for (i
= 0; i
< NB_DV_VLC
- 1; i
++) {
178 if (dv_vlc_run
[i
] >= DV_VLC_MAP_RUN_SIZE
)
180 #ifdef DV_CODEC_TINY_TARGET
181 if (dv_vlc_level
[i
] >= DV_VLC_MAP_LEV_SIZE
)
185 if (dv_vlc_map
[dv_vlc_run
[i
]][dv_vlc_level
[i
]].size
!= 0)
188 dv_vlc_map
[dv_vlc_run
[i
]][dv_vlc_level
[i
]].vlc
= dv_vlc_bits
[i
] <<
190 dv_vlc_map
[dv_vlc_run
[i
]][dv_vlc_level
[i
]].size
= dv_vlc_len
[i
] +
193 for (i
= 0; i
< DV_VLC_MAP_RUN_SIZE
; i
++) {
194 #ifdef DV_CODEC_TINY_TARGET
195 for (j
= 1; j
< DV_VLC_MAP_LEV_SIZE
; j
++) {
196 if (dv_vlc_map
[i
][j
].size
== 0) {
197 dv_vlc_map
[i
][j
].vlc
= dv_vlc_map
[0][j
].vlc
|
198 (dv_vlc_map
[i
-1][0].vlc
<< (dv_vlc_map
[0][j
].size
));
199 dv_vlc_map
[i
][j
].size
= dv_vlc_map
[i
-1][0].size
+
200 dv_vlc_map
[0][j
].size
;
204 for (j
= 1; j
< DV_VLC_MAP_LEV_SIZE
/2; j
++) {
205 if (dv_vlc_map
[i
][j
].size
== 0) {
206 dv_vlc_map
[i
][j
].vlc
= dv_vlc_map
[0][j
].vlc
|
207 (dv_vlc_map
[i
-1][0].vlc
<< (dv_vlc_map
[0][j
].size
));
208 dv_vlc_map
[i
][j
].size
= dv_vlc_map
[i
-1][0].size
+
209 dv_vlc_map
[0][j
].size
;
211 dv_vlc_map
[i
][((uint16_t)(-j
))&0x1ff].vlc
=
212 dv_vlc_map
[i
][j
].vlc
| 1;
213 dv_vlc_map
[i
][((uint16_t)(-j
))&0x1ff].size
=
214 dv_vlc_map
[i
][j
].size
;
220 /* Generic DSP setup */
221 dsputil_init(&dsp
, avctx
);
222 s
->get_pixels
= dsp
.get_pixels
;
225 s
->fdct
[0] = dsp
.fdct
;
226 s
->idct_put
[0] = dsp
.idct_put
;
228 s
->dv_zigzag
[0][i
] = dsp
.idct_permutation
[ff_zigzag_direct
[i
]];
231 s
->fdct
[1] = dsp
.fdct248
;
232 s
->idct_put
[1] = simple_idct248_put
; // FIXME: need to add it to DSP
234 for (i
=0; i
<64; i
++){
235 int j
= ff_zigzag248_direct
[i
];
236 s
->dv_zigzag
[1][i
] = dsp
.idct_permutation
[(j
&7) + (j
&8)*4 + (j
&48)/2];
239 memcpy(s
->dv_zigzag
[1], ff_zigzag248_direct
, 64);
241 /* XXX: do it only for constant case */
242 dv_build_unquantize_tables(s
, dsp
.idct_permutation
);
244 avctx
->coded_frame
= &s
->picture
;
251 // #define printf(...) av_log(NULL, AV_LOG_ERROR, __VA_ARGS__)
253 typedef struct BlockInfo
{
254 const uint8_t *shift_table
;
255 const uint8_t *scan_table
;
256 const int *iweight_table
;
257 uint8_t pos
; /* position in block */
259 uint8_t partial_bit_count
;
260 uint16_t partial_bit_buffer
;
264 /* block size in bits */
265 static const uint16_t block_sizes
[6] = {
266 112, 112, 112, 112, 80, 80
268 /* bit budget for AC only in 5 MBs */
269 static const int vs_total_ac_bits
= (100 * 4 + 68*2) * 5;
270 /* see dv_88_areas and dv_248_areas for details */
271 static const int mb_area_start
[5] = { 1, 6, 21, 43, 64 };
273 #ifndef ALT_BITSTREAM_READER
274 #warning only works with ALT_BITSTREAM_READER
275 static int re_index
; //Hack to make it compile
278 static inline int get_bits_left(GetBitContext
*s
)
280 return s
->size_in_bits
- get_bits_count(s
);
283 static inline int get_bits_size(GetBitContext
*s
)
285 return s
->size_in_bits
;
288 static inline int put_bits_left(PutBitContext
* s
)
290 return (s
->buf_end
- s
->buf
) * 8 - put_bits_count(s
);
293 /* decode ac coefs */
294 static void dv_decode_ac(GetBitContext
*gb
, BlockInfo
*mb
, DCTELEM
*block
)
296 int last_index
= get_bits_size(gb
);
297 const uint8_t *scan_table
= mb
->scan_table
;
298 const uint8_t *shift_table
= mb
->shift_table
;
299 const int *iweight_table
= mb
->iweight_table
;
301 int partial_bit_count
= mb
->partial_bit_count
;
302 int level
, pos1
, run
, vlc_len
, index
;
305 UPDATE_CACHE(re
, gb
);
307 /* if we must parse a partial vlc, we do it here */
308 if (partial_bit_count
> 0) {
309 re_cache
= ((unsigned)re_cache
>> partial_bit_count
) |
310 (mb
->partial_bit_buffer
<< (sizeof(re_cache
)*8 - partial_bit_count
));
311 re_index
-= partial_bit_count
;
312 mb
->partial_bit_count
= 0;
315 /* get the AC coefficients until last_index is reached */
318 printf("%2d: bits=%04x index=%d\n", pos
, SHOW_UBITS(re
, gb
, 16), re_index
);
320 /* our own optimized GET_RL_VLC */
321 index
= NEG_USR32(re_cache
, TEX_VLC_BITS
);
322 vlc_len
= dv_rl_vlc
[index
].len
;
324 index
= NEG_USR32((unsigned)re_cache
<< TEX_VLC_BITS
, -vlc_len
) + dv_rl_vlc
[index
].level
;
325 vlc_len
= TEX_VLC_BITS
- vlc_len
;
327 level
= dv_rl_vlc
[index
].level
;
328 run
= dv_rl_vlc
[index
].run
;
330 /* gotta check if we're still within gb boundaries */
331 if (re_index
+ vlc_len
> last_index
) {
332 /* should be < 16 bits otherwise a codeword could have been parsed */
333 mb
->partial_bit_count
= last_index
- re_index
;
334 mb
->partial_bit_buffer
= NEG_USR32(re_cache
, mb
->partial_bit_count
);
335 re_index
= last_index
;
341 printf("run=%d level=%d\n", run
, level
);
347 pos1
= scan_table
[pos
];
348 level
<<= shift_table
[pos1
];
350 /* unweigh, round, and shift down */
351 level
= (level
*iweight_table
[pos
] + (1 << (dv_iweight_bits
-1))) >> dv_iweight_bits
;
355 UPDATE_CACHE(re
, gb
);
357 CLOSE_READER(re
, gb
);
361 static inline void bit_copy(PutBitContext
*pb
, GetBitContext
*gb
)
363 int bits_left
= get_bits_left(gb
);
364 while (bits_left
>= MIN_CACHE_BITS
) {
365 put_bits(pb
, MIN_CACHE_BITS
, get_bits(gb
, MIN_CACHE_BITS
));
366 bits_left
-= MIN_CACHE_BITS
;
369 put_bits(pb
, bits_left
, get_bits(gb
, bits_left
));
373 /* mb_x and mb_y are in units of 8 pixels */
374 static inline void dv_decode_video_segment(DVVideoContext
*s
,
376 const uint16_t *mb_pos_ptr
)
378 int quant
, dc
, dct_mode
, class1
, j
;
379 int mb_index
, mb_x
, mb_y
, v
, last_index
;
380 DCTELEM
*block
, *block1
;
383 void (*idct_put
)(uint8_t *dest
, int line_size
, DCTELEM
*block
);
385 PutBitContext pb
, vs_pb
;
387 BlockInfo mb_data
[5 * 6], *mb
, *mb1
;
388 DECLARE_ALIGNED_8(DCTELEM
, sblock
[5*6][64]);
389 DECLARE_ALIGNED_8(uint8_t, mb_bit_buffer
[80 + 4]); /* allow some slack */
390 DECLARE_ALIGNED_8(uint8_t, vs_bit_buffer
[5 * 80 + 4]); /* allow some slack */
391 const int log2_blocksize
= 3-s
->avctx
->lowres
;
393 assert((((int)mb_bit_buffer
)&7)==0);
394 assert((((int)vs_bit_buffer
)&7)==0);
396 memset(sblock
, 0, sizeof(sblock
));
398 /* pass 1 : read DC and AC coefficients in blocks */
400 block1
= &sblock
[0][0];
402 init_put_bits(&vs_pb
, vs_bit_buffer
, 5 * 80);
403 for(mb_index
= 0; mb_index
< 5; mb_index
++, mb1
+= 6, block1
+= 6 * 64) {
405 quant
= buf_ptr
[3] & 0x0f;
407 init_put_bits(&pb
, mb_bit_buffer
, 80);
410 for(j
= 0;j
< 6; j
++) {
411 last_index
= block_sizes
[j
];
412 init_get_bits(&gb
, buf_ptr
, last_index
);
415 dc
= get_sbits(&gb
, 9);
416 dct_mode
= get_bits1(&gb
);
417 mb
->dct_mode
= dct_mode
;
418 mb
->scan_table
= s
->dv_zigzag
[dct_mode
];
419 mb
->iweight_table
= dct_mode
? dv_iweight_248
: dv_iweight_88
;
420 class1
= get_bits(&gb
, 2);
421 mb
->shift_table
= s
->dv_idct_shift
[class1
== 3][dct_mode
]
422 [quant
+ dv_quant_offset
[class1
]];
424 /* convert to unsigned because 128 is not added in the
428 buf_ptr
+= last_index
>> 3;
430 mb
->partial_bit_count
= 0;
433 printf("MB block: %d, %d ", mb_index
, j
);
435 dv_decode_ac(&gb
, mb
, block
);
437 /* write the remaining bits in a new buffer only if the
446 /* pass 2 : we can do it just after */
448 printf("***pass 2 size=%d MB#=%d\n", put_bits_count(&pb
), mb_index
);
452 init_get_bits(&gb
, mb_bit_buffer
, put_bits_count(&pb
));
454 for(j
= 0;j
< 6; j
++, block
+= 64, mb
++) {
455 if (mb
->pos
< 64 && get_bits_left(&gb
) > 0) {
456 dv_decode_ac(&gb
, mb
, block
);
457 /* if still not finished, no need to parse other blocks */
462 /* all blocks are finished, so the extra bytes can be used at
463 the video segment level */
465 bit_copy(&vs_pb
, &gb
);
468 /* we need a pass other the whole video segment */
470 printf("***pass 3 size=%d\n", put_bits_count(&vs_pb
));
472 block
= &sblock
[0][0];
474 init_get_bits(&gb
, vs_bit_buffer
, put_bits_count(&vs_pb
));
475 flush_put_bits(&vs_pb
);
476 for(mb_index
= 0; mb_index
< 5; mb_index
++) {
477 for(j
= 0;j
< 6; j
++) {
480 printf("start %d:%d\n", mb_index
, j
);
482 dv_decode_ac(&gb
, mb
, block
);
484 if (mb
->pos
>= 64 && mb
->pos
< 127)
485 av_log(NULL
, AV_LOG_ERROR
, "AC EOB marker is absent pos=%d\n", mb
->pos
);
491 /* compute idct and place blocks */
492 block
= &sblock
[0][0];
494 for(mb_index
= 0; mb_index
< 5; mb_index
++) {
498 if (s
->sys
->pix_fmt
== PIX_FMT_YUV422P
) {
499 y_ptr
= s
->picture
.data
[0] + ((mb_y
* s
->picture
.linesize
[0] + (mb_x
>>1))<<log2_blocksize
);
500 c_offset
= ((mb_y
* s
->picture
.linesize
[1] + (mb_x
>> 2))<<log2_blocksize
);
501 } else { /* 4:1:1 or 4:2:0 */
502 y_ptr
= s
->picture
.data
[0] + ((mb_y
* s
->picture
.linesize
[0] + mb_x
)<<log2_blocksize
);
503 if (s
->sys
->pix_fmt
== PIX_FMT_YUV411P
)
504 c_offset
= ((mb_y
* s
->picture
.linesize
[1] + (mb_x
>> 2))<<log2_blocksize
);
506 c_offset
= (((mb_y
>> 1) * s
->picture
.linesize
[1] + (mb_x
>> 1))<<log2_blocksize
);
508 for(j
= 0;j
< 6; j
++) {
509 idct_put
= s
->idct_put
[mb
->dct_mode
&& log2_blocksize
==3];
510 if (s
->sys
->pix_fmt
== PIX_FMT_YUV422P
) { /* 4:2:2 */
511 if (j
== 0 || j
== 2) {
513 idct_put(y_ptr
+ ((j
>> 1)<<log2_blocksize
),
514 s
->picture
.linesize
[0], block
);
517 idct_put(s
->picture
.data
[6 - j
] + c_offset
,
518 s
->picture
.linesize
[6 - j
], block
);
520 /* note: j=1 and j=3 are "dummy" blocks in 4:2:2 */
521 } else { /* 4:1:1 or 4:2:0 */
523 if (s
->sys
->pix_fmt
== PIX_FMT_YUV411P
&& mb_x
< (704 / 8)) {
524 /* NOTE: at end of line, the macroblock is handled as 420 */
525 idct_put(y_ptr
+ (j
<<log2_blocksize
), s
->picture
.linesize
[0], block
);
527 idct_put(y_ptr
+ (((j
& 1) + (j
>> 1) * s
->picture
.linesize
[0])<<log2_blocksize
),
528 s
->picture
.linesize
[0], block
);
531 if (s
->sys
->pix_fmt
== PIX_FMT_YUV411P
&& mb_x
>= (704 / 8)) {
532 uint64_t aligned_pixels
[64/8];
533 uint8_t *pixels
= (uint8_t*)aligned_pixels
;
534 uint8_t *c_ptr
, *c_ptr1
, *ptr
, *ptr1
;
536 /* NOTE: at end of line, the macroblock is handled as 420 */
537 idct_put(pixels
, 8, block
);
538 linesize
= s
->picture
.linesize
[6 - j
];
539 c_ptr
= s
->picture
.data
[6 - j
] + c_offset
;
541 for(y
= 0;y
< (1<<log2_blocksize
); y
++) {
542 ptr1
= ptr
+ (1<<(log2_blocksize
-1));
543 c_ptr1
= c_ptr
+ (linesize
<<log2_blocksize
);
544 for(x
=0; x
< (1<<(log2_blocksize
-1)); x
++){
545 c_ptr
[x
]= ptr
[x
]; c_ptr1
[x
]= ptr1
[x
];
551 /* don't ask me why they inverted Cb and Cr ! */
552 idct_put(s
->picture
.data
[6 - j
] + c_offset
,
553 s
->picture
.linesize
[6 - j
], block
);
563 #ifdef DV_CODEC_TINY_TARGET
564 /* Converts run and level (where level != 0) pair into vlc, returning bit size */
565 static always_inline
int dv_rl2vlc(int run
, int level
, int sign
, uint32_t* vlc
)
568 if (run
< DV_VLC_MAP_RUN_SIZE
&& level
< DV_VLC_MAP_LEV_SIZE
) {
569 *vlc
= dv_vlc_map
[run
][level
].vlc
| sign
;
570 size
= dv_vlc_map
[run
][level
].size
;
573 if (level
< DV_VLC_MAP_LEV_SIZE
) {
574 *vlc
= dv_vlc_map
[0][level
].vlc
| sign
;
575 size
= dv_vlc_map
[0][level
].size
;
577 *vlc
= 0xfe00 | (level
<< 1) | sign
;
581 *vlc
|= ((run
< 16) ? dv_vlc_map
[run
-1][0].vlc
:
582 (0x1f80 | (run
- 1))) << size
;
583 size
+= (run
< 16) ? dv_vlc_map
[run
-1][0].size
: 13;
590 static always_inline
int dv_rl2vlc_size(int run
, int level
)
594 if (run
< DV_VLC_MAP_RUN_SIZE
&& level
< DV_VLC_MAP_LEV_SIZE
) {
595 size
= dv_vlc_map
[run
][level
].size
;
598 size
= (level
< DV_VLC_MAP_LEV_SIZE
) ? dv_vlc_map
[0][level
].size
: 16;
600 size
+= (run
< 16) ? dv_vlc_map
[run
-1][0].size
: 13;
606 static always_inline
int dv_rl2vlc(int run
, int l
, int sign
, uint32_t* vlc
)
608 *vlc
= dv_vlc_map
[run
][l
].vlc
| sign
;
609 return dv_vlc_map
[run
][l
].size
;
612 static always_inline
int dv_rl2vlc_size(int run
, int l
)
614 return dv_vlc_map
[run
][l
].size
;
618 typedef struct EncBlockInfo
{
628 uint8_t partial_bit_count
;
629 uint32_t partial_bit_buffer
; /* we can't use uint16_t here */
632 static always_inline PutBitContext
* dv_encode_ac(EncBlockInfo
* bi
, PutBitContext
* pb_pool
,
633 PutBitContext
* pb_end
)
637 PutBitContext
* pb
= pb_pool
;
638 int size
= bi
->partial_bit_count
;
639 uint32_t vlc
= bi
->partial_bit_buffer
;
641 bi
->partial_bit_count
= bi
->partial_bit_buffer
= 0;
643 /* Find suitable storage space */
644 for (; size
> (bits_left
= put_bits_left(pb
)); pb
++) {
647 put_bits(pb
, bits_left
, vlc
>> size
);
648 vlc
= vlc
& ((1<<size
)-1);
650 if (pb
+ 1 >= pb_end
) {
651 bi
->partial_bit_count
= size
;
652 bi
->partial_bit_buffer
= vlc
;
658 put_bits(pb
, size
, vlc
);
663 /* Construct the next VLC */
665 bi
->cur_ac
= bi
->next
[prev
];
667 size
= dv_rl2vlc(bi
->cur_ac
- prev
- 1, bi
->mb
[bi
->cur_ac
], bi
->sign
[bi
->cur_ac
], &vlc
);
669 size
= 4; vlc
= 6; /* End Of Block stamp */
675 static always_inline
void dv_set_class_number(DCTELEM
* blk
, EncBlockInfo
* bi
,
676 const uint8_t* zigzag_scan
, const int *weight
, int bias
)
679 /* We offer two different methods for class number assignment: the
680 method suggested in SMPTE 314M Table 22, and an improved
681 method. The SMPTE method is very conservative; it assigns class
682 3 (i.e. severe quantization) to any block where the largest AC
683 component is greater than 36. ffmpeg's DV encoder tracks AC bit
684 consumption precisely, so there is no need to bias most blocks
685 towards strongly lossy compression. Instead, we assign class 2
686 to most blocks, and use class 3 only when strictly necessary
687 (for blocks whose largest AC component exceeds 255). */
689 #if 0 /* SMPTE spec method */
690 static const int classes
[] = {12, 24, 36, 0xffff};
691 #else /* improved ffmpeg method */
692 static const int classes
[] = {-1, -1, 255, 0xffff};
699 for (area
= 0; area
< 4; area
++) {
700 bi
->prev
[area
] = prev
;
701 bi
->bit_size
[area
] = 1; // 4 areas 4 bits for EOB :)
702 for (i
=mb_area_start
[area
]; i
<mb_area_start
[area
+1]; i
++) {
703 int level
= blk
[zigzag_scan
[i
]];
705 if (level
+15 > 30U) {
706 bi
->sign
[i
] = (level
>>31)&1;
707 /* weigh it and and shift down into range, adding for rounding */
708 /* the extra division by a factor of 2^4 reverses the 8x expansion of the DCT
709 AND the 2x doubling of the weights */
710 level
= (ABS(level
) * weight
[i
] + (1<<(dv_weight_bits
+3))) >> (dv_weight_bits
+4);
712 if(level
>max
) max
= level
;
713 bi
->bit_size
[area
] += dv_rl2vlc_size(i
- prev
- 1, level
);
720 for(bi
->cno
= 0; max
> classes
[bi
->cno
]; bi
->cno
++);
728 for (area
= 0; area
< 4; area
++) {
729 bi
->prev
[area
] = prev
;
730 bi
->bit_size
[area
] = 1; // 4 areas 4 bits for EOB :)
731 for (; i
<mb_area_start
[area
+1]; i
= bi
->next
[i
]) {
735 bi
->bit_size
[area
] += dv_rl2vlc_size(i
- prev
- 1, bi
->mb
[i
]);
745 //FIXME replace this by dsputil
746 #define SC(x, y) ((s[x] - s[y]) ^ ((s[x] - s[y]) >> 7))
747 static always_inline
int dv_guess_dct_mode(DCTELEM
*blk
) {
753 /* Compute 8-8 score (small values give a better chance for 8-8 DCT) */
756 score88
+= SC(0, 8) + SC(1, 9) + SC(2, 10) + SC(3, 11) +
757 SC(4, 12) + SC(5,13) + SC(6, 14) + SC(7, 15);
760 /* Compute 2-4-8 score (small values give a better chance for 2-4-8 DCT) */
763 score248
+= SC(0, 16) + SC(1,17) + SC(2, 18) + SC(3, 19) +
764 SC(4, 20) + SC(5,21) + SC(6, 22) + SC(7, 23);
768 return (score88
- score248
> -10);
771 static inline void dv_guess_qnos(EncBlockInfo
* blks
, int* qnos
)
774 int i
, j
, k
, a
, prev
, a2
;
777 size
[0] = size
[1] = size
[2] = size
[3] = size
[4] = 1<<24;
780 for (i
=0; i
<5; i
++) {
786 for (j
=0; j
<6; j
++, b
++) {
787 for (a
=0; a
<4; a
++) {
788 if (b
->area_q
[a
] != dv_quant_shifts
[qnos
[i
] + dv_quant_offset
[b
->cno
]][a
]) {
789 b
->bit_size
[a
] = 1; // 4 areas 4 bits for EOB :)
792 assert(b
->next
[prev
] >= mb_area_start
[a
+1] || b
->mb
[prev
]);
793 for (k
= b
->next
[prev
] ; k
<mb_area_start
[a
+1]; k
= b
->next
[k
]) {
796 b
->bit_size
[a
] += dv_rl2vlc_size(k
- prev
- 1, b
->mb
[k
]);
799 if(b
->next
[k
] >= mb_area_start
[a
+1] && b
->next
[k
]<64){
800 for(a2
=a
+1; b
->next
[k
] >= mb_area_start
[a2
+1]; a2
++)
803 assert(b
->mb
[b
->next
[k
]]);
804 b
->bit_size
[a2
] += dv_rl2vlc_size(b
->next
[k
] - prev
- 1, b
->mb
[b
->next
[k
]])
805 -dv_rl2vlc_size(b
->next
[k
] - k
- 1, b
->mb
[b
->next
[k
]]);
806 assert(b
->prev
[a2
]==k
&& (a2
+1 >= 4 || b
->prev
[a2
+1]!=k
));
809 b
->next
[prev
] = b
->next
[k
];
814 size
[i
] += b
->bit_size
[a
];
817 if(vs_total_ac_bits
>= size
[0] + size
[1] + size
[2] + size
[3] + size
[4])
820 } while (qnos
[0]|qnos
[1]|qnos
[2]|qnos
[3]|qnos
[4]);
823 for(a
=2; a
==2 || vs_total_ac_bits
< size
[0]; a
+=a
){
825 size
[0] = 5*6*4; //EOB
826 for (j
=0; j
<6*5; j
++, b
++) {
828 for (k
= b
->next
[prev
]; k
<64; k
= b
->next
[k
]) {
829 if(b
->mb
[k
] < a
&& b
->mb
[k
] > -a
){
830 b
->next
[prev
] = b
->next
[k
];
832 size
[0] += dv_rl2vlc_size(k
- prev
- 1, b
->mb
[k
]);
840 static inline void dv_encode_video_segment(DVVideoContext
*s
,
842 const uint16_t *mb_pos_ptr
)
844 int mb_index
, i
, j
, v
;
845 int mb_x
, mb_y
, c_offset
, linesize
;
850 DECLARE_ALIGNED_8(DCTELEM
, block
[64]);
851 EncBlockInfo enc_blks
[5*6];
852 PutBitContext pbs
[5*6];
854 EncBlockInfo
* enc_blk
;
858 assert((((int)block
) & 7) == 0);
860 enc_blk
= &enc_blks
[0];
862 for(mb_index
= 0; mb_index
< 5; mb_index
++) {
866 if (s
->sys
->pix_fmt
== PIX_FMT_YUV422P
) {
867 y_ptr
= s
->picture
.data
[0] + (mb_y
* s
->picture
.linesize
[0] * 8) + (mb_x
* 4);
869 y_ptr
= s
->picture
.data
[0] + (mb_y
* s
->picture
.linesize
[0] * 8) + (mb_x
* 8);
871 if (s
->sys
->pix_fmt
== PIX_FMT_YUV420P
) {
872 c_offset
= (((mb_y
>> 1) * s
->picture
.linesize
[1] * 8) + ((mb_x
>> 1) * 8));
873 } else { /* 4:2:2 or 4:1:1 */
874 c_offset
= ((mb_y
* s
->picture
.linesize
[1] * 8) + ((mb_x
>> 2) * 8));
877 qnos
[mb_index
] = 15; /* No quantization */
878 ptr
= dif
+ mb_index
*80 + 4;
879 for(j
= 0;j
< 6; j
++) {
881 if (s
->sys
->pix_fmt
== PIX_FMT_YUV422P
) { /* 4:2:2 */
882 if (j
== 0 || j
== 2) {
884 data
= y_ptr
+ ((j
>>1) * 8);
885 linesize
= s
->picture
.linesize
[0];
888 data
= s
->picture
.data
[6 - j
] + c_offset
;
889 linesize
= s
->picture
.linesize
[6 - j
];
891 /* j=1 and j=3 are "dummy" blocks, used for AC data only */
896 } else { /* 4:1:1 or 4:2:0 */
897 if (j
< 4) { /* Four Y blocks */
898 /* NOTE: at end of line, the macroblock is handled as 420 */
899 if (s
->sys
->pix_fmt
== PIX_FMT_YUV411P
&& mb_x
< (704 / 8)) {
900 data
= y_ptr
+ (j
* 8);
902 data
= y_ptr
+ ((j
& 1) * 8) + ((j
>> 1) * 8 * s
->picture
.linesize
[0]);
904 linesize
= s
->picture
.linesize
[0];
905 } else { /* Cr and Cb blocks */
906 /* don't ask Fabrice why they inverted Cb and Cr ! */
907 data
= s
->picture
.data
[6 - j
] + c_offset
;
908 linesize
= s
->picture
.linesize
[6 - j
];
909 if (s
->sys
->pix_fmt
== PIX_FMT_YUV411P
&& mb_x
>= (704 / 8))
914 /* Everything is set up -- now just copy data -> DCT block */
915 if (do_edge_wrap
) { /* Edge wrap copy: 4x16 -> 8x8 */
919 d
= data
+ 8 * linesize
;
920 b
[0] = data
[0]; b
[1] = data
[1]; b
[2] = data
[2]; b
[3] = data
[3];
921 b
[4] = d
[0]; b
[5] = d
[1]; b
[6] = d
[2]; b
[7] = d
[3];
925 } else { /* Simple copy: 8x8 -> 8x8 */
927 s
->get_pixels(block
, data
, linesize
);
930 if(s
->avctx
->flags
& CODEC_FLAG_INTERLACED_DCT
)
931 enc_blk
->dct_mode
= dv_guess_dct_mode(block
);
933 enc_blk
->dct_mode
= 0;
934 enc_blk
->area_q
[0] = enc_blk
->area_q
[1] = enc_blk
->area_q
[2] = enc_blk
->area_q
[3] = 0;
935 enc_blk
->partial_bit_count
= 0;
936 enc_blk
->partial_bit_buffer
= 0;
940 /* We rely on the fact that encoding all zeros leads to an immediate EOB,
941 which is precisely what the spec calls for in the "dummy" blocks. */
942 memset(block
, 0, sizeof(block
));
944 s
->fdct
[enc_blk
->dct_mode
](block
);
947 dv_set_class_number(block
, enc_blk
,
948 enc_blk
->dct_mode
? ff_zigzag248_direct
: ff_zigzag_direct
,
949 enc_blk
->dct_mode
? dv_weight_248
: dv_weight_88
,
952 init_put_bits(pb
, ptr
, block_sizes
[j
]/8);
953 put_bits(pb
, 9, (uint16_t)(((enc_blk
->mb
[0] >> 3) - 1024 + 2) >> 2));
954 put_bits(pb
, 1, enc_blk
->dct_mode
);
955 put_bits(pb
, 2, enc_blk
->cno
);
957 vs_bit_size
+= enc_blk
->bit_size
[0] + enc_blk
->bit_size
[1] +
958 enc_blk
->bit_size
[2] + enc_blk
->bit_size
[3];
961 ptr
+= block_sizes
[j
]/8;
965 if (vs_total_ac_bits
< vs_bit_size
)
966 dv_guess_qnos(&enc_blks
[0], &qnos
[0]);
968 for (i
=0; i
<5; i
++) {
969 dif
[i
*80 + 3] = qnos
[i
];
972 /* First pass over individual cells only */
973 for (j
=0; j
<5*6; j
++)
974 dv_encode_ac(&enc_blks
[j
], &pbs
[j
], &pbs
[j
+1]);
976 /* Second pass over each MB space */
977 for (j
=0; j
<5*6; j
+=6) {
979 for (i
=0; i
<6; i
++) {
980 if (enc_blks
[i
+j
].partial_bit_count
)
981 pb
=dv_encode_ac(&enc_blks
[i
+j
], pb
, &pbs
[j
+6]);
985 /* Third and final pass over the whole vides segment space */
987 for (j
=0; j
<5*6; j
++) {
988 if (enc_blks
[j
].partial_bit_count
)
989 pb
=dv_encode_ac(&enc_blks
[j
], pb
, &pbs
[6*5]);
990 if (enc_blks
[j
].partial_bit_count
)
991 av_log(NULL
, AV_LOG_ERROR
, "ac bitstream overflow\n");
994 for (j
=0; j
<5*6; j
++)
995 flush_put_bits(&pbs
[j
]);
998 static int dv_decode_mt(AVCodecContext
*avctx
, void* sl
)
1000 DVVideoContext
*s
= avctx
->priv_data
;
1001 int slice
= (size_t)sl
;
1003 /* which DIF channel is this? */
1004 int chan
= slice
/ (s
->sys
->difseg_size
* 27);
1006 /* slice within the DIF channel */
1007 int chan_slice
= slice
% (s
->sys
->difseg_size
* 27);
1009 /* byte offset of this channel's data */
1010 int chan_offset
= chan
* s
->sys
->difseg_size
* 150 * 80;
1012 dv_decode_video_segment(s
, &s
->buf
[((chan_slice
/27)*6+(chan_slice
/3)+chan_slice
*5+7)*80 + chan_offset
],
1013 &s
->sys
->video_place
[slice
*5]);
1017 static int dv_encode_mt(AVCodecContext
*avctx
, void* sl
)
1019 DVVideoContext
*s
= avctx
->priv_data
;
1020 int slice
= (size_t)sl
;
1022 /* which DIF channel is this? */
1023 int chan
= slice
/ (s
->sys
->difseg_size
* 27);
1025 /* slice within the DIF channel */
1026 int chan_slice
= slice
% (s
->sys
->difseg_size
* 27);
1028 /* byte offset of this channel's data */
1029 int chan_offset
= chan
* s
->sys
->difseg_size
* 150 * 80;
1031 dv_encode_video_segment(s
, &s
->buf
[((chan_slice
/27)*6+(chan_slice
/3)+chan_slice
*5+7)*80 + chan_offset
],
1032 &s
->sys
->video_place
[slice
*5]);
1036 /* NOTE: exactly one frame must be given (120000 bytes for NTSC,
1037 144000 bytes for PAL - or twice those for 50Mbps) */
1038 static int dvvideo_decode_frame(AVCodecContext
*avctx
,
1039 void *data
, int *data_size
,
1040 uint8_t *buf
, int buf_size
)
1042 DVVideoContext
*s
= avctx
->priv_data
;
1044 s
->sys
= dv_frame_profile(buf
);
1045 if (!s
->sys
|| buf_size
< s
->sys
->frame_size
)
1046 return -1; /* NOTE: we only accept several full frames */
1048 if(s
->picture
.data
[0])
1049 avctx
->release_buffer(avctx
, &s
->picture
);
1051 s
->picture
.reference
= 0;
1052 s
->picture
.key_frame
= 1;
1053 s
->picture
.pict_type
= FF_I_TYPE
;
1054 avctx
->pix_fmt
= s
->sys
->pix_fmt
;
1055 avcodec_set_dimensions(avctx
, s
->sys
->width
, s
->sys
->height
);
1056 if(avctx
->get_buffer(avctx
, &s
->picture
) < 0) {
1057 av_log(avctx
, AV_LOG_ERROR
, "get_buffer() failed\n");
1060 s
->picture
.interlaced_frame
= 1;
1061 s
->picture
.top_field_first
= 0;
1064 avctx
->execute(avctx
, dv_decode_mt
, (void**)&dv_anchor
[0], NULL
,
1065 s
->sys
->n_difchan
* s
->sys
->difseg_size
* 27);
1070 *data_size
= sizeof(AVFrame
);
1071 *(AVFrame
*)data
= s
->picture
;
1073 return s
->sys
->frame_size
;
1076 static int dvvideo_encode_frame(AVCodecContext
*c
, uint8_t *buf
, int buf_size
,
1079 DVVideoContext
*s
= c
->priv_data
;
1081 s
->sys
= dv_codec_profile(c
);
1084 if(buf_size
< s
->sys
->frame_size
)
1087 c
->pix_fmt
= s
->sys
->pix_fmt
;
1088 s
->picture
= *((AVFrame
*)data
);
1089 s
->picture
.key_frame
= 1;
1090 s
->picture
.pict_type
= FF_I_TYPE
;
1093 c
->execute(c
, dv_encode_mt
, (void**)&dv_anchor
[0], NULL
,
1094 s
->sys
->n_difchan
* s
->sys
->difseg_size
* 27);
1098 /* Fill in just enough of the header for dv_frame_profile() to
1099 return the correct result, so that the frame can be decoded
1100 correctly. The rest of the metadata is filled in by the dvvideo
1101 avformat. (this should probably change so that encode_frame()
1102 fills in ALL of the metadata - e.g. for Quicktime-wrapped DV
1105 /* NTSC/PAL format */
1106 buf
[3] = s
->sys
->dsf
? 0x80 : 0x00;
1108 /* 25Mbps or 50Mbps */
1109 buf
[80*5 + 48 + 3] = (s
->sys
->pix_fmt
== PIX_FMT_YUV422P
) ? 0x4 : 0x0;
1111 return s
->sys
->frame_size
;
1114 static int dvvideo_close(AVCodecContext
*c
)
1121 #ifdef CONFIG_DVVIDEO_ENCODER
1122 AVCodec dvvideo_encoder
= {
1126 sizeof(DVVideoContext
),
1128 dvvideo_encode_frame
,
1134 #endif // CONFIG_DVVIDEO_ENCODER
1136 AVCodec dvvideo_decoder
= {
1140 sizeof(DVVideoContext
),
1144 dvvideo_decode_frame
,