3 * Copyright (c) 2002 Fabrice Bellard.
4 * Copyright (c) 2004 Roman Shaposhnik.
7 * Copyright (c) 2003 Roman Shaposhnik.
9 * Many thanks to Dan Dennedy <dan@dennedy.org> for providing wealth
10 * of DV technical info.
12 * This library is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU Lesser General Public
14 * License as published by the Free Software Foundation; either
15 * version 2 of the License, or (at your option) any later version.
17 * This library is distributed in the hope that it will be useful,
18 * but WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
20 * Lesser General Public License for more details.
22 * You should have received a copy of the GNU Lesser General Public
23 * License along with this library; if not, write to the Free Software
24 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
33 #include "mpegvideo.h"
34 #include "simple_idct.h"
37 typedef struct DVVideoContext
{
42 uint8_t dv_zigzag
[2][64];
43 uint8_t dv_idct_shift
[2][2][22][64];
45 void (*get_pixels
)(DCTELEM
*block
, const uint8_t *pixels
, int line_size
);
46 void (*fdct
[2])(DCTELEM
*block
);
47 void (*idct_put
[2])(uint8_t *dest
, int line_size
, DCTELEM
*block
);
50 #define TEX_VLC_BITS 9
52 #ifdef DV_CODEC_TINY_TARGET
53 #define DV_VLC_MAP_RUN_SIZE 15
54 #define DV_VLC_MAP_LEV_SIZE 23
56 #define DV_VLC_MAP_RUN_SIZE 64
57 #define DV_VLC_MAP_LEV_SIZE 512
61 static uint8_t** dv_anchor
;
63 /* XXX: also include quantization */
64 static RL_VLC_ELEM
*dv_rl_vlc
;
65 /* VLC encoding lookup table */
66 static struct dv_vlc_pair
{
69 } (*dv_vlc_map
)[DV_VLC_MAP_LEV_SIZE
] = NULL
;
71 static void dv_build_unquantize_tables(DVVideoContext
*s
, uint8_t* perm
)
75 /* NOTE: max left shift is 6 */
76 for(q
= 0; q
< 22; q
++) {
78 for(i
= 1; i
< 64; i
++) {
81 s
->dv_idct_shift
[0][0][q
][j
] =
82 dv_quant_shifts
[q
][dv_88_areas
[i
]] + 1;
83 s
->dv_idct_shift
[1][0][q
][j
] = s
->dv_idct_shift
[0][0][q
][j
] + 1;
87 for(i
= 1; i
< 64; i
++) {
89 s
->dv_idct_shift
[0][1][q
][i
] =
90 dv_quant_shifts
[q
][dv_248_areas
[i
]] + 1;
91 s
->dv_idct_shift
[1][1][q
][i
] = s
->dv_idct_shift
[0][1][q
][i
] + 1;
96 static int dvvideo_init(AVCodecContext
*avctx
)
98 DVVideoContext
*s
= avctx
->priv_data
;
105 uint16_t new_dv_vlc_bits
[NB_DV_VLC
*2];
106 uint8_t new_dv_vlc_len
[NB_DV_VLC
*2];
107 uint8_t new_dv_vlc_run
[NB_DV_VLC
*2];
108 int16_t new_dv_vlc_level
[NB_DV_VLC
*2];
112 dv_vlc_map
= av_mallocz(DV_VLC_MAP_LEV_SIZE
*DV_VLC_MAP_RUN_SIZE
*sizeof(struct dv_vlc_pair
));
116 /* dv_anchor lets each thread know its Id */
117 dv_anchor
= av_malloc(12*27*sizeof(void*));
122 for (i
=0; i
<12*27; i
++)
123 dv_anchor
[i
] = (void*)(size_t)i
;
125 /* it's faster to include sign bit in a generic VLC parsing scheme */
126 for (i
=0, j
=0; i
<NB_DV_VLC
; i
++, j
++) {
127 new_dv_vlc_bits
[j
] = dv_vlc_bits
[i
];
128 new_dv_vlc_len
[j
] = dv_vlc_len
[i
];
129 new_dv_vlc_run
[j
] = dv_vlc_run
[i
];
130 new_dv_vlc_level
[j
] = dv_vlc_level
[i
];
132 if (dv_vlc_level
[i
]) {
133 new_dv_vlc_bits
[j
] <<= 1;
137 new_dv_vlc_bits
[j
] = (dv_vlc_bits
[i
] << 1) | 1;
138 new_dv_vlc_len
[j
] = dv_vlc_len
[i
] + 1;
139 new_dv_vlc_run
[j
] = dv_vlc_run
[i
];
140 new_dv_vlc_level
[j
] = -dv_vlc_level
[i
];
144 /* NOTE: as a trick, we use the fact the no codes are unused
145 to accelerate the parsing of partial codes */
146 init_vlc(&dv_vlc
, TEX_VLC_BITS
, j
,
147 new_dv_vlc_len
, 1, 1, new_dv_vlc_bits
, 2, 2, 0);
149 dv_rl_vlc
= av_malloc(dv_vlc
.table_size
* sizeof(RL_VLC_ELEM
));
155 for(i
= 0; i
< dv_vlc
.table_size
; i
++){
156 int code
= dv_vlc
.table
[i
][0];
157 int len
= dv_vlc
.table
[i
][1];
160 if(len
<0){ //more bits needed
164 run
= new_dv_vlc_run
[code
] + 1;
165 level
= new_dv_vlc_level
[code
];
167 dv_rl_vlc
[i
].len
= len
;
168 dv_rl_vlc
[i
].level
= level
;
169 dv_rl_vlc
[i
].run
= run
;
173 for (i
= 0; i
< NB_DV_VLC
- 1; i
++) {
174 if (dv_vlc_run
[i
] >= DV_VLC_MAP_RUN_SIZE
)
176 #ifdef DV_CODEC_TINY_TARGET
177 if (dv_vlc_level
[i
] >= DV_VLC_MAP_LEV_SIZE
)
181 if (dv_vlc_map
[dv_vlc_run
[i
]][dv_vlc_level
[i
]].size
!= 0)
184 dv_vlc_map
[dv_vlc_run
[i
]][dv_vlc_level
[i
]].vlc
= dv_vlc_bits
[i
] <<
186 dv_vlc_map
[dv_vlc_run
[i
]][dv_vlc_level
[i
]].size
= dv_vlc_len
[i
] +
189 for (i
= 0; i
< DV_VLC_MAP_RUN_SIZE
; i
++) {
190 #ifdef DV_CODEC_TINY_TARGET
191 for (j
= 1; j
< DV_VLC_MAP_LEV_SIZE
; j
++) {
192 if (dv_vlc_map
[i
][j
].size
== 0) {
193 dv_vlc_map
[i
][j
].vlc
= dv_vlc_map
[0][j
].vlc
|
194 (dv_vlc_map
[i
-1][0].vlc
<< (dv_vlc_map
[0][j
].size
));
195 dv_vlc_map
[i
][j
].size
= dv_vlc_map
[i
-1][0].size
+
196 dv_vlc_map
[0][j
].size
;
200 for (j
= 1; j
< DV_VLC_MAP_LEV_SIZE
/2; j
++) {
201 if (dv_vlc_map
[i
][j
].size
== 0) {
202 dv_vlc_map
[i
][j
].vlc
= dv_vlc_map
[0][j
].vlc
|
203 (dv_vlc_map
[i
-1][0].vlc
<< (dv_vlc_map
[0][j
].size
));
204 dv_vlc_map
[i
][j
].size
= dv_vlc_map
[i
-1][0].size
+
205 dv_vlc_map
[0][j
].size
;
207 dv_vlc_map
[i
][((uint16_t)(-j
))&0x1ff].vlc
=
208 dv_vlc_map
[i
][j
].vlc
| 1;
209 dv_vlc_map
[i
][((uint16_t)(-j
))&0x1ff].size
=
210 dv_vlc_map
[i
][j
].size
;
216 /* Generic DSP setup */
217 dsputil_init(&dsp
, avctx
);
218 s
->get_pixels
= dsp
.get_pixels
;
221 s
->fdct
[0] = dsp
.fdct
;
222 s
->idct_put
[0] = dsp
.idct_put
;
224 s
->dv_zigzag
[0][i
] = dsp
.idct_permutation
[ff_zigzag_direct
[i
]];
227 s
->fdct
[1] = dsp
.fdct248
;
228 s
->idct_put
[1] = simple_idct248_put
; // FIXME: need to add it to DSP
229 memcpy(s
->dv_zigzag
[1], ff_zigzag248_direct
, 64);
231 /* XXX: do it only for constant case */
232 dv_build_unquantize_tables(s
, dsp
.idct_permutation
);
234 /* FIXME: I really don't think this should be here */
235 if (dv_codec_profile(avctx
))
236 avctx
->pix_fmt
= dv_codec_profile(avctx
)->pix_fmt
;
237 avctx
->coded_frame
= &s
->picture
;
243 // #define printf(...) av_log(NULL, AV_LOG_ERROR, __VA_ARGS__)
245 typedef struct BlockInfo
{
246 const uint8_t *shift_table
;
247 const uint8_t *scan_table
;
248 uint8_t pos
; /* position in block */
250 uint8_t partial_bit_count
;
251 uint16_t partial_bit_buffer
;
255 /* block size in bits */
256 static const uint16_t block_sizes
[6] = {
257 112, 112, 112, 112, 80, 80
259 /* bit budget for AC only in 5 MBs */
260 static const int vs_total_ac_bits
= (100 * 4 + 68*2) * 5;
261 /* see dv_88_areas and dv_248_areas for details */
262 static const int mb_area_start
[5] = { 1, 6, 21, 43, 64 };
264 #ifndef ALT_BITSTREAM_READER
265 #warning only works with ALT_BITSTREAM_READER
266 static int re_index
; //Hack to make it compile
269 static inline int get_bits_left(GetBitContext
*s
)
271 return s
->size_in_bits
- get_bits_count(s
);
274 static inline int get_bits_size(GetBitContext
*s
)
276 return s
->size_in_bits
;
279 static inline int put_bits_left(PutBitContext
* s
)
281 return (s
->buf_end
- s
->buf
) * 8 - put_bits_count(s
);
284 /* decode ac coefs */
285 static void dv_decode_ac(GetBitContext
*gb
, BlockInfo
*mb
, DCTELEM
*block
)
287 int last_index
= get_bits_size(gb
);
288 const uint8_t *scan_table
= mb
->scan_table
;
289 const uint8_t *shift_table
= mb
->shift_table
;
291 int partial_bit_count
= mb
->partial_bit_count
;
292 int level
, pos1
, run
, vlc_len
, index
;
295 UPDATE_CACHE(re
, gb
);
297 /* if we must parse a partial vlc, we do it here */
298 if (partial_bit_count
> 0) {
299 re_cache
= ((unsigned)re_cache
>> partial_bit_count
) |
300 (mb
->partial_bit_buffer
<< (sizeof(re_cache
)*8 - partial_bit_count
));
301 re_index
-= partial_bit_count
;
302 mb
->partial_bit_count
= 0;
305 /* get the AC coefficients until last_index is reached */
308 printf("%2d: bits=%04x index=%d\n", pos
, SHOW_UBITS(re
, gb
, 16), re_index
);
310 /* our own optimized GET_RL_VLC */
311 index
= NEG_USR32(re_cache
, TEX_VLC_BITS
);
312 vlc_len
= dv_rl_vlc
[index
].len
;
314 index
= NEG_USR32((unsigned)re_cache
<< TEX_VLC_BITS
, -vlc_len
) + dv_rl_vlc
[index
].level
;
315 vlc_len
= TEX_VLC_BITS
- vlc_len
;
317 level
= dv_rl_vlc
[index
].level
;
318 run
= dv_rl_vlc
[index
].run
;
320 /* gotta check if we're still within gb boundaries */
321 if (re_index
+ vlc_len
> last_index
) {
322 /* should be < 16 bits otherwise a codeword could have been parsed */
323 mb
->partial_bit_count
= last_index
- re_index
;
324 mb
->partial_bit_buffer
= NEG_USR32(re_cache
, mb
->partial_bit_count
);
325 re_index
= last_index
;
331 printf("run=%d level=%d\n", run
, level
);
338 pos1
= scan_table
[pos
];
339 block
[pos1
] = level
<< shift_table
[pos1
];
342 UPDATE_CACHE(re
, gb
);
344 CLOSE_READER(re
, gb
);
348 static inline void bit_copy(PutBitContext
*pb
, GetBitContext
*gb
)
350 int bits_left
= get_bits_left(gb
);
351 while (bits_left
>= 16) {
352 put_bits(pb
, 16, get_bits(gb
, 16));
356 put_bits(pb
, bits_left
, get_bits(gb
, bits_left
));
360 /* mb_x and mb_y are in units of 8 pixels */
361 static inline void dv_decode_video_segment(DVVideoContext
*s
,
363 const uint16_t *mb_pos_ptr
)
365 int quant
, dc
, dct_mode
, class1
, j
;
366 int mb_index
, mb_x
, mb_y
, v
, last_index
;
367 DCTELEM
*block
, *block1
;
370 void (*idct_put
)(uint8_t *dest
, int line_size
, DCTELEM
*block
);
372 PutBitContext pb
, vs_pb
;
374 BlockInfo mb_data
[5 * 6], *mb
, *mb1
;
375 DCTELEM sblock
[5*6][64] __align8
;
376 uint8_t mb_bit_buffer
[80 + 4]; /* allow some slack */
377 uint8_t vs_bit_buffer
[5 * 80 + 4]; /* allow some slack */
379 memset(sblock
, 0, sizeof(sblock
));
381 /* pass 1 : read DC and AC coefficients in blocks */
383 block1
= &sblock
[0][0];
385 init_put_bits(&vs_pb
, vs_bit_buffer
, 5 * 80);
386 for(mb_index
= 0; mb_index
< 5; mb_index
++, mb1
+= 6, block1
+= 6 * 64) {
388 quant
= buf_ptr
[3] & 0x0f;
390 init_put_bits(&pb
, mb_bit_buffer
, 80);
393 for(j
= 0;j
< 6; j
++) {
394 last_index
= block_sizes
[j
];
395 init_get_bits(&gb
, buf_ptr
, last_index
);
398 dc
= get_sbits(&gb
, 9);
399 dct_mode
= get_bits1(&gb
);
400 mb
->dct_mode
= dct_mode
;
401 mb
->scan_table
= s
->dv_zigzag
[dct_mode
];
402 class1
= get_bits(&gb
, 2);
403 mb
->shift_table
= s
->dv_idct_shift
[class1
== 3][dct_mode
]
404 [quant
+ dv_quant_offset
[class1
]];
406 /* convert to unsigned because 128 is not added in the
410 buf_ptr
+= last_index
>> 3;
412 mb
->partial_bit_count
= 0;
415 printf("MB block: %d, %d ", mb_index
, j
);
417 dv_decode_ac(&gb
, mb
, block
);
419 /* write the remaining bits in a new buffer only if the
428 /* pass 2 : we can do it just after */
430 printf("***pass 2 size=%d MB#=%d\n", put_bits_count(&pb
), mb_index
);
434 init_get_bits(&gb
, mb_bit_buffer
, put_bits_count(&pb
));
436 for(j
= 0;j
< 6; j
++, block
+= 64, mb
++) {
437 if (mb
->pos
< 64 && get_bits_left(&gb
) > 0) {
438 dv_decode_ac(&gb
, mb
, block
);
439 /* if still not finished, no need to parse other blocks */
444 /* all blocks are finished, so the extra bytes can be used at
445 the video segment level */
447 bit_copy(&vs_pb
, &gb
);
450 /* we need a pass other the whole video segment */
452 printf("***pass 3 size=%d\n", put_bits_count(&vs_pb
));
454 block
= &sblock
[0][0];
456 init_get_bits(&gb
, vs_bit_buffer
, put_bits_count(&vs_pb
));
457 flush_put_bits(&vs_pb
);
458 for(mb_index
= 0; mb_index
< 5; mb_index
++) {
459 for(j
= 0;j
< 6; j
++) {
462 printf("start %d:%d\n", mb_index
, j
);
464 dv_decode_ac(&gb
, mb
, block
);
466 if (mb
->pos
>= 64 && mb
->pos
< 127)
467 av_log(NULL
, AV_LOG_ERROR
, "AC EOB marker is absent pos=%d\n", mb
->pos
);
473 /* compute idct and place blocks */
474 block
= &sblock
[0][0];
476 for(mb_index
= 0; mb_index
< 5; mb_index
++) {
480 y_ptr
= s
->picture
.data
[0] + (mb_y
* s
->picture
.linesize
[0] * 8) + (mb_x
* 8);
481 if (s
->sys
->pix_fmt
== PIX_FMT_YUV411P
)
482 c_offset
= (mb_y
* s
->picture
.linesize
[1] * 8) + ((mb_x
>> 2) * 8);
484 c_offset
= ((mb_y
>> 1) * s
->picture
.linesize
[1] * 8) + ((mb_x
>> 1) * 8);
485 for(j
= 0;j
< 6; j
++) {
486 idct_put
= s
->idct_put
[mb
->dct_mode
];
488 if (s
->sys
->pix_fmt
== PIX_FMT_YUV411P
&& mb_x
< (704 / 8)) {
489 /* NOTE: at end of line, the macroblock is handled as 420 */
490 idct_put(y_ptr
+ (j
* 8), s
->picture
.linesize
[0], block
);
492 idct_put(y_ptr
+ ((j
& 1) * 8) + ((j
>> 1) * 8 * s
->picture
.linesize
[0]),
493 s
->picture
.linesize
[0], block
);
496 if (s
->sys
->pix_fmt
== PIX_FMT_YUV411P
&& mb_x
>= (704 / 8)) {
497 uint64_t aligned_pixels
[64/8];
498 uint8_t *pixels
= (uint8_t*)aligned_pixels
;
499 uint8_t *c_ptr
, *c_ptr1
, *ptr
;
501 /* NOTE: at end of line, the macroblock is handled as 420 */
502 idct_put(pixels
, 8, block
);
503 linesize
= s
->picture
.linesize
[6 - j
];
504 c_ptr
= s
->picture
.data
[6 - j
] + c_offset
;
506 for(y
= 0;y
< 8; y
++) {
507 /* convert to 411P */
508 c_ptr1
= c_ptr
+ 8*linesize
;
509 c_ptr
[0]= ptr
[0]; c_ptr1
[0]= ptr
[4];
510 c_ptr
[1]= ptr
[1]; c_ptr1
[1]= ptr
[5];
511 c_ptr
[2]= ptr
[2]; c_ptr1
[2]= ptr
[6];
512 c_ptr
[3]= ptr
[3]; c_ptr1
[3]= ptr
[7];
517 /* don't ask me why they inverted Cb and Cr ! */
518 idct_put(s
->picture
.data
[6 - j
] + c_offset
,
519 s
->picture
.linesize
[6 - j
], block
);
528 #ifdef DV_CODEC_TINY_TARGET
529 /* Converts run and level (where level != 0) pair into vlc, returning bit size */
530 static always_inline
int dv_rl2vlc(int run
, int l
, uint32_t* vlc
)
533 int level
= (l
^ sign
) - sign
;
538 if (run
< DV_VLC_MAP_RUN_SIZE
&& level
< DV_VLC_MAP_LEV_SIZE
) {
539 *vlc
= dv_vlc_map
[run
][level
].vlc
| sign
;
540 size
= dv_vlc_map
[run
][level
].size
;
543 if (level
< DV_VLC_MAP_LEV_SIZE
) {
544 *vlc
= dv_vlc_map
[0][level
].vlc
| sign
;
545 size
= dv_vlc_map
[0][level
].size
;
547 *vlc
= 0xfe00 | (level
<< 1) | sign
;
551 *vlc
|= ((run
< 16) ? dv_vlc_map
[run
-1][0].vlc
:
552 (0x1f80 | (run
- 1))) << size
;
553 size
+= (run
< 16) ? dv_vlc_map
[run
-1][0].size
: 13;
560 static always_inline
int dv_rl2vlc_size(int run
, int l
)
562 int level
= (l
^ (l
>> 8)) - (l
>> 8);
565 if (run
< DV_VLC_MAP_RUN_SIZE
&& level
< DV_VLC_MAP_LEV_SIZE
) {
566 size
= dv_vlc_map
[run
][level
].size
;
569 size
= (level
< DV_VLC_MAP_LEV_SIZE
) ? dv_vlc_map
[0][level
].size
: 16;
571 size
+= (run
< 16) ? dv_vlc_map
[run
-1][0].size
: 13;
577 static always_inline
int dv_rl2vlc(int run
, int l
, uint32_t* vlc
)
579 *vlc
= dv_vlc_map
[run
][((uint16_t)l
)&0x1ff].vlc
;
580 return dv_vlc_map
[run
][((uint16_t)l
)&0x1ff].size
;
583 static always_inline
int dv_rl2vlc_size(int run
, int l
)
585 return dv_vlc_map
[run
][((uint16_t)l
)&0x1ff].size
;
589 typedef struct EncBlockInfo
{
597 uint8_t partial_bit_count
;
598 uint32_t partial_bit_buffer
; /* we can't use uint16_t here */
601 static always_inline
void dv_encode_ac(EncBlockInfo
* bi
, PutBitContext
* pb_pool
,
606 PutBitContext
* pb
= pb_pool
;
607 int size
= bi
->partial_bit_count
;
608 uint32_t vlc
= bi
->partial_bit_buffer
;
610 bi
->partial_bit_count
= bi
->partial_bit_buffer
= 0;
612 /* Find suitable storage space */
613 for (; size
> (bits_left
= put_bits_left(pb
)); pb
++) {
616 put_bits(pb
, bits_left
, vlc
>> size
);
617 vlc
= vlc
& ((1<<size
)-1);
620 bi
->partial_bit_count
= size
;
621 bi
->partial_bit_buffer
= vlc
;
628 put_bits(pb
, size
, vlc
);
630 /* Construct the next VLC */
632 for (; bi
->cur_ac
< 64; bi
->cur_ac
++, run
++) {
633 if (bi
->mb
[bi
->cur_ac
]) {
634 size
= dv_rl2vlc(run
, bi
->mb
[bi
->cur_ac
], &vlc
);
640 if (bi
->cur_ac
== 64) {
641 size
= 4; vlc
= 6; /* End Of Block stamp */
647 static always_inline
void dv_set_class_number(DCTELEM
* blk
, EncBlockInfo
* bi
,
648 const uint8_t* zigzag_scan
, int bias
)
652 int classes
[] = {12, 24, 36, 0xffff};
657 for (area
= 0; area
< 4; area
++) {
658 bi
->prev_run
[area
] = run
;
659 bi
->bit_size
[area
] = 0;
660 for (i
=mb_area_start
[area
]; i
<mb_area_start
[area
+1]; i
++) {
661 bi
->mb
[i
] = (blk
[zigzag_scan
[i
]] / 16);
662 while ((bi
->mb
[i
] ^ (bi
->mb
[i
] >> 8)) > classes
[bi
->cno
])
666 bi
->bit_size
[area
] += dv_rl2vlc_size(run
, bi
->mb
[i
]);
672 bi
->bit_size
[3] += 4; /* EOB marker */
675 if (bi
->cno
>= 3) { /* FIXME: we have to recreate bit_size[], prev_run[] */
682 #define SC(x, y) ((s[x] - s[y]) ^ ((s[x] - s[y]) >> 7))
683 static always_inline
int dv_guess_dct_mode(DCTELEM
*blk
) {
689 /* Compute 8-8 score (small values give a better chance for 8-8 DCT) */
692 score88
+= SC(0, 8) + SC(1, 9) + SC(2, 10) + SC(3, 11) +
693 SC(4, 12) + SC(5,13) + SC(6, 14) + SC(7, 15);
696 /* Compute 2-4-8 score (small values give a better chance for 2-4-8 DCT) */
699 score248
+= SC(0, 16) + SC(1,17) + SC(2, 18) + SC(3, 19) +
700 SC(4, 20) + SC(5,21) + SC(6, 22) + SC(7, 23);
704 return (score88
- score248
> -10);
707 static inline void dv_guess_qnos(EncBlockInfo
* blks
, int* qnos
)
715 for (i
=0; i
<5; i
++) {
721 for (j
=0; j
<6; j
++, b
++) {
722 for (a
=0; a
<4; a
++) {
723 if (b
->area_q
[a
] != dv_quant_shifts
[qnos
[i
] + dv_quant_offset
[b
->cno
]][a
]) {
724 b
->bit_size
[a
] = (a
==3)?4:0;
726 run
= b
->prev_run
[a
];
727 for (k
=mb_area_start
[a
]; k
<mb_area_start
[a
+1]; k
++) {
730 b
->bit_size
[a
] += dv_rl2vlc_size(run
, b
->mb
[k
]);
736 size
[i
] += b
->bit_size
[a
];
740 } while ((vs_total_ac_bits
< size
[0] + size
[1] + size
[2] + size
[3] + size
[4]) &&
741 (qnos
[0]|qnos
[1]|qnos
[2]|qnos
[3]|qnos
[4]));
745 * This is a very rough initial implementaion. The performance is
746 * horrible and the weighting is missing. But it's missing from the
747 * decoding step also -- so at least we're on the same page with decoder ;-)
749 static inline void dv_encode_video_segment(DVVideoContext
*s
,
751 const uint16_t *mb_pos_ptr
)
753 int mb_index
, i
, j
, v
;
754 int mb_x
, mb_y
, c_offset
, linesize
;
759 DCTELEM block
[64] __align8
;
760 DCTELEM sblock
[5*6][64] __align8
;
761 EncBlockInfo enc_blks
[5*6];
762 PutBitContext pbs
[5*6];
764 EncBlockInfo
* enc_blk
;
768 enc_blk
= &enc_blks
[0];
770 for(mb_index
= 0; mb_index
< 5; mb_index
++) {
774 y_ptr
= s
->picture
.data
[0] + (mb_y
* s
->picture
.linesize
[0] * 8) + (mb_x
* 8);
775 c_offset
= (s
->sys
->pix_fmt
== PIX_FMT_YUV411P
) ?
776 ((mb_y
* s
->picture
.linesize
[1] * 8) + ((mb_x
>> 2) * 8)) :
777 (((mb_y
>> 1) * s
->picture
.linesize
[1] * 8) + ((mb_x
>> 1) * 8));
779 qnos
[mb_index
] = 15; /* No quantization */
780 ptr
= dif
+ mb_index
*80 + 4;
781 for(j
= 0;j
< 6; j
++) {
782 if (j
< 4) { /* Four Y blocks */
783 /* NOTE: at end of line, the macroblock is handled as 420 */
784 if (s
->sys
->pix_fmt
== PIX_FMT_YUV411P
&& mb_x
< (704 / 8)) {
785 data
= y_ptr
+ (j
* 8);
787 data
= y_ptr
+ ((j
& 1) * 8) + ((j
>> 1) * 8 * s
->picture
.linesize
[0]);
789 linesize
= s
->picture
.linesize
[0];
790 } else { /* Cr and Cb blocks */
791 /* don't ask Fabrice why they inverted Cb and Cr ! */
792 data
= s
->picture
.data
[6 - j
] + c_offset
;
793 linesize
= s
->picture
.linesize
[6 - j
];
794 if (s
->sys
->pix_fmt
== PIX_FMT_YUV411P
&& mb_x
>= (704 / 8))
798 /* Everything is set up -- now just copy data -> DCT block */
799 if (do_edge_wrap
) { /* Edge wrap copy: 4x16 -> 8x8 */
803 d
= data
+ 8 * linesize
;
804 b
[0] = data
[0]; b
[1] = data
[1]; b
[2] = data
[2]; b
[3] = data
[3];
805 b
[4] = d
[0]; b
[5] = d
[1]; b
[6] = d
[2]; b
[7] = d
[3];
809 } else { /* Simple copy: 8x8 -> 8x8 */
810 s
->get_pixels(block
, data
, linesize
);
813 enc_blk
->dct_mode
= dv_guess_dct_mode(block
);
814 enc_blk
->mb
= &sblock
[mb_index
*6+j
][0];
815 enc_blk
->area_q
[0] = enc_blk
->area_q
[1] = enc_blk
->area_q
[2] = enc_blk
->area_q
[3] = 0;
816 enc_blk
->partial_bit_count
= 0;
817 enc_blk
->partial_bit_buffer
= 0;
820 s
->fdct
[enc_blk
->dct_mode
](block
);
822 dv_set_class_number(block
, enc_blk
,
823 enc_blk
->dct_mode
? ff_zigzag248_direct
: ff_zigzag_direct
,
826 init_put_bits(pb
, ptr
, block_sizes
[j
]/8);
827 put_bits(pb
, 9, (uint16_t)(((enc_blk
->mb
[0] >> 3) - 1024) >> 2));
828 put_bits(pb
, 1, enc_blk
->dct_mode
);
829 put_bits(pb
, 2, enc_blk
->cno
);
831 vs_bit_size
+= enc_blk
->bit_size
[0] + enc_blk
->bit_size
[1] +
832 enc_blk
->bit_size
[2] + enc_blk
->bit_size
[3];
835 ptr
+= block_sizes
[j
]/8;
839 if (vs_total_ac_bits
< vs_bit_size
)
840 dv_guess_qnos(&enc_blks
[0], &qnos
[0]);
842 for (i
=0; i
<5; i
++) {
843 dif
[i
*80 + 3] = qnos
[i
];
846 /* First pass over individual cells only */
847 for (j
=0; j
<5*6; j
++)
848 dv_encode_ac(&enc_blks
[j
], &pbs
[j
], 1);
850 /* Second pass over each MB space */
851 for (j
=0; j
<5*6; j
++) {
852 if (enc_blks
[j
].cur_ac
< 65 || enc_blks
[j
].partial_bit_count
)
853 dv_encode_ac(&enc_blks
[j
], &pbs
[(j
/6)*6], 6);
856 /* Third and final pass over the whole vides segment space */
857 for (j
=0; j
<5*6; j
++) {
858 if (enc_blks
[j
].cur_ac
< 65 || enc_blks
[j
].partial_bit_count
)
859 dv_encode_ac(&enc_blks
[j
], &pbs
[0], 6*5);
862 for (j
=0; j
<5*6; j
++)
863 flush_put_bits(&pbs
[j
]);
866 static int dv_decode_mt(AVCodecContext
*avctx
, void* sl
)
868 DVVideoContext
*s
= avctx
->priv_data
;
869 int slice
= (size_t)sl
;
870 dv_decode_video_segment(s
, &s
->buf
[((slice
/27)*6+(slice
/3)+slice
*5+7)*80],
871 &s
->sys
->video_place
[slice
*5]);
875 static int dv_encode_mt(AVCodecContext
*avctx
, void* sl
)
877 DVVideoContext
*s
= avctx
->priv_data
;
878 int slice
= (size_t)sl
;
879 dv_encode_video_segment(s
, &s
->buf
[((slice
/27)*6+(slice
/3)+slice
*5+7)*80],
880 &s
->sys
->video_place
[slice
*5]);
884 /* NOTE: exactly one frame must be given (120000 bytes for NTSC,
885 144000 bytes for PAL) */
886 static int dvvideo_decode_frame(AVCodecContext
*avctx
,
887 void *data
, int *data_size
,
888 uint8_t *buf
, int buf_size
)
890 DVVideoContext
*s
= avctx
->priv_data
;
892 s
->sys
= dv_frame_profile(buf
);
893 if (!s
->sys
|| buf_size
< s
->sys
->frame_size
)
894 return -1; /* NOTE: we only accept several full frames */
896 if(s
->picture
.data
[0])
897 avctx
->release_buffer(avctx
, &s
->picture
);
899 s
->picture
.reference
= 0;
900 avctx
->pix_fmt
= s
->sys
->pix_fmt
;
901 avctx
->width
= s
->sys
->width
;
902 avctx
->height
= s
->sys
->height
;
903 if(avctx
->get_buffer(avctx
, &s
->picture
) < 0) {
904 av_log(avctx
, AV_LOG_ERROR
, "get_buffer() failed\n");
907 s
->picture
.interlaced_frame
= 1;
908 s
->picture
.top_field_first
= 0;
911 avctx
->execute(avctx
, dv_decode_mt
, (void**)&dv_anchor
[0], NULL
,
912 s
->sys
->difseg_size
* 27);
917 *data_size
= sizeof(AVFrame
);
918 *(AVFrame
*)data
= s
->picture
;
920 return s
->sys
->frame_size
;
923 static int dvvideo_encode_frame(AVCodecContext
*c
, uint8_t *buf
, int buf_size
,
926 DVVideoContext
*s
= c
->priv_data
;
928 s
->sys
= dv_codec_profile(c
);
931 if(buf_size
< s
->sys
->frame_size
)
934 c
->pix_fmt
= s
->sys
->pix_fmt
;
935 s
->picture
= *((AVFrame
*)data
);
938 c
->execute(c
, dv_encode_mt
, (void**)&dv_anchor
[0], NULL
,
939 s
->sys
->difseg_size
* 27);
942 return s
->sys
->frame_size
;
945 #ifdef CONFIG_DVVIDEO_ENCODER
946 AVCodec dvvideo_encoder
= {
950 sizeof(DVVideoContext
),
952 dvvideo_encode_frame
,
958 #endif // CONFIG_DVVIDEO_ENCODER
960 AVCodec dvvideo_decoder
= {
964 sizeof(DVVideoContext
),
968 dvvideo_decode_frame
,