3 * Copyright (c) 2003 Roman Shaposhnik
5 * This file is part of Libav.
7 * Libav is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * Libav is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with Libav; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
27 #include "libavutil/attributes.h"
28 #include "libavutil/pixdesc.h"
36 #include "dv_tablegen.h"
38 static av_cold int dvvideo_encode_init(AVCodecContext *avctx)
40 DVVideoContext *s = avctx->priv_data;
45 s->sys = avpriv_dv_codec_profile(avctx);
47 av_log(avctx, AV_LOG_ERROR, "Found no DV profile for %ix%i %s video. "
48 "Valid DV profiles are:\n",
49 avctx->width, avctx->height, av_get_pix_fmt_name(avctx->pix_fmt));
50 ff_dv_print_profiles(avctx, AV_LOG_ERROR);
51 return AVERROR(EINVAL);
53 ret = ff_dv_init_dynamic_tables(s, s->sys);
55 av_log(avctx, AV_LOG_ERROR, "Error initializing work tables.\n");
59 avctx->coded_frame = av_frame_alloc();
60 if (!avctx->coded_frame)
61 return AVERROR(ENOMEM);
63 dv_vlc_map_tableinit();
65 ff_dsputil_init(&dsp, avctx);
66 ff_fdctdsp_init(&fdsp, avctx);
67 ff_set_cmp(&dsp, dsp.ildct_cmp, avctx->ildct_cmp);
69 s->get_pixels = dsp.get_pixels;
70 s->ildct_cmp = dsp.ildct_cmp[5];
72 s->fdct[0] = fdsp.fdct;
73 s->fdct[1] = fdsp.fdct248;
75 return ff_dvvideo_init(avctx);
78 /* bit budget for AC only in 5 MBs */
79 static const int vs_total_ac_bits = (100 * 4 + 68*2) * 5;
80 static const int mb_area_start[5] = { 1, 6, 21, 43, 64 };
83 /* Converts run and level (where level != 0) pair into VLC, returning bit size */
84 static av_always_inline int dv_rl2vlc(int run, int level, int sign, uint32_t* vlc)
87 if (run < DV_VLC_MAP_RUN_SIZE && level < DV_VLC_MAP_LEV_SIZE) {
88 *vlc = dv_vlc_map[run][level].vlc | sign;
89 size = dv_vlc_map[run][level].size;
92 if (level < DV_VLC_MAP_LEV_SIZE) {
93 *vlc = dv_vlc_map[0][level].vlc | sign;
94 size = dv_vlc_map[0][level].size;
96 *vlc = 0xfe00 | (level << 1) | sign;
100 *vlc |= ((run < 16) ? dv_vlc_map[run-1][0].vlc :
101 (0x1f80 | (run - 1))) << size;
102 size += (run < 16) ? dv_vlc_map[run-1][0].size : 13;
109 static av_always_inline int dv_rl2vlc_size(int run, int level)
113 if (run < DV_VLC_MAP_RUN_SIZE && level < DV_VLC_MAP_LEV_SIZE) {
114 size = dv_vlc_map[run][level].size;
117 size = (level < DV_VLC_MAP_LEV_SIZE) ? dv_vlc_map[0][level].size : 16;
119 size += (run < 16) ? dv_vlc_map[run-1][0].size : 13;
125 static av_always_inline int dv_rl2vlc(int run, int l, int sign, uint32_t* vlc)
127 *vlc = dv_vlc_map[run][l].vlc | sign;
128 return dv_vlc_map[run][l].size;
131 static av_always_inline int dv_rl2vlc_size(int run, int l)
133 return dv_vlc_map[run][l].size;
137 typedef struct EncBlockInfo {
147 uint8_t partial_bit_count;
148 uint32_t partial_bit_buffer; /* we can't use uint16_t here */
151 static av_always_inline PutBitContext* dv_encode_ac(EncBlockInfo* bi,
152 PutBitContext* pb_pool,
153 PutBitContext* pb_end)
156 PutBitContext* pb = pb_pool;
157 int size = bi->partial_bit_count;
158 uint32_t vlc = bi->partial_bit_buffer;
160 bi->partial_bit_count = bi->partial_bit_buffer = 0;
162 /* Find suitable storage space */
163 for (; size > (bits_left = put_bits_left(pb)); pb++) {
166 put_bits(pb, bits_left, vlc >> size);
167 vlc = vlc & ((1 << size) - 1);
169 if (pb + 1 >= pb_end) {
170 bi->partial_bit_count = size;
171 bi->partial_bit_buffer = vlc;
177 put_bits(pb, size, vlc);
179 if (bi->cur_ac >= 64)
182 /* Construct the next VLC */
184 bi->cur_ac = bi->next[prev];
185 if (bi->cur_ac < 64){
186 size = dv_rl2vlc(bi->cur_ac - prev - 1, bi->mb[bi->cur_ac], bi->sign[bi->cur_ac], &vlc);
188 size = 4; vlc = 6; /* End Of Block stamp */
194 static av_always_inline int dv_guess_dct_mode(DVVideoContext *s, uint8_t *data, int linesize) {
195 if (s->avctx->flags & CODEC_FLAG_INTERLACED_DCT) {
196 int ps = s->ildct_cmp(NULL, data, NULL, linesize, 8) - 400;
198 int is = s->ildct_cmp(NULL, data , NULL, linesize<<1, 4) +
199 s->ildct_cmp(NULL, data + linesize, NULL, linesize<<1, 4);
207 static const int dv_weight_bits = 18;
208 static const int dv_weight_88[64] = {
209 131072, 257107, 257107, 242189, 252167, 242189, 235923, 237536,
210 237536, 235923, 229376, 231390, 223754, 231390, 229376, 222935,
211 224969, 217965, 217965, 224969, 222935, 200636, 218652, 211916,
212 212325, 211916, 218652, 200636, 188995, 196781, 205965, 206433,
213 206433, 205965, 196781, 188995, 185364, 185364, 200636, 200704,
214 200636, 185364, 185364, 174609, 180568, 195068, 195068, 180568,
215 174609, 170091, 175557, 189591, 175557, 170091, 165371, 170627,
216 170627, 165371, 160727, 153560, 160727, 144651, 144651, 136258,
218 static const int dv_weight_248[64] = {
219 131072, 242189, 257107, 237536, 229376, 200636, 242189, 223754,
220 224969, 196781, 262144, 242189, 229376, 200636, 257107, 237536,
221 211916, 185364, 235923, 217965, 229376, 211916, 206433, 180568,
222 242189, 223754, 224969, 196781, 211916, 185364, 235923, 217965,
223 200704, 175557, 222935, 205965, 200636, 185364, 195068, 170627,
224 229376, 211916, 206433, 180568, 200704, 175557, 222935, 205965,
225 175557, 153560, 188995, 174609, 165371, 144651, 200636, 185364,
226 195068, 170627, 175557, 153560, 188995, 174609, 165371, 144651,
229 static av_always_inline int dv_init_enc_block(EncBlockInfo* bi, uint8_t *data, int linesize, DVVideoContext *s, int bias)
232 const uint8_t* zigzag_scan;
233 LOCAL_ALIGNED_16(int16_t, blk, [64]);
235 /* We offer two different methods for class number assignment: the
236 method suggested in SMPTE 314M Table 22, and an improved
237 method. The SMPTE method is very conservative; it assigns class
238 3 (i.e. severe quantization) to any block where the largest AC
239 component is greater than 36. Libav's DV encoder tracks AC bit
240 consumption precisely, so there is no need to bias most blocks
241 towards strongly lossy compression. Instead, we assign class 2
242 to most blocks, and use class 3 only when strictly necessary
243 (for blocks whose largest AC component exceeds 255). */
245 #if 0 /* SMPTE spec method */
246 static const int classes[] = {12, 24, 36, 0xffff};
247 #else /* improved Libav method */
248 static const int classes[] = {-1, -1, 255, 0xffff};
250 int max = classes[0];
253 assert((((int)blk) & 15) == 0);
255 bi->area_q[0] = bi->area_q[1] = bi->area_q[2] = bi->area_q[3] = 0;
256 bi->partial_bit_count = 0;
257 bi->partial_bit_buffer = 0;
260 bi->dct_mode = dv_guess_dct_mode(s, data, linesize);
261 s->get_pixels(blk, data, linesize);
262 s->fdct[bi->dct_mode](blk);
264 /* We rely on the fact that encoding all zeros leads to an immediate EOB,
265 which is precisely what the spec calls for in the "dummy" blocks. */
266 memset(blk, 0, 64*sizeof(*blk));
271 zigzag_scan = bi->dct_mode ? ff_dv_zigzag248_direct : ff_zigzag_direct;
272 weight = bi->dct_mode ? dv_weight_248 : dv_weight_88;
274 for (area = 0; area < 4; area++) {
275 bi->prev[area] = prev;
276 bi->bit_size[area] = 1; // 4 areas 4 bits for EOB :)
277 for (i = mb_area_start[area]; i < mb_area_start[area+1]; i++) {
278 int level = blk[zigzag_scan[i]];
280 if (level + 15 > 30U) {
281 bi->sign[i] = (level >> 31) & 1;
282 /* weight it and and shift down into range, adding for rounding */
283 /* the extra division by a factor of 2^4 reverses the 8x expansion of the DCT
284 AND the 2x doubling of the weights */
285 level = (FFABS(level) * weight[i] + (1 << (dv_weight_bits+3))) >> (dv_weight_bits+4);
289 bi->bit_size[area] += dv_rl2vlc_size(i - prev - 1, level);
296 for (bi->cno = 0; max > classes[bi->cno]; bi->cno++);
304 for (area = 0; area < 4; area++) {
305 bi->prev[area] = prev;
306 bi->bit_size[area] = 1; // 4 areas 4 bits for EOB :)
307 for (; i < mb_area_start[area+1]; i = bi->next[i]) {
311 bi->bit_size[area] += dv_rl2vlc_size(i - prev - 1, bi->mb[i]);
320 return bi->bit_size[0] + bi->bit_size[1] + bi->bit_size[2] + bi->bit_size[3];
323 static inline void dv_guess_qnos(EncBlockInfo* blks, int* qnos)
326 int i, j, k, a, prev, a2;
329 size[0] = size[1] = size[2] = size[3] = size[4] = 1 << 24;
332 for (i = 0; i < 5; i++) {
338 for (j = 0; j < 6; j++, b++) {
339 for (a = 0; a < 4; a++) {
340 if (b->area_q[a] != ff_dv_quant_shifts[qnos[i] + ff_dv_quant_offset[b->cno]][a]) {
341 b->bit_size[a] = 1; // 4 areas 4 bits for EOB :)
344 assert(b->next[prev] >= mb_area_start[a+1] || b->mb[prev]);
345 for (k = b->next[prev] ; k < mb_area_start[a+1]; k = b->next[k]) {
348 b->bit_size[a] += dv_rl2vlc_size(k - prev - 1, b->mb[k]);
351 if (b->next[k] >= mb_area_start[a+1] && b->next[k]<64){
352 for (a2 = a + 1; b->next[k] >= mb_area_start[a2+1]; a2++)
355 assert(b->mb[b->next[k]]);
356 b->bit_size[a2] += dv_rl2vlc_size(b->next[k] - prev - 1, b->mb[b->next[k]])
357 -dv_rl2vlc_size(b->next[k] - k - 1, b->mb[b->next[k]]);
358 assert(b->prev[a2] == k && (a2 + 1 >= 4 || b->prev[a2+1] != k));
361 b->next[prev] = b->next[k];
366 size[i] += b->bit_size[a];
369 if (vs_total_ac_bits >= size[0] + size[1] + size[2] + size[3] + size[4])
372 } while (qnos[0]|qnos[1]|qnos[2]|qnos[3]|qnos[4]);
375 for (a = 2; a == 2 || vs_total_ac_bits < size[0]; a += a){
377 size[0] = 5 * 6 * 4; //EOB
378 for (j = 0; j < 6 *5; j++, b++) {
380 for (k = b->next[prev]; k < 64; k = b->next[k]) {
381 if (b->mb[k] < a && b->mb[k] > -a){
382 b->next[prev] = b->next[k];
384 size[0] += dv_rl2vlc_size(k - prev - 1, b->mb[k]);
392 static int dv_encode_video_segment(AVCodecContext *avctx, void *arg)
394 DVVideoContext *s = avctx->priv_data;
395 DVwork_chunk *work_chunk = arg;
397 int mb_x, mb_y, c_offset, linesize, y_stride;
400 LOCAL_ALIGNED_8(uint8_t, scratch, [128]);
401 EncBlockInfo enc_blks[5*DV_MAX_BPM];
402 PutBitContext pbs[5*DV_MAX_BPM];
404 EncBlockInfo* enc_blk;
406 int qnos[5] = {15, 15, 15, 15, 15}; /* No quantization */
407 int* qnosp = &qnos[0];
409 dif = &s->buf[work_chunk->buf_offset*80];
410 enc_blk = &enc_blks[0];
411 for (mb_index = 0; mb_index < 5; mb_index++) {
412 dv_calculate_mb_xy(s, work_chunk, mb_index, &mb_x, &mb_y);
414 /* initializing luminance blocks */
415 if ((s->sys->pix_fmt == AV_PIX_FMT_YUV420P) ||
416 (s->sys->pix_fmt == AV_PIX_FMT_YUV411P && mb_x >= (704 / 8)) ||
417 (s->sys->height >= 720 && mb_y != 134)) {
418 y_stride = s->frame->linesize[0] << 3;
422 y_ptr = s->frame->data[0] + ((mb_y * s->frame->linesize[0] + mb_x) << 3);
423 linesize = s->frame->linesize[0];
425 if (s->sys->video_stype == 4) { /* SD 422 */
427 dv_init_enc_block(enc_blk+0, y_ptr , linesize, s, 0) +
428 dv_init_enc_block(enc_blk+1, NULL , linesize, s, 0) +
429 dv_init_enc_block(enc_blk+2, y_ptr + 8 , linesize, s, 0) +
430 dv_init_enc_block(enc_blk+3, NULL , linesize, s, 0);
433 dv_init_enc_block(enc_blk+0, y_ptr , linesize, s, 0) +
434 dv_init_enc_block(enc_blk+1, y_ptr + 8 , linesize, s, 0) +
435 dv_init_enc_block(enc_blk+2, y_ptr + y_stride, linesize, s, 0) +
436 dv_init_enc_block(enc_blk+3, y_ptr + 8 + y_stride, linesize, s, 0);
440 /* initializing chrominance blocks */
441 c_offset = (((mb_y >> (s->sys->pix_fmt == AV_PIX_FMT_YUV420P)) * s->frame->linesize[1] +
442 (mb_x >> ((s->sys->pix_fmt == AV_PIX_FMT_YUV411P) ? 2 : 1))) << 3);
443 for (j = 2; j; j--) {
444 uint8_t *c_ptr = s->frame->data[j] + c_offset;
445 linesize = s->frame->linesize[j];
446 y_stride = (mb_y == 134) ? 8 : (s->frame->linesize[j] << 3);
447 if (s->sys->pix_fmt == AV_PIX_FMT_YUV411P && mb_x >= (704 / 8)) {
449 uint8_t* b = scratch;
450 for (i = 0; i < 8; i++) {
451 d = c_ptr + (linesize << 3);
452 b[0] = c_ptr[0]; b[1] = c_ptr[1]; b[2] = c_ptr[2]; b[3] = c_ptr[3];
453 b[4] = d[0]; b[5] = d[1]; b[6] = d[2]; b[7] = d[3];
461 vs_bit_size += dv_init_enc_block( enc_blk++, c_ptr , linesize, s, 1);
462 if (s->sys->bpm == 8) {
463 vs_bit_size += dv_init_enc_block(enc_blk++, c_ptr + y_stride, linesize, s, 1);
468 if (vs_total_ac_bits < vs_bit_size)
469 dv_guess_qnos(&enc_blks[0], qnosp);
471 /* DIF encoding process */
472 for (j=0; j<5*s->sys->bpm;) {
478 /* First pass over individual cells only */
479 for (i=0; i<s->sys->bpm; i++, j++) {
480 int sz = s->sys->block_sizes[i]>>3;
482 init_put_bits(&pbs[j], dif, sz);
483 put_sbits(&pbs[j], 9, ((enc_blks[j].mb[0] >> 3) - 1024 + 2) >> 2);
484 put_bits(&pbs[j], 1, enc_blks[j].dct_mode);
485 put_bits(&pbs[j], 2, enc_blks[j].cno);
487 dv_encode_ac(&enc_blks[j], &pbs[j], &pbs[j+1]);
491 /* Second pass over each MB space */
493 for (i=0; i<s->sys->bpm; i++) {
494 if (enc_blks[start_mb+i].partial_bit_count)
495 pb = dv_encode_ac(&enc_blks[start_mb+i], pb, &pbs[start_mb+s->sys->bpm]);
499 /* Third and final pass over the whole video segment space */
501 for (j=0; j<5*s->sys->bpm; j++) {
502 if (enc_blks[j].partial_bit_count)
503 pb = dv_encode_ac(&enc_blks[j], pb, &pbs[s->sys->bpm*5]);
504 if (enc_blks[j].partial_bit_count)
505 av_log(avctx, AV_LOG_ERROR, "ac bitstream overflow\n");
508 for (j=0; j<5*s->sys->bpm; j++) {
510 int size = pbs[j].size_in_bits >> 3;
511 flush_put_bits(&pbs[j]);
512 pos = put_bits_count(&pbs[j]) >> 3;
514 av_log(avctx, AV_LOG_ERROR, "bitstream written beyond buffer size\n");
517 memset(pbs[j].buf + pos, 0xff, size - pos);
523 static inline int dv_write_pack(enum dv_pack_type pack_id, DVVideoContext *c,
527 * Here's what SMPTE314M says about these two:
528 * (page 6) APTn, AP1n, AP2n, AP3n: These data shall be identical
529 * as track application IDs (APTn = 001, AP1n =
530 * 001, AP2n = 001, AP3n = 001), if the source signal
531 * comes from a digital VCR. If the signal source is
532 * unknown, all bits for these data shall be set to 1.
533 * (page 12) STYPE: STYPE defines a signal type of video signal
534 * 00000b = 4:1:1 compression
535 * 00100b = 4:2:2 compression
537 * Now, I've got two problems with these statements:
538 * 1. it looks like APT == 111b should be a safe bet, but it isn't.
539 * It seems that for PAL as defined in IEC 61834 we have to set
540 * APT to 000 and for SMPTE314M to 001.
541 * 2. It is not at all clear what STYPE is used for 4:2:0 PAL
542 * compression scheme (if any).
544 int apt = (c->sys->pix_fmt == AV_PIX_FMT_YUV420P ? 0 : 1);
547 if ((int)(av_q2d(c->avctx->sample_aspect_ratio) * c->avctx->width / c->avctx->height * 10) >= 17) /* 16:9 */
550 buf[0] = (uint8_t)pack_id;
552 case dv_header525: /* I can't imagine why these two weren't defined as real */
553 case dv_header625: /* packs in SMPTE314M -- they definitely look like ones */
554 buf[1] = 0xf8 | /* reserved -- always 1 */
555 (apt & 0x07); /* APT: Track application ID */
556 buf[2] = (0 << 7) | /* TF1: audio data is 0 - valid; 1 - invalid */
557 (0x0f << 3) | /* reserved -- always 1 */
558 (apt & 0x07); /* AP1: Audio application ID */
559 buf[3] = (0 << 7) | /* TF2: video data is 0 - valid; 1 - invalid */
560 (0x0f << 3) | /* reserved -- always 1 */
561 (apt & 0x07); /* AP2: Video application ID */
562 buf[4] = (0 << 7) | /* TF3: subcode(SSYB) is 0 - valid; 1 - invalid */
563 (0x0f << 3) | /* reserved -- always 1 */
564 (apt & 0x07); /* AP3: Subcode application ID */
566 case dv_video_source:
567 buf[1] = 0xff; /* reserved -- always 1 */
568 buf[2] = (1 << 7) | /* B/W: 0 - b/w, 1 - color */
569 (1 << 6) | /* following CLF is valid - 0, invalid - 1 */
570 (3 << 4) | /* CLF: color frames ID (see ITU-R BT.470-4) */
571 0xf; /* reserved -- always 1 */
572 buf[3] = (3 << 6) | /* reserved -- always 1 */
573 (c->sys->dsf << 5) | /* system: 60fields/50fields */
574 c->sys->video_stype; /* signal type video compression */
575 buf[4] = 0xff; /* VISC: 0xff -- no information */
577 case dv_video_control:
578 buf[1] = (0 << 6) | /* Copy generation management (CGMS) 0 -- free */
579 0x3f; /* reserved -- always 1 */
580 buf[2] = 0xc8 | /* reserved -- always b11001xxx */
582 buf[3] = (1 << 7) | /* frame/field flag 1 -- frame, 0 -- field */
583 (1 << 6) | /* first/second field flag 0 -- field 2, 1 -- field 1 */
584 (1 << 5) | /* frame change flag 0 -- same picture as before, 1 -- different */
585 (1 << 4) | /* 1 - interlaced, 0 - noninterlaced */
586 0xc; /* reserved -- always b1100 */
587 buf[4] = 0xff; /* reserved -- always 1 */
590 buf[1] = buf[2] = buf[3] = buf[4] = 0xff;
595 static inline int dv_write_dif_id(enum dv_section_type t, uint8_t chan_num,
596 uint8_t seq_num, uint8_t dif_num,
599 buf[0] = (uint8_t)t; /* Section type */
600 buf[1] = (seq_num << 4) | /* DIF seq number 0-9 for 525/60; 0-11 for 625/50 */
601 (chan_num << 3) | /* FSC: for 50Mb/s 0 - first channel; 1 - second */
602 7; /* reserved -- always 1 */
603 buf[2] = dif_num; /* DIF block number Video: 0-134, Audio: 0-8 */
608 static inline int dv_write_ssyb_id(uint8_t syb_num, uint8_t fr, uint8_t* buf)
610 if (syb_num == 0 || syb_num == 6) {
611 buf[0] = (fr << 7) | /* FR ID 1 - first half of each channel; 0 - second */
612 (0 << 4) | /* AP3 (Subcode application ID) */
613 0x0f; /* reserved -- always 1 */
615 else if (syb_num == 11) {
616 buf[0] = (fr << 7) | /* FR ID 1 - first half of each channel; 0 - second */
617 0x7f; /* reserved -- always 1 */
620 buf[0] = (fr << 7) | /* FR ID 1 - first half of each channel; 0 - second */
621 (0 << 4) | /* APT (Track application ID) */
622 0x0f; /* reserved -- always 1 */
624 buf[1] = 0xf0 | /* reserved -- always 1 */
625 (syb_num & 0x0f); /* SSYB number 0 - 11 */
626 buf[2] = 0xff; /* reserved -- always 1 */
630 static void dv_format_frame(DVVideoContext* c, uint8_t* buf)
634 for (chan = 0; chan < c->sys->n_difchan; chan++) {
635 for (i = 0; i < c->sys->difseg_size; i++) {
636 memset(buf, 0xff, 80 * 6); /* first 6 DIF blocks are for control data */
638 /* DV header: 1DIF */
639 buf += dv_write_dif_id(dv_sect_header, chan, i, 0, buf);
640 buf += dv_write_pack((c->sys->dsf ? dv_header625 : dv_header525), c, buf);
641 buf += 72; /* unused bytes */
643 /* DV subcode: 2DIFs */
644 for (j = 0; j < 2; j++) {
645 buf += dv_write_dif_id(dv_sect_subcode, chan, i, j, buf);
646 for (k = 0; k < 6; k++)
647 buf += dv_write_ssyb_id(k, (i < c->sys->difseg_size/2), buf) + 5;
648 buf += 29; /* unused bytes */
652 for (j = 0; j < 3; j++) {
653 buf += dv_write_dif_id(dv_sect_vaux, chan, i, j, buf);
654 buf += dv_write_pack(dv_video_source, c, buf);
655 buf += dv_write_pack(dv_video_control, c, buf);
657 buf += dv_write_pack(dv_video_source, c, buf);
658 buf += dv_write_pack(dv_video_control, c, buf);
659 buf += 4*5 + 2; /* unused bytes */
662 /* DV Audio/Video: 135 Video DIFs + 9 Audio DIFs */
663 for (j = 0; j < 135; j++) {
665 memset(buf, 0xff, 80);
666 buf += dv_write_dif_id(dv_sect_audio, chan, i, j/15, buf);
667 buf += 77; /* audio control & shuffled PCM audio */
669 buf += dv_write_dif_id(dv_sect_video, chan, i, j, buf);
670 buf += 77; /* 1 video macroblock: 1 bytes control
671 4 * 14 bytes Y 8x8 data
673 10 bytes Cb 8x8 data */
680 static int dvvideo_encode_frame(AVCodecContext *c, AVPacket *pkt,
681 const AVFrame *frame, int *got_packet)
683 DVVideoContext *s = c->priv_data;
686 if ((ret = ff_alloc_packet(pkt, s->sys->frame_size)) < 0) {
687 av_log(c, AV_LOG_ERROR, "Error getting output packet.\n");
691 c->pix_fmt = s->sys->pix_fmt;
693 c->coded_frame->key_frame = 1;
694 c->coded_frame->pict_type = AV_PICTURE_TYPE_I;
697 c->execute(c, dv_encode_video_segment, s->work_chunks, NULL,
698 dv_work_pool_size(s->sys), sizeof(DVwork_chunk));
702 dv_format_frame(s, pkt->data);
704 pkt->flags |= AV_PKT_FLAG_KEY;
710 static int dvvideo_encode_close(AVCodecContext *avctx)
712 av_frame_free(&avctx->coded_frame);
716 AVCodec ff_dvvideo_encoder = {
718 .long_name = NULL_IF_CONFIG_SMALL("DV (Digital Video)"),
719 .type = AVMEDIA_TYPE_VIDEO,
720 .id = AV_CODEC_ID_DVVIDEO,
721 .priv_data_size = sizeof(DVVideoContext),
722 .init = dvvideo_encode_init,
723 .encode2 = dvvideo_encode_frame,
724 .close = dvvideo_encode_close,
725 .capabilities = CODEC_CAP_SLICE_THREADS,
726 .pix_fmts = (const enum AVPixelFormat[]) {
727 AV_PIX_FMT_YUV411P, AV_PIX_FMT_YUV422P, AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE