1 | /*
|
---|
2 | * DV decoder
|
---|
3 | * Copyright (c) 2002 Fabrice Bellard.
|
---|
4 | * Copyright (c) 2004 Roman Shaposhnik.
|
---|
5 | *
|
---|
6 | * DV encoder
|
---|
7 | * Copyright (c) 2003 Roman Shaposhnik.
|
---|
8 | *
|
---|
9 | * 50 Mbps (DVCPRO50) support
|
---|
10 | * Copyright (c) 2006 Daniel Maas <dmaas@maasdigital.com>
|
---|
11 | *
|
---|
12 | * Many thanks to Dan Dennedy <dan@dennedy.org> for providing wealth
|
---|
13 | * of DV technical info.
|
---|
14 | *
|
---|
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.
|
---|
19 | *
|
---|
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.
|
---|
24 | *
|
---|
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
|
---|
28 | */
|
---|
29 |
|
---|
30 | /**
|
---|
31 | * @file dv.c
|
---|
32 | * DV codec.
|
---|
33 | */
|
---|
34 | #include "avcodec.h"
|
---|
35 | #include "dsputil.h"
|
---|
36 | #include "mpegvideo.h"
|
---|
37 | #include "simple_idct.h"
|
---|
38 | #include "dvdata.h"
|
---|
39 |
|
---|
40 | //#undef NDEBUG
|
---|
41 | //#include <assert.h>
|
---|
42 |
|
---|
43 | typedef struct DVVideoContext {
|
---|
44 | const DVprofile* sys;
|
---|
45 | AVFrame picture;
|
---|
46 | AVCodecContext *avctx;
|
---|
47 | uint8_t *buf;
|
---|
48 |
|
---|
49 | uint8_t dv_zigzag[2][64];
|
---|
50 | uint8_t dv_idct_shift[2][2][22][64];
|
---|
51 |
|
---|
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);
|
---|
55 | } DVVideoContext;
|
---|
56 |
|
---|
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)
|
---|
61 |
|
---|
62 | static void* dv_anchor[DV_ANCHOR_SIZE];
|
---|
63 |
|
---|
64 | #define TEX_VLC_BITS 9
|
---|
65 |
|
---|
66 | #ifdef DV_CODEC_TINY_TARGET
|
---|
67 | #define DV_VLC_MAP_RUN_SIZE 15
|
---|
68 | #define DV_VLC_MAP_LEV_SIZE 23
|
---|
69 | #else
|
---|
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
|
---|
72 | #endif
|
---|
73 |
|
---|
74 | /* XXX: also include quantization */
|
---|
75 | static RL_VLC_ELEM *dv_rl_vlc;
|
---|
76 | /* VLC encoding lookup table */
|
---|
77 | static struct dv_vlc_pair {
|
---|
78 | uint32_t vlc;
|
---|
79 | uint8_t size;
|
---|
80 | } (*dv_vlc_map)[DV_VLC_MAP_LEV_SIZE] = NULL;
|
---|
81 |
|
---|
82 | static void dv_build_unquantize_tables(DVVideoContext *s, uint8_t* perm)
|
---|
83 | {
|
---|
84 | int i, q, j;
|
---|
85 |
|
---|
86 | /* NOTE: max left shift is 6 */
|
---|
87 | for(q = 0; q < 22; q++) {
|
---|
88 | /* 88DCT */
|
---|
89 | for(i = 1; i < 64; i++) {
|
---|
90 | /* 88 table */
|
---|
91 | j = perm[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;
|
---|
95 | }
|
---|
96 |
|
---|
97 | /* 248DCT */
|
---|
98 | for(i = 1; i < 64; i++) {
|
---|
99 | /* 248 table */
|
---|
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;
|
---|
103 | }
|
---|
104 | }
|
---|
105 | }
|
---|
106 |
|
---|
107 | static int dvvideo_init(AVCodecContext *avctx)
|
---|
108 | {
|
---|
109 | DVVideoContext *s = avctx->priv_data;
|
---|
110 | DSPContext dsp;
|
---|
111 | static int done=0;
|
---|
112 | int i, j;
|
---|
113 |
|
---|
114 | if (!done) {
|
---|
115 | VLC dv_vlc;
|
---|
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];
|
---|
120 |
|
---|
121 | done = 1;
|
---|
122 |
|
---|
123 | dv_vlc_map = av_mallocz_static(DV_VLC_MAP_LEV_SIZE*DV_VLC_MAP_RUN_SIZE*sizeof(struct dv_vlc_pair));
|
---|
124 | if (!dv_vlc_map)
|
---|
125 | return -ENOMEM;
|
---|
126 |
|
---|
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;
|
---|
130 |
|
---|
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];
|
---|
137 |
|
---|
138 | if (dv_vlc_level[i]) {
|
---|
139 | new_dv_vlc_bits[j] <<= 1;
|
---|
140 | new_dv_vlc_len[j]++;
|
---|
141 |
|
---|
142 | j++;
|
---|
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];
|
---|
147 | }
|
---|
148 | }
|
---|
149 |
|
---|
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);
|
---|
154 |
|
---|
155 | dv_rl_vlc = av_mallocz_static(dv_vlc.table_size * sizeof(RL_VLC_ELEM));
|
---|
156 | if (!dv_rl_vlc)
|
---|
157 | return -ENOMEM;
|
---|
158 |
|
---|
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];
|
---|
162 | int level, run;
|
---|
163 |
|
---|
164 | if(len<0){ //more bits needed
|
---|
165 | run= 0;
|
---|
166 | level= code;
|
---|
167 | } else {
|
---|
168 | run= new_dv_vlc_run[code] + 1;
|
---|
169 | level= new_dv_vlc_level[code];
|
---|
170 | }
|
---|
171 | dv_rl_vlc[i].len = len;
|
---|
172 | dv_rl_vlc[i].level = level;
|
---|
173 | dv_rl_vlc[i].run = run;
|
---|
174 | }
|
---|
175 | free_vlc(&dv_vlc);
|
---|
176 |
|
---|
177 | for (i = 0; i < NB_DV_VLC - 1; i++) {
|
---|
178 | if (dv_vlc_run[i] >= DV_VLC_MAP_RUN_SIZE)
|
---|
179 | continue;
|
---|
180 | #ifdef DV_CODEC_TINY_TARGET
|
---|
181 | if (dv_vlc_level[i] >= DV_VLC_MAP_LEV_SIZE)
|
---|
182 | continue;
|
---|
183 | #endif
|
---|
184 |
|
---|
185 | if (dv_vlc_map[dv_vlc_run[i]][dv_vlc_level[i]].size != 0)
|
---|
186 | continue;
|
---|
187 |
|
---|
188 | dv_vlc_map[dv_vlc_run[i]][dv_vlc_level[i]].vlc = dv_vlc_bits[i] <<
|
---|
189 | (!!dv_vlc_level[i]);
|
---|
190 | dv_vlc_map[dv_vlc_run[i]][dv_vlc_level[i]].size = dv_vlc_len[i] +
|
---|
191 | (!!dv_vlc_level[i]);
|
---|
192 | }
|
---|
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;
|
---|
201 | }
|
---|
202 | }
|
---|
203 | #else
|
---|
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;
|
---|
210 | }
|
---|
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;
|
---|
215 | }
|
---|
216 | #endif
|
---|
217 | }
|
---|
218 | }
|
---|
219 |
|
---|
220 | /* Generic DSP setup */
|
---|
221 | dsputil_init(&dsp, avctx);
|
---|
222 | s->get_pixels = dsp.get_pixels;
|
---|
223 |
|
---|
224 | /* 88DCT setup */
|
---|
225 | s->fdct[0] = dsp.fdct;
|
---|
226 | s->idct_put[0] = dsp.idct_put;
|
---|
227 | for (i=0; i<64; i++)
|
---|
228 | s->dv_zigzag[0][i] = dsp.idct_permutation[ff_zigzag_direct[i]];
|
---|
229 |
|
---|
230 | /* 248DCT setup */
|
---|
231 | s->fdct[1] = dsp.fdct248;
|
---|
232 | s->idct_put[1] = simple_idct248_put; // FIXME: need to add it to DSP
|
---|
233 | if(avctx->lowres){
|
---|
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];
|
---|
237 | }
|
---|
238 | }else
|
---|
239 | memcpy(s->dv_zigzag[1], ff_zigzag248_direct, 64);
|
---|
240 |
|
---|
241 | /* XXX: do it only for constant case */
|
---|
242 | dv_build_unquantize_tables(s, dsp.idct_permutation);
|
---|
243 |
|
---|
244 | avctx->coded_frame = &s->picture;
|
---|
245 | s->avctx= avctx;
|
---|
246 |
|
---|
247 | return 0;
|
---|
248 | }
|
---|
249 |
|
---|
250 | // #define VLC_DEBUG
|
---|
251 | // #define printf(...) av_log(NULL, AV_LOG_ERROR, __VA_ARGS__)
|
---|
252 |
|
---|
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 */
|
---|
258 | uint8_t dct_mode;
|
---|
259 | uint8_t partial_bit_count;
|
---|
260 | uint16_t partial_bit_buffer;
|
---|
261 | int shift_offset;
|
---|
262 | } BlockInfo;
|
---|
263 |
|
---|
264 | /* block size in bits */
|
---|
265 | static const uint16_t block_sizes[6] = {
|
---|
266 | 112, 112, 112, 112, 80, 80
|
---|
267 | };
|
---|
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 };
|
---|
272 |
|
---|
273 | #ifndef ALT_BITSTREAM_READER
|
---|
274 | #warning only works with ALT_BITSTREAM_READER
|
---|
275 | static int re_index; //Hack to make it compile
|
---|
276 | #endif
|
---|
277 |
|
---|
278 | static inline int get_bits_left(GetBitContext *s)
|
---|
279 | {
|
---|
280 | return s->size_in_bits - get_bits_count(s);
|
---|
281 | }
|
---|
282 |
|
---|
283 | static inline int get_bits_size(GetBitContext *s)
|
---|
284 | {
|
---|
285 | return s->size_in_bits;
|
---|
286 | }
|
---|
287 |
|
---|
288 | static inline int put_bits_left(PutBitContext* s)
|
---|
289 | {
|
---|
290 | return (s->buf_end - s->buf) * 8 - put_bits_count(s);
|
---|
291 | }
|
---|
292 |
|
---|
293 | /* decode ac coefs */
|
---|
294 | static void dv_decode_ac(GetBitContext *gb, BlockInfo *mb, DCTELEM *block)
|
---|
295 | {
|
---|
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;
|
---|
300 | int pos = mb->pos;
|
---|
301 | int partial_bit_count = mb->partial_bit_count;
|
---|
302 | int level, pos1, run, vlc_len, index;
|
---|
303 |
|
---|
304 | OPEN_READER(re, gb);
|
---|
305 | UPDATE_CACHE(re, gb);
|
---|
306 |
|
---|
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;
|
---|
313 | }
|
---|
314 |
|
---|
315 | /* get the AC coefficients until last_index is reached */
|
---|
316 | for(;;) {
|
---|
317 | #ifdef VLC_DEBUG
|
---|
318 | printf("%2d: bits=%04x index=%d\n", pos, SHOW_UBITS(re, gb, 16), re_index);
|
---|
319 | #endif
|
---|
320 | /* our own optimized GET_RL_VLC */
|
---|
321 | index = NEG_USR32(re_cache, TEX_VLC_BITS);
|
---|
322 | vlc_len = dv_rl_vlc[index].len;
|
---|
323 | if (vlc_len < 0) {
|
---|
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;
|
---|
326 | }
|
---|
327 | level = dv_rl_vlc[index].level;
|
---|
328 | run = dv_rl_vlc[index].run;
|
---|
329 |
|
---|
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;
|
---|
336 | break;
|
---|
337 | }
|
---|
338 | re_index += vlc_len;
|
---|
339 |
|
---|
340 | #ifdef VLC_DEBUG
|
---|
341 | printf("run=%d level=%d\n", run, level);
|
---|
342 | #endif
|
---|
343 | pos += run;
|
---|
344 | if (pos >= 64)
|
---|
345 | break;
|
---|
346 |
|
---|
347 | pos1 = scan_table[pos];
|
---|
348 | level <<= shift_table[pos1];
|
---|
349 |
|
---|
350 | /* unweigh, round, and shift down */
|
---|
351 | level = (level*iweight_table[pos] + (1 << (dv_iweight_bits-1))) >> dv_iweight_bits;
|
---|
352 |
|
---|
353 | block[pos1] = level;
|
---|
354 |
|
---|
355 | UPDATE_CACHE(re, gb);
|
---|
356 | }
|
---|
357 | CLOSE_READER(re, gb);
|
---|
358 | mb->pos = pos;
|
---|
359 | }
|
---|
360 |
|
---|
361 | static inline void bit_copy(PutBitContext *pb, GetBitContext *gb)
|
---|
362 | {
|
---|
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;
|
---|
367 | }
|
---|
368 | if (bits_left > 0) {
|
---|
369 | put_bits(pb, bits_left, get_bits(gb, bits_left));
|
---|
370 | }
|
---|
371 | }
|
---|
372 |
|
---|
373 | /* mb_x and mb_y are in units of 8 pixels */
|
---|
374 | static inline void dv_decode_video_segment(DVVideoContext *s,
|
---|
375 | uint8_t *buf_ptr1,
|
---|
376 | const uint16_t *mb_pos_ptr)
|
---|
377 | {
|
---|
378 | int quant, dc, dct_mode, class1, j;
|
---|
379 | int mb_index, mb_x, mb_y, v, last_index;
|
---|
380 | DCTELEM *block, *block1;
|
---|
381 | int c_offset;
|
---|
382 | uint8_t *y_ptr;
|
---|
383 | void (*idct_put)(uint8_t *dest, int line_size, DCTELEM *block);
|
---|
384 | uint8_t *buf_ptr;
|
---|
385 | PutBitContext pb, vs_pb;
|
---|
386 | GetBitContext gb;
|
---|
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;
|
---|
392 |
|
---|
393 | assert((((int)mb_bit_buffer)&7)==0);
|
---|
394 | assert((((int)vs_bit_buffer)&7)==0);
|
---|
395 |
|
---|
396 | memset(sblock, 0, sizeof(sblock));
|
---|
397 |
|
---|
398 | /* pass 1 : read DC and AC coefficients in blocks */
|
---|
399 | buf_ptr = buf_ptr1;
|
---|
400 | block1 = &sblock[0][0];
|
---|
401 | mb1 = mb_data;
|
---|
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) {
|
---|
404 | /* skip header */
|
---|
405 | quant = buf_ptr[3] & 0x0f;
|
---|
406 | buf_ptr += 4;
|
---|
407 | init_put_bits(&pb, mb_bit_buffer, 80);
|
---|
408 | mb = mb1;
|
---|
409 | block = block1;
|
---|
410 | for(j = 0;j < 6; j++) {
|
---|
411 | last_index = block_sizes[j];
|
---|
412 | init_get_bits(&gb, buf_ptr, last_index);
|
---|
413 |
|
---|
414 | /* get the dc */
|
---|
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]];
|
---|
423 | dc = dc << 2;
|
---|
424 | /* convert to unsigned because 128 is not added in the
|
---|
425 | standard IDCT */
|
---|
426 | dc += 1024;
|
---|
427 | block[0] = dc;
|
---|
428 | buf_ptr += last_index >> 3;
|
---|
429 | mb->pos = 0;
|
---|
430 | mb->partial_bit_count = 0;
|
---|
431 |
|
---|
432 | #ifdef VLC_DEBUG
|
---|
433 | printf("MB block: %d, %d ", mb_index, j);
|
---|
434 | #endif
|
---|
435 | dv_decode_ac(&gb, mb, block);
|
---|
436 |
|
---|
437 | /* write the remaining bits in a new buffer only if the
|
---|
438 | block is finished */
|
---|
439 | if (mb->pos >= 64)
|
---|
440 | bit_copy(&pb, &gb);
|
---|
441 |
|
---|
442 | block += 64;
|
---|
443 | mb++;
|
---|
444 | }
|
---|
445 |
|
---|
446 | /* pass 2 : we can do it just after */
|
---|
447 | #ifdef VLC_DEBUG
|
---|
448 | printf("***pass 2 size=%d MB#=%d\n", put_bits_count(&pb), mb_index);
|
---|
449 | #endif
|
---|
450 | block = block1;
|
---|
451 | mb = mb1;
|
---|
452 | init_get_bits(&gb, mb_bit_buffer, put_bits_count(&pb));
|
---|
453 | flush_put_bits(&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 */
|
---|
458 | if (mb->pos < 64)
|
---|
459 | break;
|
---|
460 | }
|
---|
461 | }
|
---|
462 | /* all blocks are finished, so the extra bytes can be used at
|
---|
463 | the video segment level */
|
---|
464 | if (j >= 6)
|
---|
465 | bit_copy(&vs_pb, &gb);
|
---|
466 | }
|
---|
467 |
|
---|
468 | /* we need a pass other the whole video segment */
|
---|
469 | #ifdef VLC_DEBUG
|
---|
470 | printf("***pass 3 size=%d\n", put_bits_count(&vs_pb));
|
---|
471 | #endif
|
---|
472 | block = &sblock[0][0];
|
---|
473 | mb = mb_data;
|
---|
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++) {
|
---|
478 | if (mb->pos < 64) {
|
---|
479 | #ifdef VLC_DEBUG
|
---|
480 | printf("start %d:%d\n", mb_index, j);
|
---|
481 | #endif
|
---|
482 | dv_decode_ac(&gb, mb, block);
|
---|
483 | }
|
---|
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);
|
---|
486 | block += 64;
|
---|
487 | mb++;
|
---|
488 | }
|
---|
489 | }
|
---|
490 |
|
---|
491 | /* compute idct and place blocks */
|
---|
492 | block = &sblock[0][0];
|
---|
493 | mb = mb_data;
|
---|
494 | for(mb_index = 0; mb_index < 5; mb_index++) {
|
---|
495 | v = *mb_pos_ptr++;
|
---|
496 | mb_x = v & 0xff;
|
---|
497 | mb_y = v >> 8;
|
---|
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);
|
---|
505 | else /* 4:2:0 */
|
---|
506 | c_offset = (((mb_y >> 1) * s->picture.linesize[1] + (mb_x >> 1))<<log2_blocksize);
|
---|
507 | }
|
---|
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) {
|
---|
512 | /* Y0 Y1 */
|
---|
513 | idct_put(y_ptr + ((j >> 1)<<log2_blocksize),
|
---|
514 | s->picture.linesize[0], block);
|
---|
515 | } else if(j > 3) {
|
---|
516 | /* Cr Cb */
|
---|
517 | idct_put(s->picture.data[6 - j] + c_offset,
|
---|
518 | s->picture.linesize[6 - j], block);
|
---|
519 | }
|
---|
520 | /* note: j=1 and j=3 are "dummy" blocks in 4:2:2 */
|
---|
521 | } else { /* 4:1:1 or 4:2:0 */
|
---|
522 | if (j < 4) {
|
---|
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);
|
---|
526 | } else {
|
---|
527 | idct_put(y_ptr + (((j & 1) + (j >> 1) * s->picture.linesize[0])<<log2_blocksize),
|
---|
528 | s->picture.linesize[0], block);
|
---|
529 | }
|
---|
530 | } else {
|
---|
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;
|
---|
535 | int x, y, linesize;
|
---|
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;
|
---|
540 | ptr = pixels;
|
---|
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];
|
---|
546 | }
|
---|
547 | c_ptr += linesize;
|
---|
548 | ptr += 8;
|
---|
549 | }
|
---|
550 | } else {
|
---|
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);
|
---|
554 | }
|
---|
555 | }
|
---|
556 | }
|
---|
557 | block += 64;
|
---|
558 | mb++;
|
---|
559 | }
|
---|
560 | }
|
---|
561 | }
|
---|
562 |
|
---|
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)
|
---|
566 | {
|
---|
567 | int size;
|
---|
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;
|
---|
571 | }
|
---|
572 | else {
|
---|
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;
|
---|
576 | } else {
|
---|
577 | *vlc = 0xfe00 | (level << 1) | sign;
|
---|
578 | size = 16;
|
---|
579 | }
|
---|
580 | if (run) {
|
---|
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;
|
---|
584 | }
|
---|
585 | }
|
---|
586 |
|
---|
587 | return size;
|
---|
588 | }
|
---|
589 |
|
---|
590 | static always_inline int dv_rl2vlc_size(int run, int level)
|
---|
591 | {
|
---|
592 | int size;
|
---|
593 |
|
---|
594 | if (run < DV_VLC_MAP_RUN_SIZE && level < DV_VLC_MAP_LEV_SIZE) {
|
---|
595 | size = dv_vlc_map[run][level].size;
|
---|
596 | }
|
---|
597 | else {
|
---|
598 | size = (level < DV_VLC_MAP_LEV_SIZE) ? dv_vlc_map[0][level].size : 16;
|
---|
599 | if (run) {
|
---|
600 | size += (run < 16) ? dv_vlc_map[run-1][0].size : 13;
|
---|
601 | }
|
---|
602 | }
|
---|
603 | return size;
|
---|
604 | }
|
---|
605 | #else
|
---|
606 | static always_inline int dv_rl2vlc(int run, int l, int sign, uint32_t* vlc)
|
---|
607 | {
|
---|
608 | *vlc = dv_vlc_map[run][l].vlc | sign;
|
---|
609 | return dv_vlc_map[run][l].size;
|
---|
610 | }
|
---|
611 |
|
---|
612 | static always_inline int dv_rl2vlc_size(int run, int l)
|
---|
613 | {
|
---|
614 | return dv_vlc_map[run][l].size;
|
---|
615 | }
|
---|
616 | #endif
|
---|
617 |
|
---|
618 | typedef struct EncBlockInfo {
|
---|
619 | int area_q[4];
|
---|
620 | int bit_size[4];
|
---|
621 | int prev[5];
|
---|
622 | int cur_ac;
|
---|
623 | int cno;
|
---|
624 | int dct_mode;
|
---|
625 | DCTELEM mb[64];
|
---|
626 | uint8_t next[64];
|
---|
627 | uint8_t sign[64];
|
---|
628 | uint8_t partial_bit_count;
|
---|
629 | uint32_t partial_bit_buffer; /* we can't use uint16_t here */
|
---|
630 | } EncBlockInfo;
|
---|
631 |
|
---|
632 | static always_inline PutBitContext* dv_encode_ac(EncBlockInfo* bi, PutBitContext* pb_pool,
|
---|
633 | PutBitContext* pb_end)
|
---|
634 | {
|
---|
635 | int prev;
|
---|
636 | int bits_left;
|
---|
637 | PutBitContext* pb = pb_pool;
|
---|
638 | int size = bi->partial_bit_count;
|
---|
639 | uint32_t vlc = bi->partial_bit_buffer;
|
---|
640 |
|
---|
641 | bi->partial_bit_count = bi->partial_bit_buffer = 0;
|
---|
642 | for(;;){
|
---|
643 | /* Find suitable storage space */
|
---|
644 | for (; size > (bits_left = put_bits_left(pb)); pb++) {
|
---|
645 | if (bits_left) {
|
---|
646 | size -= bits_left;
|
---|
647 | put_bits(pb, bits_left, vlc >> size);
|
---|
648 | vlc = vlc & ((1<<size)-1);
|
---|
649 | }
|
---|
650 | if (pb + 1 >= pb_end) {
|
---|
651 | bi->partial_bit_count = size;
|
---|
652 | bi->partial_bit_buffer = vlc;
|
---|
653 | return pb;
|
---|
654 | }
|
---|
655 | }
|
---|
656 |
|
---|
657 | /* Store VLC */
|
---|
658 | put_bits(pb, size, vlc);
|
---|
659 |
|
---|
660 | if(bi->cur_ac>=64)
|
---|
661 | break;
|
---|
662 |
|
---|
663 | /* Construct the next VLC */
|
---|
664 | prev= bi->cur_ac;
|
---|
665 | bi->cur_ac = bi->next[prev];
|
---|
666 | if(bi->cur_ac < 64){
|
---|
667 | size = dv_rl2vlc(bi->cur_ac - prev - 1, bi->mb[bi->cur_ac], bi->sign[bi->cur_ac], &vlc);
|
---|
668 | } else {
|
---|
669 | size = 4; vlc = 6; /* End Of Block stamp */
|
---|
670 | }
|
---|
671 | }
|
---|
672 | return pb;
|
---|
673 | }
|
---|
674 |
|
---|
675 | static always_inline void dv_set_class_number(DCTELEM* blk, EncBlockInfo* bi,
|
---|
676 | const uint8_t* zigzag_scan, const int *weight, int bias)
|
---|
677 | {
|
---|
678 | int i, area;
|
---|
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). */
|
---|
688 |
|
---|
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};
|
---|
693 | #endif
|
---|
694 | int max=classes[0];
|
---|
695 | int prev=0;
|
---|
696 |
|
---|
697 | bi->mb[0] = blk[0];
|
---|
698 |
|
---|
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]];
|
---|
704 |
|
---|
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);
|
---|
711 | bi->mb[i] = level;
|
---|
712 | if(level>max) max= level;
|
---|
713 | bi->bit_size[area] += dv_rl2vlc_size(i - prev - 1, level);
|
---|
714 | bi->next[prev]= i;
|
---|
715 | prev= i;
|
---|
716 | }
|
---|
717 | }
|
---|
718 | }
|
---|
719 | bi->next[prev]= i;
|
---|
720 | for(bi->cno = 0; max > classes[bi->cno]; bi->cno++);
|
---|
721 |
|
---|
722 | bi->cno += bias;
|
---|
723 |
|
---|
724 | if (bi->cno >= 3) {
|
---|
725 | bi->cno = 3;
|
---|
726 | prev=0;
|
---|
727 | i= bi->next[prev];
|
---|
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]) {
|
---|
732 | bi->mb[i] >>=1;
|
---|
733 |
|
---|
734 | if (bi->mb[i]) {
|
---|
735 | bi->bit_size[area] += dv_rl2vlc_size(i - prev - 1, bi->mb[i]);
|
---|
736 | bi->next[prev]= i;
|
---|
737 | prev= i;
|
---|
738 | }
|
---|
739 | }
|
---|
740 | }
|
---|
741 | bi->next[prev]= i;
|
---|
742 | }
|
---|
743 | }
|
---|
744 |
|
---|
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) {
|
---|
748 | DCTELEM *s;
|
---|
749 | int score88 = 0;
|
---|
750 | int score248 = 0;
|
---|
751 | int i;
|
---|
752 |
|
---|
753 | /* Compute 8-8 score (small values give a better chance for 8-8 DCT) */
|
---|
754 | s = blk;
|
---|
755 | for(i=0; i<7; i++) {
|
---|
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);
|
---|
758 | s += 8;
|
---|
759 | }
|
---|
760 | /* Compute 2-4-8 score (small values give a better chance for 2-4-8 DCT) */
|
---|
761 | s = blk;
|
---|
762 | for(i=0; i<6; i++) {
|
---|
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);
|
---|
765 | s += 8;
|
---|
766 | }
|
---|
767 |
|
---|
768 | return (score88 - score248 > -10);
|
---|
769 | }
|
---|
770 |
|
---|
771 | static inline void dv_guess_qnos(EncBlockInfo* blks, int* qnos)
|
---|
772 | {
|
---|
773 | int size[5];
|
---|
774 | int i, j, k, a, prev, a2;
|
---|
775 | EncBlockInfo* b;
|
---|
776 |
|
---|
777 | size[0] = size[1] = size[2] = size[3] = size[4] = 1<<24;
|
---|
778 | do {
|
---|
779 | b = blks;
|
---|
780 | for (i=0; i<5; i++) {
|
---|
781 | if (!qnos[i])
|
---|
782 | continue;
|
---|
783 |
|
---|
784 | qnos[i]--;
|
---|
785 | size[i] = 0;
|
---|
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 :)
|
---|
790 | b->area_q[a]++;
|
---|
791 | prev= b->prev[a];
|
---|
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]) {
|
---|
794 | b->mb[k] >>= 1;
|
---|
795 | if (b->mb[k]) {
|
---|
796 | b->bit_size[a] += dv_rl2vlc_size(k - prev - 1, b->mb[k]);
|
---|
797 | prev= k;
|
---|
798 | } else {
|
---|
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++)
|
---|
801 | b->prev[a2] = prev;
|
---|
802 | assert(a2<4);
|
---|
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));
|
---|
807 | b->prev[a2] = prev;
|
---|
808 | }
|
---|
809 | b->next[prev] = b->next[k];
|
---|
810 | }
|
---|
811 | }
|
---|
812 | b->prev[a+1]= prev;
|
---|
813 | }
|
---|
814 | size[i] += b->bit_size[a];
|
---|
815 | }
|
---|
816 | }
|
---|
817 | if(vs_total_ac_bits >= size[0] + size[1] + size[2] + size[3] + size[4])
|
---|
818 | return;
|
---|
819 | }
|
---|
820 | } while (qnos[0]|qnos[1]|qnos[2]|qnos[3]|qnos[4]);
|
---|
821 |
|
---|
822 |
|
---|
823 | for(a=2; a==2 || vs_total_ac_bits < size[0]; a+=a){
|
---|
824 | b = blks;
|
---|
825 | size[0] = 5*6*4; //EOB
|
---|
826 | for (j=0; j<6*5; j++, b++) {
|
---|
827 | prev= b->prev[0];
|
---|
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];
|
---|
831 | }else{
|
---|
832 | size[0] += dv_rl2vlc_size(k - prev - 1, b->mb[k]);
|
---|
833 | prev= k;
|
---|
834 | }
|
---|
835 | }
|
---|
836 | }
|
---|
837 | }
|
---|
838 | }
|
---|
839 |
|
---|
840 | static inline void dv_encode_video_segment(DVVideoContext *s,
|
---|
841 | uint8_t *dif,
|
---|
842 | const uint16_t *mb_pos_ptr)
|
---|
843 | {
|
---|
844 | int mb_index, i, j, v;
|
---|
845 | int mb_x, mb_y, c_offset, linesize;
|
---|
846 | uint8_t* y_ptr;
|
---|
847 | uint8_t* data;
|
---|
848 | uint8_t* ptr;
|
---|
849 | int do_edge_wrap;
|
---|
850 | DECLARE_ALIGNED_8(DCTELEM, block[64]);
|
---|
851 | EncBlockInfo enc_blks[5*6];
|
---|
852 | PutBitContext pbs[5*6];
|
---|
853 | PutBitContext* pb;
|
---|
854 | EncBlockInfo* enc_blk;
|
---|
855 | int vs_bit_size = 0;
|
---|
856 | int qnos[5];
|
---|
857 |
|
---|
858 | assert((((int)block) & 7) == 0);
|
---|
859 |
|
---|
860 | enc_blk = &enc_blks[0];
|
---|
861 | pb = &pbs[0];
|
---|
862 | for(mb_index = 0; mb_index < 5; mb_index++) {
|
---|
863 | v = *mb_pos_ptr++;
|
---|
864 | mb_x = v & 0xff;
|
---|
865 | mb_y = v >> 8;
|
---|
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);
|
---|
868 | } else { /* 4:1:1 */
|
---|
869 | y_ptr = s->picture.data[0] + (mb_y * s->picture.linesize[0] * 8) + (mb_x * 8);
|
---|
870 | }
|
---|
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));
|
---|
875 | }
|
---|
876 | do_edge_wrap = 0;
|
---|
877 | qnos[mb_index] = 15; /* No quantization */
|
---|
878 | ptr = dif + mb_index*80 + 4;
|
---|
879 | for(j = 0;j < 6; j++) {
|
---|
880 | int dummy = 0;
|
---|
881 | if (s->sys->pix_fmt == PIX_FMT_YUV422P) { /* 4:2:2 */
|
---|
882 | if (j == 0 || j == 2) {
|
---|
883 | /* Y0 Y1 */
|
---|
884 | data = y_ptr + ((j>>1) * 8);
|
---|
885 | linesize = s->picture.linesize[0];
|
---|
886 | } else if (j > 3) {
|
---|
887 | /* Cr Cb */
|
---|
888 | data = s->picture.data[6 - j] + c_offset;
|
---|
889 | linesize = s->picture.linesize[6 - j];
|
---|
890 | } else {
|
---|
891 | /* j=1 and j=3 are "dummy" blocks, used for AC data only */
|
---|
892 | data = 0;
|
---|
893 | linesize = 0;
|
---|
894 | dummy = 1;
|
---|
895 | }
|
---|
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);
|
---|
901 | } else {
|
---|
902 | data = y_ptr + ((j & 1) * 8) + ((j >> 1) * 8 * s->picture.linesize[0]);
|
---|
903 | }
|
---|
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))
|
---|
910 | do_edge_wrap = 1;
|
---|
911 | }
|
---|
912 | }
|
---|
913 |
|
---|
914 | /* Everything is set up -- now just copy data -> DCT block */
|
---|
915 | if (do_edge_wrap) { /* Edge wrap copy: 4x16 -> 8x8 */
|
---|
916 | uint8_t* d;
|
---|
917 | DCTELEM *b = block;
|
---|
918 | for (i=0;i<8;i++) {
|
---|
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];
|
---|
922 | data += linesize;
|
---|
923 | b += 8;
|
---|
924 | }
|
---|
925 | } else { /* Simple copy: 8x8 -> 8x8 */
|
---|
926 | if (!dummy)
|
---|
927 | s->get_pixels(block, data, linesize);
|
---|
928 | }
|
---|
929 |
|
---|
930 | if(s->avctx->flags & CODEC_FLAG_INTERLACED_DCT)
|
---|
931 | enc_blk->dct_mode = dv_guess_dct_mode(block);
|
---|
932 | else
|
---|
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;
|
---|
937 | enc_blk->cur_ac = 0;
|
---|
938 |
|
---|
939 | if (dummy) {
|
---|
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));
|
---|
943 | } else {
|
---|
944 | s->fdct[enc_blk->dct_mode](block);
|
---|
945 | }
|
---|
946 |
|
---|
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,
|
---|
950 | j/4);
|
---|
951 |
|
---|
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);
|
---|
956 |
|
---|
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];
|
---|
959 | ++enc_blk;
|
---|
960 | ++pb;
|
---|
961 | ptr += block_sizes[j]/8;
|
---|
962 | }
|
---|
963 | }
|
---|
964 |
|
---|
965 | if (vs_total_ac_bits < vs_bit_size)
|
---|
966 | dv_guess_qnos(&enc_blks[0], &qnos[0]);
|
---|
967 |
|
---|
968 | for (i=0; i<5; i++) {
|
---|
969 | dif[i*80 + 3] = qnos[i];
|
---|
970 | }
|
---|
971 |
|
---|
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]);
|
---|
975 |
|
---|
976 | /* Second pass over each MB space */
|
---|
977 | for (j=0; j<5*6; j+=6) {
|
---|
978 | pb= &pbs[j];
|
---|
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]);
|
---|
982 | }
|
---|
983 | }
|
---|
984 |
|
---|
985 | /* Third and final pass over the whole vides segment space */
|
---|
986 | pb= &pbs[0];
|
---|
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");
|
---|
992 | }
|
---|
993 |
|
---|
994 | for (j=0; j<5*6; j++)
|
---|
995 | flush_put_bits(&pbs[j]);
|
---|
996 | }
|
---|
997 |
|
---|
998 | static int dv_decode_mt(AVCodecContext *avctx, void* sl)
|
---|
999 | {
|
---|
1000 | DVVideoContext *s = avctx->priv_data;
|
---|
1001 | int slice = (size_t)sl;
|
---|
1002 |
|
---|
1003 | /* which DIF channel is this? */
|
---|
1004 | int chan = slice / (s->sys->difseg_size * 27);
|
---|
1005 |
|
---|
1006 | /* slice within the DIF channel */
|
---|
1007 | int chan_slice = slice % (s->sys->difseg_size * 27);
|
---|
1008 |
|
---|
1009 | /* byte offset of this channel's data */
|
---|
1010 | int chan_offset = chan * s->sys->difseg_size * 150 * 80;
|
---|
1011 |
|
---|
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]);
|
---|
1014 | return 0;
|
---|
1015 | }
|
---|
1016 |
|
---|
1017 | static int dv_encode_mt(AVCodecContext *avctx, void* sl)
|
---|
1018 | {
|
---|
1019 | DVVideoContext *s = avctx->priv_data;
|
---|
1020 | int slice = (size_t)sl;
|
---|
1021 |
|
---|
1022 | /* which DIF channel is this? */
|
---|
1023 | int chan = slice / (s->sys->difseg_size * 27);
|
---|
1024 |
|
---|
1025 | /* slice within the DIF channel */
|
---|
1026 | int chan_slice = slice % (s->sys->difseg_size * 27);
|
---|
1027 |
|
---|
1028 | /* byte offset of this channel's data */
|
---|
1029 | int chan_offset = chan * s->sys->difseg_size * 150 * 80;
|
---|
1030 |
|
---|
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]);
|
---|
1033 | return 0;
|
---|
1034 | }
|
---|
1035 |
|
---|
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)
|
---|
1041 | {
|
---|
1042 | DVVideoContext *s = avctx->priv_data;
|
---|
1043 |
|
---|
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 */
|
---|
1047 |
|
---|
1048 | if(s->picture.data[0])
|
---|
1049 | avctx->release_buffer(avctx, &s->picture);
|
---|
1050 |
|
---|
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");
|
---|
1058 | return -1;
|
---|
1059 | }
|
---|
1060 | s->picture.interlaced_frame = 1;
|
---|
1061 | s->picture.top_field_first = 0;
|
---|
1062 |
|
---|
1063 | s->buf = buf;
|
---|
1064 | avctx->execute(avctx, dv_decode_mt, (void**)&dv_anchor[0], NULL,
|
---|
1065 | s->sys->n_difchan * s->sys->difseg_size * 27);
|
---|
1066 |
|
---|
1067 | emms_c();
|
---|
1068 |
|
---|
1069 | /* return image */
|
---|
1070 | *data_size = sizeof(AVFrame);
|
---|
1071 | *(AVFrame*)data= s->picture;
|
---|
1072 |
|
---|
1073 | return s->sys->frame_size;
|
---|
1074 | }
|
---|
1075 |
|
---|
1076 | static int dvvideo_encode_frame(AVCodecContext *c, uint8_t *buf, int buf_size,
|
---|
1077 | void *data)
|
---|
1078 | {
|
---|
1079 | DVVideoContext *s = c->priv_data;
|
---|
1080 |
|
---|
1081 | s->sys = dv_codec_profile(c);
|
---|
1082 | if (!s->sys)
|
---|
1083 | return -1;
|
---|
1084 | if(buf_size < s->sys->frame_size)
|
---|
1085 | return -1;
|
---|
1086 |
|
---|
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;
|
---|
1091 |
|
---|
1092 | s->buf = buf;
|
---|
1093 | c->execute(c, dv_encode_mt, (void**)&dv_anchor[0], NULL,
|
---|
1094 | s->sys->n_difchan * s->sys->difseg_size * 27);
|
---|
1095 |
|
---|
1096 | emms_c();
|
---|
1097 |
|
---|
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
|
---|
1103 | streams) */
|
---|
1104 |
|
---|
1105 | /* NTSC/PAL format */
|
---|
1106 | buf[3] = s->sys->dsf ? 0x80 : 0x00;
|
---|
1107 |
|
---|
1108 | /* 25Mbps or 50Mbps */
|
---|
1109 | buf[80*5 + 48 + 3] = (s->sys->pix_fmt == PIX_FMT_YUV422P) ? 0x4 : 0x0;
|
---|
1110 |
|
---|
1111 | return s->sys->frame_size;
|
---|
1112 | }
|
---|
1113 |
|
---|
1114 | static int dvvideo_close(AVCodecContext *c)
|
---|
1115 | {
|
---|
1116 |
|
---|
1117 | return 0;
|
---|
1118 | }
|
---|
1119 |
|
---|
1120 |
|
---|
1121 | #ifdef CONFIG_DVVIDEO_ENCODER
|
---|
1122 | AVCodec dvvideo_encoder = {
|
---|
1123 | "dvvideo",
|
---|
1124 | CODEC_TYPE_VIDEO,
|
---|
1125 | CODEC_ID_DVVIDEO,
|
---|
1126 | sizeof(DVVideoContext),
|
---|
1127 | dvvideo_init,
|
---|
1128 | dvvideo_encode_frame,
|
---|
1129 | dvvideo_close,
|
---|
1130 | NULL,
|
---|
1131 | CODEC_CAP_DR1,
|
---|
1132 | NULL
|
---|
1133 | };
|
---|
1134 | #endif // CONFIG_DVVIDEO_ENCODER
|
---|
1135 |
|
---|
1136 | AVCodec dvvideo_decoder = {
|
---|
1137 | "dvvideo",
|
---|
1138 | CODEC_TYPE_VIDEO,
|
---|
1139 | CODEC_ID_DVVIDEO,
|
---|
1140 | sizeof(DVVideoContext),
|
---|
1141 | dvvideo_init,
|
---|
1142 | NULL,
|
---|
1143 | dvvideo_close,
|
---|
1144 | dvvideo_decode_frame,
|
---|
1145 | CODEC_CAP_DR1,
|
---|
1146 | NULL
|
---|
1147 | };
|
---|