libavcodec/dv.c
Go to the documentation of this file.
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  * 100 Mbps (DVCPRO HD) support
13  * Initial code by Daniel Maas <dmaas@maasdigital.com> (funded by BBC R&D)
14  * Final code by Roman Shaposhnik
15  *
16  * Many thanks to Dan Dennedy <dan@dennedy.org> for providing wealth
17  * of DV technical info.
18  *
19  * This file is part of FFmpeg.
20  *
21  * FFmpeg is free software; you can redistribute it and/or
22  * modify it under the terms of the GNU Lesser General Public
23  * License as published by the Free Software Foundation; either
24  * version 2.1 of the License, or (at your option) any later version.
25  *
26  * FFmpeg is distributed in the hope that it will be useful,
27  * but WITHOUT ANY WARRANTY; without even the implied warranty of
28  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
29  * Lesser General Public License for more details.
30  *
31  * You should have received a copy of the GNU Lesser General Public
32  * License along with FFmpeg; if not, write to the Free Software
33  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
34  */
35 
36 /**
37  * @file
38  * DV codec.
39  */
40 
41 #include "libavutil/internal.h"
42 #include "libavutil/pixdesc.h"
43 #include "avcodec.h"
44 #include "get_bits.h"
45 #include "internal.h"
46 #include "put_bits.h"
47 #include "simple_idct.h"
48 #include "dvdata.h"
49 #include "dv_tablegen.h"
50 
51 /* XXX: also include quantization */
53 
54 static inline void dv_calc_mb_coordinates(const DVprofile *d, int chan, int seq, int slot,
55  uint16_t *tbl)
56 {
57  static const uint8_t off[] = { 2, 6, 8, 0, 4 };
58  static const uint8_t shuf1[] = { 36, 18, 54, 0, 72 };
59  static const uint8_t shuf2[] = { 24, 12, 36, 0, 48 };
60  static const uint8_t shuf3[] = { 18, 9, 27, 0, 36 };
61 
62  static const uint8_t l_start[] = {0, 4, 9, 13, 18, 22, 27, 31, 36, 40};
63  static const uint8_t l_start_shuffled[] = { 9, 4, 13, 0, 18 };
64 
65  static const uint8_t serpent1[] = {0, 1, 2, 2, 1, 0,
66  0, 1, 2, 2, 1, 0,
67  0, 1, 2, 2, 1, 0,
68  0, 1, 2, 2, 1, 0,
69  0, 1, 2};
70  static const uint8_t serpent2[] = {0, 1, 2, 3, 4, 5, 5, 4, 3, 2, 1, 0,
71  0, 1, 2, 3, 4, 5, 5, 4, 3, 2, 1, 0,
72  0, 1, 2, 3, 4, 5};
73 
74  static const uint8_t remap[][2] = {{ 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, /* dummy */
75  { 0, 0}, { 0, 1}, { 0, 2}, { 0, 3}, {10, 0},
76  {10, 1}, {10, 2}, {10, 3}, {20, 0}, {20, 1},
77  {20, 2}, {20, 3}, {30, 0}, {30, 1}, {30, 2},
78  {30, 3}, {40, 0}, {40, 1}, {40, 2}, {40, 3},
79  {50, 0}, {50, 1}, {50, 2}, {50, 3}, {60, 0},
80  {60, 1}, {60, 2}, {60, 3}, {70, 0}, {70, 1},
81  {70, 2}, {70, 3}, { 0,64}, { 0,65}, { 0,66},
82  {10,64}, {10,65}, {10,66}, {20,64}, {20,65},
83  {20,66}, {30,64}, {30,65}, {30,66}, {40,64},
84  {40,65}, {40,66}, {50,64}, {50,65}, {50,66},
85  {60,64}, {60,65}, {60,66}, {70,64}, {70,65},
86  {70,66}, { 0,67}, {20,67}, {40,67}, {60,67}};
87 
88  int i, k, m;
89  int x, y, blk;
90 
91  for (m=0; m<5; m++) {
92  switch (d->width) {
93  case 1440:
94  blk = (chan*11+seq)*27+slot;
95 
96  if (chan == 0 && seq == 11) {
97  x = m*27+slot;
98  if (x<90) {
99  y = 0;
100  } else {
101  x = (x - 90)*2;
102  y = 67;
103  }
104  } else {
105  i = (4*chan + blk + off[m])%11;
106  k = (blk/11)%27;
107 
108  x = shuf1[m] + (chan&1)*9 + k%9;
109  y = (i*3+k/9)*2 + (chan>>1) + 1;
110  }
111  tbl[m] = (x<<1)|(y<<9);
112  break;
113  case 1280:
114  blk = (chan*10+seq)*27+slot;
115 
116  i = (4*chan + (seq/5) + 2*blk + off[m])%10;
117  k = (blk/5)%27;
118 
119  x = shuf1[m]+(chan&1)*9 + k%9;
120  y = (i*3+k/9)*2 + (chan>>1) + 4;
121 
122  if (x >= 80) {
123  x = remap[y][0]+((x-80)<<(y>59));
124  y = remap[y][1];
125  }
126  tbl[m] = (x<<1)|(y<<9);
127  break;
128  case 960:
129  blk = (chan*10+seq)*27+slot;
130 
131  i = (4*chan + (seq/5) + 2*blk + off[m])%10;
132  k = (blk/5)%27 + (i&1)*3;
133 
134  x = shuf2[m] + k%6 + 6*(chan&1);
135  y = l_start[i] + k/6 + 45*(chan>>1);
136  tbl[m] = (x<<1)|(y<<9);
137  break;
138  case 720:
139  switch (d->pix_fmt) {
140  case AV_PIX_FMT_YUV422P:
141  x = shuf3[m] + slot/3;
142  y = serpent1[slot] +
143  ((((seq + off[m]) % d->difseg_size)<<1) + chan)*3;
144  tbl[m] = (x<<1)|(y<<8);
145  break;
146  case AV_PIX_FMT_YUV420P:
147  x = shuf3[m] + slot/3;
148  y = serpent1[slot] +
149  ((seq + off[m]) % d->difseg_size)*3;
150  tbl[m] = (x<<1)|(y<<9);
151  break;
152  case AV_PIX_FMT_YUV411P:
153  i = (seq + off[m]) % d->difseg_size;
154  k = slot + ((m==1||m==2)?3:0);
155 
156  x = l_start_shuffled[m] + k/6;
157  y = serpent2[k] + i*6;
158  if (x>21)
159  y = y*2 - i*6;
160  tbl[m] = (x<<2)|(y<<8);
161  break;
162  }
163  default:
164  break;
165  }
166  }
167 }
168 
169 /* quantization quanta by QNO for DV100 */
170 static const uint8_t dv100_qstep[16] = {
171  1, /* QNO = 0 and 1 both have no quantization */
172  1,
173  2, 3, 4, 5, 6, 7, 8, 16, 18, 20, 22, 24, 28, 52
174 };
175 
176 static const uint8_t dv_quant_areas[4] = { 6, 21, 43, 64 };
177 
179 {
180  int j,i,c,s,p;
181  uint32_t *factor1, *factor2;
182  const int *iweight1, *iweight2;
183 
184  if (!d->work_chunks[dv_work_pool_size(d)-1].buf_offset) {
185  p = i = 0;
186  for (c=0; c<d->n_difchan; c++) {
187  for (s=0; s<d->difseg_size; s++) {
188  p += 6;
189  for (j=0; j<27; j++) {
190  p += !(j%3);
191  if (!(DV_PROFILE_IS_1080i50(d) && c != 0 && s == 11) &&
192  !(DV_PROFILE_IS_720p50(d) && s > 9)) {
193  dv_calc_mb_coordinates(d, c, s, j, &d->work_chunks[i].mb_coordinates[0]);
194  d->work_chunks[i++].buf_offset = p;
195  }
196  p += 5;
197  }
198  }
199  }
200  }
201 
202  if (!d->idct_factor[DV_PROFILE_IS_HD(d)?8191:5631]) {
203  factor1 = &d->idct_factor[0];
204  factor2 = &d->idct_factor[DV_PROFILE_IS_HD(d)?4096:2816];
205  if (d->height == 720) {
206  iweight1 = &ff_dv_iweight_720_y[0];
207  iweight2 = &ff_dv_iweight_720_c[0];
208  } else {
209  iweight1 = &ff_dv_iweight_1080_y[0];
210  iweight2 = &ff_dv_iweight_1080_c[0];
211  }
212  if (DV_PROFILE_IS_HD(d)) {
213  for (c = 0; c < 4; c++) {
214  for (s = 0; s < 16; s++) {
215  for (i = 0; i < 64; i++) {
216  *factor1++ = (dv100_qstep[s] << (c + 9)) * iweight1[i];
217  *factor2++ = (dv100_qstep[s] << (c + 9)) * iweight2[i];
218  }
219  }
220  }
221  } else {
222  iweight1 = &ff_dv_iweight_88[0];
223  for (j = 0; j < 2; j++, iweight1 = &ff_dv_iweight_248[0]) {
224  for (s = 0; s < 22; s++) {
225  for (i = c = 0; c < 4; c++) {
226  for (; i < dv_quant_areas[c]; i++) {
227  *factor1 = iweight1[i] << (ff_dv_quant_shifts[s][c] + 1);
228  *factor2++ = (*factor1++) << 1;
229  }
230  }
231  }
232  }
233  }
234  }
235 
236  return 0;
237 }
238 
240 {
241  DVVideoContext *s = avctx->priv_data;
242  DSPContext dsp;
243  static int done = 0;
244  int i, j;
245 
246  if (!done) {
247  VLC dv_vlc;
248  uint16_t new_dv_vlc_bits[NB_DV_VLC*2];
249  uint8_t new_dv_vlc_len[NB_DV_VLC*2];
250  uint8_t new_dv_vlc_run[NB_DV_VLC*2];
251  int16_t new_dv_vlc_level[NB_DV_VLC*2];
252 
253  done = 1;
254 
255  /* it's faster to include sign bit in a generic VLC parsing scheme */
256  for (i = 0, j = 0; i < NB_DV_VLC; i++, j++) {
257  new_dv_vlc_bits[j] = dv_vlc_bits[i];
258  new_dv_vlc_len[j] = dv_vlc_len[i];
259  new_dv_vlc_run[j] = dv_vlc_run[i];
260  new_dv_vlc_level[j] = dv_vlc_level[i];
261 
262  if (dv_vlc_level[i]) {
263  new_dv_vlc_bits[j] <<= 1;
264  new_dv_vlc_len[j]++;
265 
266  j++;
267  new_dv_vlc_bits[j] = (dv_vlc_bits[i] << 1) | 1;
268  new_dv_vlc_len[j] = dv_vlc_len[i] + 1;
269  new_dv_vlc_run[j] = dv_vlc_run[i];
270  new_dv_vlc_level[j] = -dv_vlc_level[i];
271  }
272  }
273 
274  /* NOTE: as a trick, we use the fact the no codes are unused
275  to accelerate the parsing of partial codes */
276  init_vlc(&dv_vlc, TEX_VLC_BITS, j,
277  new_dv_vlc_len, 1, 1, new_dv_vlc_bits, 2, 2, 0);
278  av_assert1(dv_vlc.table_size == 1184);
279 
280  for (i = 0; i < dv_vlc.table_size; i++){
281  int code = dv_vlc.table[i][0];
282  int len = dv_vlc.table[i][1];
283  int level, run;
284 
285  if (len < 0){ //more bits needed
286  run = 0;
287  level = code;
288  } else {
289  run = new_dv_vlc_run [code] + 1;
290  level = new_dv_vlc_level[code];
291  }
292  ff_dv_rl_vlc[i].len = len;
293  ff_dv_rl_vlc[i].level = level;
294  ff_dv_rl_vlc[i].run = run;
295  }
296  ff_free_vlc(&dv_vlc);
297  }
298 
299  /* Generic DSP setup */
300  memset(&dsp,0, sizeof(dsp));
301  ff_dsputil_init(&dsp, avctx);
302  ff_set_cmp(&dsp, dsp.ildct_cmp, avctx->ildct_cmp);
303  s->get_pixels = dsp.get_pixels;
304  s->ildct_cmp = dsp.ildct_cmp[5];
305 
306  /* 88DCT setup */
307  s->fdct[0] = dsp.fdct;
308  s->idct_put[0] = dsp.idct_put;
309  for (i = 0; i < 64; i++)
310  s->dv_zigzag[0][i] = dsp.idct_permutation[ff_zigzag_direct[i]];
311 
312  /* 248DCT setup */
313  s->fdct[1] = dsp.fdct248;
314  s->idct_put[1] = ff_simple_idct248_put; // FIXME: need to add it to DSP
315  if (avctx->lowres){
316  for (i = 0; i < 64; i++){
317  int j = ff_zigzag248_direct[i];
318  s->dv_zigzag[1][i] = dsp.idct_permutation[(j & 7) + (j & 8) * 4 + (j & 48) / 2];
319  }
320  }else
321  memcpy(s->dv_zigzag[1], ff_zigzag248_direct, 64);
322 
324  avctx->coded_frame = &s->picture;
325  s->avctx = avctx;
327 
328  return 0;
329 }
330 
332 {
333  if (!avpriv_dv_codec_profile(avctx)) {
334  av_log(avctx, AV_LOG_ERROR, "Found no DV profile for %ix%i %s video. "
335  "Valid DV profiles are:\n",
336  avctx->width, avctx->height, av_get_pix_fmt_name(avctx->pix_fmt));
338  return AVERROR(EINVAL);
339  }
340  if (avctx->height > 576) {
341  av_log(avctx, AV_LOG_ERROR, "DVCPRO HD encoding is not supported.\n");
342  return AVERROR_PATCHWELCOME;
343  }
344 
346 
347  return ff_dvvideo_init(avctx);
348 }
349 
350 /* bit budget for AC only in 5 MBs */
351 static const int vs_total_ac_bits = (100 * 4 + 68*2) * 5;
352 static const int mb_area_start[5] = { 1, 6, 21, 43, 64 };
353 
354 static inline int put_bits_left(PutBitContext* s)
355 {
356  return (s->buf_end - s->buf) * 8 - put_bits_count(s);
357 }
358 
359 #if CONFIG_SMALL
360 /* Converts run and level (where level != 0) pair into VLC, returning bit size */
361 static av_always_inline int dv_rl2vlc(int run, int level, int sign, uint32_t* vlc)
362 {
363  int size;
365  *vlc = dv_vlc_map[run][level].vlc | sign;
366  size = dv_vlc_map[run][level].size;
367  }
368  else {
369  if (level < DV_VLC_MAP_LEV_SIZE) {
370  *vlc = dv_vlc_map[0][level].vlc | sign;
371  size = dv_vlc_map[0][level].size;
372  } else {
373  *vlc = 0xfe00 | (level << 1) | sign;
374  size = 16;
375  }
376  if (run) {
377  *vlc |= ((run < 16) ? dv_vlc_map[run-1][0].vlc :
378  (0x1f80 | (run - 1))) << size;
379  size += (run < 16) ? dv_vlc_map[run-1][0].size : 13;
380  }
381  }
382 
383  return size;
384 }
385 
386 static av_always_inline int dv_rl2vlc_size(int run, int level)
387 {
388  int size;
389 
390  if (run < DV_VLC_MAP_RUN_SIZE && level < DV_VLC_MAP_LEV_SIZE) {
391  size = dv_vlc_map[run][level].size;
392  }
393  else {
394  size = (level < DV_VLC_MAP_LEV_SIZE) ? dv_vlc_map[0][level].size : 16;
395  if (run) {
396  size += (run < 16) ? dv_vlc_map[run-1][0].size : 13;
397  }
398  }
399  return size;
400 }
401 #else
402 static av_always_inline int dv_rl2vlc(int run, int l, int sign, uint32_t* vlc)
403 {
404  *vlc = dv_vlc_map[run][l].vlc | sign;
405  return dv_vlc_map[run][l].size;
406 }
407 
408 static av_always_inline int dv_rl2vlc_size(int run, int l)
409 {
410  return dv_vlc_map[run][l].size;
411 }
412 #endif
413 
414 typedef struct EncBlockInfo {
415  int area_q[4];
416  int bit_size[4];
417  int prev[5];
418  int cur_ac;
419  int cno;
420  int dct_mode;
421  int16_t mb[64];
425  uint32_t partial_bit_buffer; /* we can't use uint16_t here */
426 } EncBlockInfo;
427 
429  PutBitContext* pb_pool,
430  PutBitContext* pb_end)
431 {
432  int prev, bits_left;
433  PutBitContext* pb = pb_pool;
434  int size = bi->partial_bit_count;
435  uint32_t vlc = bi->partial_bit_buffer;
436 
438  for (;;){
439  /* Find suitable storage space */
440  for (; size > (bits_left = put_bits_left(pb)); pb++) {
441  if (bits_left) {
442  size -= bits_left;
443  put_bits(pb, bits_left, vlc >> size);
444  vlc = vlc & ((1 << size) - 1);
445  }
446  if (pb + 1 >= pb_end) {
447  bi->partial_bit_count = size;
448  bi->partial_bit_buffer = vlc;
449  return pb;
450  }
451  }
452 
453  /* Store VLC */
454  put_bits(pb, size, vlc);
455 
456  if (bi->cur_ac >= 64)
457  break;
458 
459  /* Construct the next VLC */
460  prev = bi->cur_ac;
461  bi->cur_ac = bi->next[prev];
462  if (bi->cur_ac < 64){
463  size = dv_rl2vlc(bi->cur_ac - prev - 1, bi->mb[bi->cur_ac], bi->sign[bi->cur_ac], &vlc);
464  } else {
465  size = 4; vlc = 6; /* End Of Block stamp */
466  }
467  }
468  return pb;
469 }
470 
473  int ps = s->ildct_cmp(NULL, data, NULL, linesize, 8) - 400;
474  if (ps > 0) {
475  int is = s->ildct_cmp(NULL, data , NULL, linesize<<1, 4) +
476  s->ildct_cmp(NULL, data + linesize, NULL, linesize<<1, 4);
477  return ps > is;
478  }
479  }
480 
481  return 0;
482 }
483 
484 static const int dv_weight_bits = 18;
485 static const int dv_weight_88[64] = {
486  131072, 257107, 257107, 242189, 252167, 242189, 235923, 237536,
487  237536, 235923, 229376, 231390, 223754, 231390, 229376, 222935,
488  224969, 217965, 217965, 224969, 222935, 200636, 218652, 211916,
489  212325, 211916, 218652, 200636, 188995, 196781, 205965, 206433,
490  206433, 205965, 196781, 188995, 185364, 185364, 200636, 200704,
491  200636, 185364, 185364, 174609, 180568, 195068, 195068, 180568,
492  174609, 170091, 175557, 189591, 175557, 170091, 165371, 170627,
493  170627, 165371, 160727, 153560, 160727, 144651, 144651, 136258,
494 };
495 static const int dv_weight_248[64] = {
496  131072, 242189, 257107, 237536, 229376, 200636, 242189, 223754,
497  224969, 196781, 262144, 242189, 229376, 200636, 257107, 237536,
498  211916, 185364, 235923, 217965, 229376, 211916, 206433, 180568,
499  242189, 223754, 224969, 196781, 211916, 185364, 235923, 217965,
500  200704, 175557, 222935, 205965, 200636, 185364, 195068, 170627,
501  229376, 211916, 206433, 180568, 200704, 175557, 222935, 205965,
502  175557, 153560, 188995, 174609, 165371, 144651, 200636, 185364,
503  195068, 170627, 175557, 153560, 188995, 174609, 165371, 144651,
504 };
505 
506 static av_always_inline int dv_init_enc_block(EncBlockInfo* bi, uint8_t *data, int linesize, DVVideoContext *s, int bias)
507 {
508  const int *weight;
509  const uint8_t* zigzag_scan;
510  LOCAL_ALIGNED_16(int16_t, blk, [64]);
511  int i, area;
512  /* We offer two different methods for class number assignment: the
513  method suggested in SMPTE 314M Table 22, and an improved
514  method. The SMPTE method is very conservative; it assigns class
515  3 (i.e. severe quantization) to any block where the largest AC
516  component is greater than 36. FFmpeg's DV encoder tracks AC bit
517  consumption precisely, so there is no need to bias most blocks
518  towards strongly lossy compression. Instead, we assign class 2
519  to most blocks, and use class 3 only when strictly necessary
520  (for blocks whose largest AC component exceeds 255). */
521 
522 #if 0 /* SMPTE spec method */
523  static const int classes[] = {12, 24, 36, 0xffff};
524 #else /* improved FFmpeg method */
525  static const int classes[] = {-1, -1, 255, 0xffff};
526 #endif
527  int max = classes[0];
528  int prev = 0;
529 
530  av_assert2((((int)blk) & 15) == 0);
531 
532  bi->area_q[0] = bi->area_q[1] = bi->area_q[2] = bi->area_q[3] = 0;
533  bi->partial_bit_count = 0;
534  bi->partial_bit_buffer = 0;
535  bi->cur_ac = 0;
536  if (data) {
537  bi->dct_mode = dv_guess_dct_mode(s, data, linesize);
538  s->get_pixels(blk, data, linesize);
539  s->fdct[bi->dct_mode](blk);
540  } else {
541  /* We rely on the fact that encoding all zeros leads to an immediate EOB,
542  which is precisely what the spec calls for in the "dummy" blocks. */
543  memset(blk, 0, 64*sizeof(*blk));
544  bi->dct_mode = 0;
545  }
546  bi->mb[0] = blk[0];
547 
548  zigzag_scan = bi->dct_mode ? ff_zigzag248_direct : ff_zigzag_direct;
549  weight = bi->dct_mode ? dv_weight_248 : dv_weight_88;
550 
551  for (area = 0; area < 4; area++) {
552  bi->prev[area] = prev;
553  bi->bit_size[area] = 1; // 4 areas 4 bits for EOB :)
554  for (i = mb_area_start[area]; i < mb_area_start[area+1]; i++) {
555  int level = blk[zigzag_scan[i]];
556 
557  if (level + 15 > 30U) {
558  bi->sign[i] = (level >> 31) & 1;
559  /* weight it and and shift down into range, adding for rounding */
560  /* the extra division by a factor of 2^4 reverses the 8x expansion of the DCT
561  AND the 2x doubling of the weights */
562  level = (FFABS(level) * weight[i] + (1 << (dv_weight_bits+3))) >> (dv_weight_bits+4);
563  bi->mb[i] = level;
564  if (level > max)
565  max = level;
566  bi->bit_size[area] += dv_rl2vlc_size(i - prev - 1, level);
567  bi->next[prev]= i;
568  prev = i;
569  }
570  }
571  }
572  bi->next[prev]= i;
573  for (bi->cno = 0; max > classes[bi->cno]; bi->cno++);
574 
575  bi->cno += bias;
576 
577  if (bi->cno >= 3) {
578  bi->cno = 3;
579  prev = 0;
580  i = bi->next[prev];
581  for (area = 0; area < 4; area++) {
582  bi->prev[area] = prev;
583  bi->bit_size[area] = 1; // 4 areas 4 bits for EOB :)
584  for (; i < mb_area_start[area+1]; i = bi->next[i]) {
585  bi->mb[i] >>= 1;
586 
587  if (bi->mb[i]) {
588  bi->bit_size[area] += dv_rl2vlc_size(i - prev - 1, bi->mb[i]);
589  bi->next[prev]= i;
590  prev = i;
591  }
592  }
593  }
594  bi->next[prev]= i;
595  }
596 
597  return bi->bit_size[0] + bi->bit_size[1] + bi->bit_size[2] + bi->bit_size[3];
598 }
599 
600 static inline void dv_guess_qnos(EncBlockInfo* blks, int* qnos)
601 {
602  int size[5];
603  int i, j, k, a, prev, a2;
604  EncBlockInfo* b;
605 
606  size[0] = size[1] = size[2] = size[3] = size[4] = 1 << 24;
607  do {
608  b = blks;
609  for (i = 0; i < 5; i++) {
610  if (!qnos[i])
611  continue;
612 
613  qnos[i]--;
614  size[i] = 0;
615  for (j = 0; j < 6; j++, b++) {
616  for (a = 0; a < 4; a++) {
617  if (b->area_q[a] != ff_dv_quant_shifts[qnos[i] + ff_dv_quant_offset[b->cno]][a]) {
618  b->bit_size[a] = 1; // 4 areas 4 bits for EOB :)
619  b->area_q[a]++;
620  prev = b->prev[a];
621  av_assert2(b->next[prev] >= mb_area_start[a+1] || b->mb[prev]);
622  for (k = b->next[prev] ; k < mb_area_start[a+1]; k = b->next[k]) {
623  b->mb[k] >>= 1;
624  if (b->mb[k]) {
625  b->bit_size[a] += dv_rl2vlc_size(k - prev - 1, b->mb[k]);
626  prev = k;
627  } else {
628  if (b->next[k] >= mb_area_start[a+1] && b->next[k]<64){
629  for (a2 = a + 1; b->next[k] >= mb_area_start[a2+1]; a2++)
630  b->prev[a2] = prev;
631  av_assert2(a2 < 4);
632  av_assert2(b->mb[b->next[k]]);
633  b->bit_size[a2] += dv_rl2vlc_size(b->next[k] - prev - 1, b->mb[b->next[k]])
634  -dv_rl2vlc_size(b->next[k] - k - 1, b->mb[b->next[k]]);
635  av_assert2(b->prev[a2] == k && (a2 + 1 >= 4 || b->prev[a2+1] != k));
636  b->prev[a2] = prev;
637  }
638  b->next[prev] = b->next[k];
639  }
640  }
641  b->prev[a+1]= prev;
642  }
643  size[i] += b->bit_size[a];
644  }
645  }
646  if (vs_total_ac_bits >= size[0] + size[1] + size[2] + size[3] + size[4])
647  return;
648  }
649  } while (qnos[0]|qnos[1]|qnos[2]|qnos[3]|qnos[4]);
650 
651 
652  for (a = 2; a == 2 || vs_total_ac_bits < size[0]; a += a){
653  b = blks;
654  size[0] = 5 * 6 * 4; //EOB
655  for (j = 0; j < 6 *5; j++, b++) {
656  prev = b->prev[0];
657  for (k = b->next[prev]; k < 64; k = b->next[k]) {
658  if (b->mb[k] < a && b->mb[k] > -a){
659  b->next[prev] = b->next[k];
660  }else{
661  size[0] += dv_rl2vlc_size(k - prev - 1, b->mb[k]);
662  prev = k;
663  }
664  }
665  }
666  }
667 }
668 
669 static int dv_encode_video_segment(AVCodecContext *avctx, void *arg)
670 {
671  DVVideoContext *s = avctx->priv_data;
672  DVwork_chunk *work_chunk = arg;
673  int mb_index, i, j;
674  int mb_x, mb_y, c_offset, linesize, y_stride;
675  uint8_t* y_ptr;
676  uint8_t* dif;
677  LOCAL_ALIGNED_8(uint8_t, scratch, [128]);
678  EncBlockInfo enc_blks[5*DV_MAX_BPM];
679  PutBitContext pbs[5*DV_MAX_BPM];
680  PutBitContext* pb;
681  EncBlockInfo* enc_blk;
682  int vs_bit_size = 0;
683  int qnos[5] = {15, 15, 15, 15, 15}; /* No quantization */
684  int* qnosp = &qnos[0];
685 
686  dif = &s->buf[work_chunk->buf_offset*80];
687  enc_blk = &enc_blks[0];
688  for (mb_index = 0; mb_index < 5; mb_index++) {
689  dv_calculate_mb_xy(s, work_chunk, mb_index, &mb_x, &mb_y);
690 
691  /* initializing luminance blocks */
692  if ((s->sys->pix_fmt == AV_PIX_FMT_YUV420P) ||
693  (s->sys->pix_fmt == AV_PIX_FMT_YUV411P && mb_x >= (704 / 8)) ||
694  (s->sys->height >= 720 && mb_y != 134)) {
695  y_stride = s->picture.linesize[0] << 3;
696  } else {
697  y_stride = 16;
698  }
699  y_ptr = s->picture.data[0] + ((mb_y * s->picture.linesize[0] + mb_x) << 3);
700  linesize = s->picture.linesize[0];
701 
702  if (s->sys->video_stype == 4) { /* SD 422 */
703  vs_bit_size +=
704  dv_init_enc_block(enc_blk+0, y_ptr , linesize, s, 0) +
705  dv_init_enc_block(enc_blk+1, NULL , linesize, s, 0) +
706  dv_init_enc_block(enc_blk+2, y_ptr + 8 , linesize, s, 0) +
707  dv_init_enc_block(enc_blk+3, NULL , linesize, s, 0);
708  } else {
709  vs_bit_size +=
710  dv_init_enc_block(enc_blk+0, y_ptr , linesize, s, 0) +
711  dv_init_enc_block(enc_blk+1, y_ptr + 8 , linesize, s, 0) +
712  dv_init_enc_block(enc_blk+2, y_ptr + y_stride, linesize, s, 0) +
713  dv_init_enc_block(enc_blk+3, y_ptr + 8 + y_stride, linesize, s, 0);
714  }
715  enc_blk += 4;
716 
717  /* initializing chrominance blocks */
718  c_offset = (((mb_y >> (s->sys->pix_fmt == AV_PIX_FMT_YUV420P)) * s->picture.linesize[1] +
719  (mb_x >> ((s->sys->pix_fmt == AV_PIX_FMT_YUV411P) ? 2 : 1))) << 3);
720  for (j = 2; j; j--) {
721  uint8_t *c_ptr = s->picture.data[j] + c_offset;
722  linesize = s->picture.linesize[j];
723  y_stride = (mb_y == 134) ? 8 : (s->picture.linesize[j] << 3);
724  if (s->sys->pix_fmt == AV_PIX_FMT_YUV411P && mb_x >= (704 / 8)) {
725  uint8_t* d;
726  uint8_t* b = scratch;
727  for (i = 0; i < 8; i++) {
728  d = c_ptr + (linesize << 3);
729  b[0] = c_ptr[0]; b[1] = c_ptr[1]; b[2] = c_ptr[2]; b[3] = c_ptr[3];
730  b[4] = d[0]; b[5] = d[1]; b[6] = d[2]; b[7] = d[3];
731  c_ptr += linesize;
732  b += 16;
733  }
734  c_ptr = scratch;
735  linesize = 16;
736  }
737 
738  vs_bit_size += dv_init_enc_block( enc_blk++, c_ptr , linesize, s, 1);
739  if (s->sys->bpm == 8) {
740  vs_bit_size += dv_init_enc_block(enc_blk++, c_ptr + y_stride, linesize, s, 1);
741  }
742  }
743  }
744 
745  if (vs_total_ac_bits < vs_bit_size)
746  dv_guess_qnos(&enc_blks[0], qnosp);
747 
748  /* DIF encoding process */
749  for (j=0; j<5*s->sys->bpm;) {
750  int start_mb = j;
751 
752  dif[3] = *qnosp++;
753  dif += 4;
754 
755  /* First pass over individual cells only */
756  for (i=0; i<s->sys->bpm; i++, j++) {
757  int sz = s->sys->block_sizes[i]>>3;
758 
759  init_put_bits(&pbs[j], dif, sz);
760  put_sbits(&pbs[j], 9, ((enc_blks[j].mb[0] >> 3) - 1024 + 2) >> 2);
761  put_bits(&pbs[j], 1, enc_blks[j].dct_mode);
762  put_bits(&pbs[j], 2, enc_blks[j].cno);
763 
764  dv_encode_ac(&enc_blks[j], &pbs[j], &pbs[j+1]);
765  dif += sz;
766  }
767 
768  /* Second pass over each MB space */
769  pb = &pbs[start_mb];
770  for (i=0; i<s->sys->bpm; i++) {
771  if (enc_blks[start_mb+i].partial_bit_count)
772  pb = dv_encode_ac(&enc_blks[start_mb+i], pb, &pbs[start_mb+s->sys->bpm]);
773  }
774  }
775 
776  /* Third and final pass over the whole video segment space */
777  pb = &pbs[0];
778  for (j=0; j<5*s->sys->bpm; j++) {
779  if (enc_blks[j].partial_bit_count)
780  pb = dv_encode_ac(&enc_blks[j], pb, &pbs[s->sys->bpm*5]);
781  if (enc_blks[j].partial_bit_count)
782  av_log(avctx, AV_LOG_ERROR, "ac bitstream overflow\n");
783  }
784 
785  for (j=0; j<5*s->sys->bpm; j++) {
786  int pos;
787  int size = pbs[j].size_in_bits >> 3;
788  flush_put_bits(&pbs[j]);
789  pos = put_bits_count(&pbs[j]) >> 3;
790  if (pos > size) {
791  av_log(avctx, AV_LOG_ERROR, "bitstream written beyond buffer size\n");
792  return -1;
793  }
794  memset(pbs[j].buf + pos, 0xff, size - pos);
795  }
796 
797  return 0;
798 }
799 
800 static inline int dv_write_pack(enum dv_pack_type pack_id, DVVideoContext *c,
801  uint8_t* buf)
802 {
803  /*
804  * Here's what SMPTE314M says about these two:
805  * (page 6) APTn, AP1n, AP2n, AP3n: These data shall be identical
806  * as track application IDs (APTn = 001, AP1n =
807  * 001, AP2n = 001, AP3n = 001), if the source signal
808  * comes from a digital VCR. If the signal source is
809  * unknown, all bits for these data shall be set to 1.
810  * (page 12) STYPE: STYPE defines a signal type of video signal
811  * 00000b = 4:1:1 compression
812  * 00100b = 4:2:2 compression
813  * XXXXXX = Reserved
814  * Now, I've got two problems with these statements:
815  * 1. it looks like APT == 111b should be a safe bet, but it isn't.
816  * It seems that for PAL as defined in IEC 61834 we have to set
817  * APT to 000 and for SMPTE314M to 001.
818  * 2. It is not at all clear what STYPE is used for 4:2:0 PAL
819  * compression scheme (if any).
820  */
821  int apt = (c->sys->pix_fmt == AV_PIX_FMT_YUV420P ? 0 : 1);
822  int fs = c->picture.top_field_first ? 0x00 : 0x40;
823 
824  uint8_t aspect = 0;
825  if ((int)(av_q2d(c->avctx->sample_aspect_ratio) * c->avctx->width / c->avctx->height * 10) >= 17) /* 16:9 */
826  aspect = 0x02;
827 
828  buf[0] = (uint8_t)pack_id;
829  switch (pack_id) {
830  case dv_header525: /* I can't imagine why these two weren't defined as real */
831  case dv_header625: /* packs in SMPTE314M -- they definitely look like ones */
832  buf[1] = 0xf8 | /* reserved -- always 1 */
833  (apt & 0x07); /* APT: Track application ID */
834  buf[2] = (0 << 7) | /* TF1: audio data is 0 - valid; 1 - invalid */
835  (0x0f << 3) | /* reserved -- always 1 */
836  (apt & 0x07); /* AP1: Audio application ID */
837  buf[3] = (0 << 7) | /* TF2: video data is 0 - valid; 1 - invalid */
838  (0x0f << 3) | /* reserved -- always 1 */
839  (apt & 0x07); /* AP2: Video application ID */
840  buf[4] = (0 << 7) | /* TF3: subcode(SSYB) is 0 - valid; 1 - invalid */
841  (0x0f << 3) | /* reserved -- always 1 */
842  (apt & 0x07); /* AP3: Subcode application ID */
843  break;
844  case dv_video_source:
845  buf[1] = 0xff; /* reserved -- always 1 */
846  buf[2] = (1 << 7) | /* B/W: 0 - b/w, 1 - color */
847  (1 << 6) | /* following CLF is valid - 0, invalid - 1 */
848  (3 << 4) | /* CLF: color frames ID (see ITU-R BT.470-4) */
849  0xf; /* reserved -- always 1 */
850  buf[3] = (3 << 6) | /* reserved -- always 1 */
851  (c->sys->dsf << 5) | /* system: 60fields/50fields */
852  c->sys->video_stype; /* signal type video compression */
853  buf[4] = 0xff; /* VISC: 0xff -- no information */
854  break;
855  case dv_video_control:
856  buf[1] = (0 << 6) | /* Copy generation management (CGMS) 0 -- free */
857  0x3f; /* reserved -- always 1 */
858  buf[2] = 0xc8 | /* reserved -- always b11001xxx */
859  aspect;
860  buf[3] = (1 << 7) | /* frame/field flag 1 -- frame, 0 -- field */
861  fs | /* first/second field flag 0 -- field 2, 1 -- field 1 */
862  (1 << 5) | /* frame change flag 0 -- same picture as before, 1 -- different */
863  (1 << 4) | /* 1 - interlaced, 0 - noninterlaced */
864  0xc; /* reserved -- always b1100 */
865  buf[4] = 0xff; /* reserved -- always 1 */
866  break;
867  default:
868  buf[1] = buf[2] = buf[3] = buf[4] = 0xff;
869  }
870  return 5;
871 }
872 
873 #if CONFIG_DVVIDEO_ENCODER
874 static inline int dv_write_dif_id(enum dv_section_type t, uint8_t chan_num,
875  uint8_t seq_num, uint8_t dif_num,
876  uint8_t* buf)
877 {
878  buf[0] = (uint8_t)t; /* Section type */
879  buf[1] = (seq_num << 4) | /* DIF seq number 0-9 for 525/60; 0-11 for 625/50 */
880  (chan_num << 3) | /* FSC: for 50Mb/s 0 - first channel; 1 - second */
881  7; /* reserved -- always 1 */
882  buf[2] = dif_num; /* DIF block number Video: 0-134, Audio: 0-8 */
883  return 3;
884 }
885 
886 
887 static inline int dv_write_ssyb_id(uint8_t syb_num, uint8_t fr, uint8_t* buf)
888 {
889  if (syb_num == 0 || syb_num == 6) {
890  buf[0] = (fr << 7) | /* FR ID 1 - first half of each channel; 0 - second */
891  (0 << 4) | /* AP3 (Subcode application ID) */
892  0x0f; /* reserved -- always 1 */
893  }
894  else if (syb_num == 11) {
895  buf[0] = (fr << 7) | /* FR ID 1 - first half of each channel; 0 - second */
896  0x7f; /* reserved -- always 1 */
897  }
898  else {
899  buf[0] = (fr << 7) | /* FR ID 1 - first half of each channel; 0 - second */
900  (0 << 4) | /* APT (Track application ID) */
901  0x0f; /* reserved -- always 1 */
902  }
903  buf[1] = 0xf0 | /* reserved -- always 1 */
904  (syb_num & 0x0f); /* SSYB number 0 - 11 */
905  buf[2] = 0xff; /* reserved -- always 1 */
906  return 3;
907 }
908 
909 static void dv_format_frame(DVVideoContext* c, uint8_t* buf)
910 {
911  int chan, i, j, k;
912 
913  for (chan = 0; chan < c->sys->n_difchan; chan++) {
914  for (i = 0; i < c->sys->difseg_size; i++) {
915  memset(buf, 0xff, 80 * 6); /* first 6 DIF blocks are for control data */
916 
917  /* DV header: 1DIF */
918  buf += dv_write_dif_id(dv_sect_header, chan, i, 0, buf);
919  buf += dv_write_pack((c->sys->dsf ? dv_header625 : dv_header525), c, buf);
920  buf += 72; /* unused bytes */
921 
922  /* DV subcode: 2DIFs */
923  for (j = 0; j < 2; j++) {
924  buf += dv_write_dif_id(dv_sect_subcode, chan, i, j, buf);
925  for (k = 0; k < 6; k++)
926  buf += dv_write_ssyb_id(k, (i < c->sys->difseg_size/2), buf) + 5;
927  buf += 29; /* unused bytes */
928  }
929 
930  /* DV VAUX: 3DIFS */
931  for (j = 0; j < 3; j++) {
932  buf += dv_write_dif_id(dv_sect_vaux, chan, i, j, buf);
933  buf += dv_write_pack(dv_video_source, c, buf);
934  buf += dv_write_pack(dv_video_control, c, buf);
935  buf += 7*5;
936  buf += dv_write_pack(dv_video_source, c, buf);
937  buf += dv_write_pack(dv_video_control, c, buf);
938  buf += 4*5 + 2; /* unused bytes */
939  }
940 
941  /* DV Audio/Video: 135 Video DIFs + 9 Audio DIFs */
942  for (j = 0; j < 135; j++) {
943  if (j%15 == 0) {
944  memset(buf, 0xff, 80);
945  buf += dv_write_dif_id(dv_sect_audio, chan, i, j/15, buf);
946  buf += 77; /* audio control & shuffled PCM audio */
947  }
948  buf += dv_write_dif_id(dv_sect_video, chan, i, j, buf);
949  buf += 77; /* 1 video macroblock: 1 bytes control
950  4 * 14 bytes Y 8x8 data
951  10 bytes Cr 8x8 data
952  10 bytes Cb 8x8 data */
953  }
954  }
955  }
956 }
957 
958 
959 static int dvvideo_encode_frame(AVCodecContext *c, AVPacket *pkt,
960  const AVFrame *frame, int *got_packet)
961 {
962  DVVideoContext *s = c->priv_data;
963  int ret;
964 
966  if (!s->sys || ff_dv_init_dynamic_tables(s->sys))
967  return -1;
968  if ((ret = ff_alloc_packet2(c, pkt, s->sys->frame_size)) < 0)
969  return ret;
970 
971  c->pix_fmt = s->sys->pix_fmt;
972  s->picture = *frame;
973  s->picture.key_frame = 1;
975 
976  s->buf = pkt->data;
978  dv_work_pool_size(s->sys), sizeof(DVwork_chunk));
979 
980  emms_c();
981 
982  dv_format_frame(s, pkt->data);
983 
984  pkt->flags |= AV_PKT_FLAG_KEY;
985  *got_packet = 1;
986 
987  return 0;
988 }
989 
990 AVCodec ff_dvvideo_encoder = {
991  .name = "dvvideo",
992  .type = AVMEDIA_TYPE_VIDEO,
993  .id = AV_CODEC_ID_DVVIDEO,
994  .priv_data_size = sizeof(DVVideoContext),
996  .encode2 = dvvideo_encode_frame,
997  .capabilities = CODEC_CAP_SLICE_THREADS,
998  .pix_fmts = (const enum AVPixelFormat[]) {
1000  },
1001  .long_name = NULL_IF_CONFIG_SMALL("DV (Digital Video)"),
1002 };
1003 #endif // CONFIG_DVVIDEO_ENCODER
int table_size
Definition: get_bits.h:66
av_cold void ff_dsputil_init(DSPContext *c, AVCodecContext *avctx)
Definition: dsputil.c:2675
const char * s
Definition: avisynth_c.h:668
void(* fdct248)(int16_t *block)
Definition: dsputil.h:219
void ff_dv_print_profiles(void *logctx, int loglevel)
Print all allowed DV profiles into logctx at specified logging level.
Definition: dv_profile.c:351
This structure describes decoded (raw) audio or video data.
Definition: frame.h:76
RL_VLC_ELEM ff_dv_rl_vlc[1184]
Definition: libavcodec/dv.c:52
const int ff_dv_iweight_720_y[64]
Definition: dvdata.c:102
static void put_sbits(PutBitContext *pb, int n, int32_t value)
Definition: put_bits.h:172
int ff_dv_init_dynamic_tables(const DVprofile *d)
AVFrame * coded_frame
the picture in the bitstream
if max(w)>1 w=0.9 *w/max(w)
static av_cold int init(AVCodecContext *avctx)
Definition: avrndec.c:35
const uint8_t ff_zigzag248_direct[64]
Definition: dsputil.c:60
static const uint8_t dv_vlc_run[NB_DV_VLC]
Definition: dv_vlc_data.h:149
struct DVVideoContext DVVideoContext
static av_always_inline int dv_rl2vlc(int run, int l, int sign, uint32_t *vlc)
AVRational sample_aspect_ratio
sample aspect ratio (0 if unknown) That is the width of a pixel divided by the height of the pixel...
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
static int dv_write_pack(enum dv_pack_type pack_id, DVVideoContext *c, uint8_t *buf)
me_cmp_func ildct_cmp
Definition: dvdata.h:46
static void dv_calculate_mb_xy(DVVideoContext *s, DVwork_chunk *work_chunk, int m, int *mb_x, int *mb_y)
Definition: dvdata.h:113
static av_always_inline int dv_guess_dct_mode(DVVideoContext *s, uint8_t *data, int linesize)
int ildct_cmp
interlaced DCT comparison function
dv_section_type
Definition: dvdata.h:49
uint8_t run
Definition: svq3.c:136
const uint8_t ff_dv_quant_offset[4]
Definition: dvdata.c:56
#define blk(i)
Definition: sha.c:169
void(* fdct)(int16_t *block)
Definition: dsputil.h:218
void(* get_pixels)(int16_t *block, const uint8_t *pixels, int line_size)
Definition: dsputil.h:129
uint8_t * buf
Definition: dvdata.h:39
set threshold d
#define DV_PROFILE_IS_720p50(p)
Definition: dvdata.h:84
initialize output if(nPeaks >3)%at least 3 peaks in spectrum for trying to find f0 nf0peaks
static const int mb_area_start[5]
static int dv_encode_video_segment(AVCodecContext *avctx, void *arg)
AVCodecContext * avctx
Definition: dvdata.h:38
uint8_t
#define av_cold
Definition: attributes.h:78
static void dv_guess_qnos(EncBlockInfo *blks, int *qnos)
#define av_assert2(cond)
assert() equivalent, that does lie in speed critical code.
Definition: avassert.h:63
window constants for m
void(* idct_put[2])(uint8_t *dest, int line_size, int16_t *block)
Definition: dvdata.h:45
static AVPacket pkt
Definition: demuxing.c:56
#define b
Definition: input.c:42
static av_always_inline int dv_rl2vlc_size(int run, int l)
#define emms_c()
void ff_simple_idct248_put(uint8_t *dest, int line_size, int16_t *block)
Definition: simple_idct.c:88
enum AVPixelFormat pix_fmt
Definition: dv_profile.h:56
static double av_q2d(AVRational a)
Convert rational to double.
Definition: rational.h:69
uint8_t * data
#define NB_DV_VLC
Definition: dv_vlc_data.h:32
void ff_set_cmp(DSPContext *c, me_cmp_func *cmp, int type)
Definition: dsputil.c:1869
static const int dv_weight_88[64]
bitstream reader API header.
uint8_t idct_permutation[64]
idct input permutation.
Definition: dsputil.h:249
me_cmp_func ildct_cmp[6]
Definition: dsputil.h:170
int lowres
low resolution decoding, 1-> 1/2 size, 2->1/4 size
const uint8_t * block_sizes
Definition: dv_profile.h:58
enum AVChromaLocation chroma_sample_location
This defines the location of chroma samples.
#define AV_PKT_FLAG_KEY
The packet contains a keyframe.
#define LOCAL_ALIGNED_8(t, v,...)
frame
Definition: stft.m:14
static int dv_work_pool_size(const DVprofile *d)
Definition: dvdata.h:103
Discrete Time axis x
#define U(x)
int size_in_bits
Definition: put_bits.h:45
#define DV_PROFILE_IS_1080i50(p)
Definition: dvdata.h:83
uint8_t partial_bit_count
static const int vs_total_ac_bits
uint16_t mb_coordinates[5]
Definition: dv_profile.h:34
int height
Definition: dv_profile.h:51
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
#define DV_PROFILE_IS_HD(p)
Definition: dvdata.h:82
Spectrum Plot time data
const char * arg
static const int dv_weight_bits
int flags
CODEC_FLAG_*.
uint32_t partial_bit_buffer
uint8_t * buf
Definition: put_bits.h:44
void av_log(void *avcl, int level, const char *fmt,...)
Definition: log.c:246
const char * name
Name of the codec implementation.
static void put_bits(J2kEncoderContext *s, int val, int n)
put n times val bit
Definition: j2kenc.c:160
int n_difchan
Definition: dv_profile.h:48
external API header
int8_t len
Definition: get_bits.h:71
int size
int flags
A combination of AV_PKT_FLAG values.
Definition: get_bits.h:63
static int put_bits_count(PutBitContext *s)
Definition: put_bits.h:73
planar YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples)
Definition: pixfmt.h:72
int difseg_size
Definition: dv_profile.h:47
const DVprofile * sys
Definition: dvdata.h:36
common internal API header
const DVprofile * avpriv_dv_codec_profile(AVCodecContext *codec)
Definition: dv_profile.c:329
AVFrame picture
Definition: dvdata.h:37
enum AVPictureType pict_type
Picture type of the frame.
Definition: frame.h:144
#define av_assert1(cond)
assert() equivalent, that does not lie in speed critical code.
Definition: avassert.h:53
struct EncBlockInfo EncBlockInfo
int width
Definition: dv_profile.h:52
uint32_t vlc
Definition: dv_tablegen.h:40
#define DV_VLC_MAP_RUN_SIZE
Definition: dv_tablegen.h:34
ret
Definition: avfilter.c:821
int width
picture width / height.
dv_pack_type
Definition: dvdata.h:57
t
Definition: genspecsines3.m:6
uint8_t sign[64]
#define a2
Definition: regdef.h:48
#define FFABS(a)
Definition: common.h:53
#define CODEC_FLAG_INTERLACED_DCT
Use interlaced DCT.
FIXME Range Coding of cr are level
Definition: snow.txt:367
int frame_size
Definition: dv_profile.h:46
static const uint8_t dv_vlc_len[NB_DV_VLC]
Definition: dv_vlc_data.h:94
int ff_alloc_packet2(AVCodecContext *avctx, AVPacket *avpkt, int size)
Check AVPacket size and/or allocate data.
static void dv_vlc_map_tableinit(void)
Definition: dv_tablegen.h:50
static const int dv_weight_248[64]
#define AVERROR_PATCHWELCOME
Not yet implemented in FFmpeg, patches welcome.
Definition: error.h:62
void(* fdct[2])(int16_t *block)
Definition: dvdata.h:44
for k
NULL
Definition: eval.c:55
or the Software in violation of any applicable export control laws in any jurisdiction Except as provided by mandatorily applicable UPF has no obligation to provide you with source code to the Software In the event Software contains any source code
static const int remap[16]
Definition: msvideo1enc.c:64
static const uint8_t zigzag_scan[16+1]
Definition: h264data.h:55
int linesize[AV_NUM_DATA_POINTERS]
For video, size in bytes of each picture line.
Definition: frame.h:101
static const uint8_t dv100_qstep[16]
main external API structure.
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:148
#define DV_VLC_MAP_LEV_SIZE
Definition: dv_tablegen.h:35
const int ff_dv_iweight_1080_y[64]
The "inverse" DV100 weights are actually just the spec weights (zig-zagged).
Definition: dvdata.c:82
#define init_vlc(vlc, nb_bits, nb_codes,bits, bits_wrap, bits_size,codes, codes_wrap, codes_size,flags)
Definition: get_bits.h:426
uint8_t * buf_end
Definition: put_bits.h:44
int16_t mb[64]
const int ff_dv_iweight_248[64]
Definition: dvdata.c:68
void * buf
Definition: avisynth_c.h:594
uint8_t dv_zigzag[2][64]
Definition: dvdata.h:41
void(* get_pixels)(int16_t *block, const uint8_t *pixels, int line_size)
Definition: dvdata.h:43
static int put_bits_left(PutBitContext *s)
static const uint8_t dv_vlc_level[NB_DV_VLC]
Definition: dv_vlc_data.h:204
void avcodec_get_frame_defaults(AVFrame *frame)
Set the fields of the given AVFrame to default values.
#define TEX_VLC_BITS
Definition: dvdata.h:96
synthesis window for stochastic i
av_cold int ff_dvvideo_init(AVCodecContext *avctx)
#define DV_MAX_BPM
maximum number of blocks per macroblock in any DV format
Definition: dvdata.h:94
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFilterBuffer structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later.That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another.Buffer references ownership and permissions
uint32_t size
Definition: dv_tablegen.h:41
static int weight(int i, int blen, int offset)
static const uint8_t dv_quant_areas[4]
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
Definition: frame.h:87
uint8_t run
Definition: get_bits.h:72
uint32_t * idct_factor
Definition: dv_profile.h:55
const int ff_dv_iweight_88[64]
Definition: dvdata.c:58
const int ff_dv_iweight_1080_c[64]
Definition: dvdata.c:92
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
Definition: pixfmt.h:68
const uint8_t ff_dv_quant_shifts[22][4]
Definition: dvdata.c:31
#define CODEC_CAP_SLICE_THREADS
Codec supports slice-based (or partition-based) multithreading.
common internal api header.
const uint8_t ff_zigzag_direct[64]
Definition: mathtables.c:115
static void flush_put_bits(PutBitContext *s)
Pad the end of the output stream with zeros.
Definition: put_bits.h:81
static double c[64]
function fs
static av_always_inline int dv_init_enc_block(EncBlockInfo *bi, uint8_t *data, int linesize, DVVideoContext *s, int bias)
planar YUV 4:1:1, 12bpp, (1 Cr & Cb sample per 4x1 Y samples)
Definition: pixfmt.h:75
static void init_put_bits(PutBitContext *s, uint8_t *buffer, int buffer_size)
Initialize the PutBitContext s.
Definition: put_bits.h:54
function y
Definition: D.m:1
uint16_t buf_offset
Definition: dv_profile.h:33
static av_cold int dvvideo_init_encoder(AVCodecContext *avctx)
void(* idct_put)(uint8_t *dest, int line_size, int16_t *block)
block -> idct -> clip to unsigned 8 bit -> dest.
Definition: dsputil.h:229
int top_field_first
If the content is interlaced, is top field displayed first.
Definition: frame.h:275
simple idct header.
static void dv_calc_mb_coordinates(const DVprofile *d, int chan, int seq, int slot, uint16_t *tbl)
Definition: libavcodec/dv.c:54
int len
Constants for DV codec.
VLC_TYPE(* table)[2]
code, bits
Definition: get_bits.h:65
The official guide to swscale for confused that is
Definition: swscale.txt:2
static const uint16_t dv_vlc_bits[NB_DV_VLC]
Definition: dv_vlc_data.h:39
int key_frame
1 -> keyframe, 0-> not
Definition: frame.h:139
int16_t level
Definition: get_bits.h:70
const int ff_dv_iweight_720_c[64]
Definition: dvdata.c:112
int video_stype
Definition: dv_profile.h:45
#define LOCAL_ALIGNED_16(t, v,...)
#define av_always_inline
Definition: attributes.h:41
const char * av_get_pix_fmt_name(enum AVPixelFormat pix_fmt)
Return the short name for a pixel format, NULL in case pix_fmt is unknown.
Definition: pixdesc.c:1700
static struct dv_vlc_pair dv_vlc_map[DV_VLC_MAP_RUN_SIZE][DV_VLC_MAP_LEV_SIZE]
Definition: dv_tablegen.h:48
DVwork_chunk * work_chunks
Definition: dv_profile.h:54
int(* execute)(struct AVCodecContext *c, int(*func)(struct AVCodecContext *c2, void *arg), void *arg2, int *ret, int count, int size)
The codec may call this to execute several independent things.
AVPixelFormat
Pixel format.
Definition: pixfmt.h:66
This structure stores compressed data.
void ff_free_vlc(VLC *vlc)
Definition: bitstream.c:344
uint8_t next[64]
DSPContext.
Definition: dsputil.h:127
static av_always_inline PutBitContext * dv_encode_ac(EncBlockInfo *bi, PutBitContext *pb_pool, PutBitContext *pb_end)
bitstream writer API