Imported Debian version 2.5.0~trusty1.1
[deb_ffmpeg.git] / ffmpeg / libavcodec / dvenc.c
CommitLineData
2ba45a60
DM
1/*
2 * DV encoder
3 * Copyright (c) 2003 Roman Shaposhnik
4 *
5 * This file is part of FFmpeg.
6 *
7 * FFmpeg 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.
11 *
12 * FFmpeg 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.
16 *
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with FFmpeg; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20 */
21
22/**
23 * @file
24 * DV encoder
25 */
26
27#include "config.h"
28
29#include "libavutil/attributes.h"
30#include "libavutil/pixdesc.h"
31
32#include "avcodec.h"
33#include "dv.h"
34#include "dv_profile_internal.h"
35#include "dv_tablegen.h"
36#include "fdctdsp.h"
37#include "internal.h"
38#include "me_cmp.h"
39#include "pixblockdsp.h"
40#include "put_bits.h"
41
42static av_cold int dvvideo_encode_init(AVCodecContext *avctx)
43{
44 DVVideoContext *s = avctx->priv_data;
45 FDCTDSPContext fdsp;
46 MECmpContext mecc;
47 PixblockDSPContext pdsp;
48 int ret;
49
50 s->sys = av_dv_codec_profile(avctx->width, avctx->height, avctx->pix_fmt);
51 if (!s->sys) {
52 av_log(avctx, AV_LOG_ERROR, "Found no DV profile for %ix%i %s video. "
53 "Valid DV profiles are:\n",
54 avctx->width, avctx->height, av_get_pix_fmt_name(avctx->pix_fmt));
55 ff_dv_print_profiles(avctx, AV_LOG_ERROR);
56 return AVERROR(EINVAL);
57 }
58 if (avctx->height > 576) {
59 av_log(avctx, AV_LOG_ERROR, "DVCPRO HD encoding is not supported.\n");
60 return AVERROR_PATCHWELCOME;
61 }
62 ret = ff_dv_init_dynamic_tables(s, s->sys);
63 if (ret < 0) {
64 av_log(avctx, AV_LOG_ERROR, "Error initializing work tables.\n");
65 return ret;
66 }
67
68 avctx->coded_frame = av_frame_alloc();
69 if (!avctx->coded_frame)
70 return AVERROR(ENOMEM);
71
72 dv_vlc_map_tableinit();
73
74 memset(&fdsp,0, sizeof(fdsp));
75 memset(&mecc,0, sizeof(mecc));
76 memset(&pdsp,0, sizeof(pdsp));
77 ff_fdctdsp_init(&fdsp, avctx);
78 ff_me_cmp_init(&mecc, avctx);
79 ff_pixblockdsp_init(&pdsp, avctx);
80 ff_set_cmp(&mecc, mecc.ildct_cmp, avctx->ildct_cmp);
81
82 s->get_pixels = pdsp.get_pixels;
83 s->ildct_cmp = mecc.ildct_cmp[5];
84
85 s->fdct[0] = fdsp.fdct;
86 s->fdct[1] = fdsp.fdct248;
87
88 return ff_dvvideo_init(avctx);
89}
90
91/* bit budget for AC only in 5 MBs */
92static const int vs_total_ac_bits = (100 * 4 + 68 * 2) * 5;
93static const int mb_area_start[5] = { 1, 6, 21, 43, 64 };
94
95#if CONFIG_SMALL
96/* Convert run and level (where level != 0) pair into VLC, returning bit size */
97static av_always_inline int dv_rl2vlc(int run, int level, int sign,
98 uint32_t *vlc)
99{
100 int size;
101 if (run < DV_VLC_MAP_RUN_SIZE && level < DV_VLC_MAP_LEV_SIZE) {
102 *vlc = dv_vlc_map[run][level].vlc | sign;
103 size = dv_vlc_map[run][level].size;
104 } else {
105 if (level < DV_VLC_MAP_LEV_SIZE) {
106 *vlc = dv_vlc_map[0][level].vlc | sign;
107 size = dv_vlc_map[0][level].size;
108 } else {
109 *vlc = 0xfe00 | (level << 1) | sign;
110 size = 16;
111 }
112 if (run) {
113 *vlc |= ((run < 16) ? dv_vlc_map[run - 1][0].vlc :
114 (0x1f80 | (run - 1))) << size;
115 size += (run < 16) ? dv_vlc_map[run - 1][0].size : 13;
116 }
117 }
118
119 return size;
120}
121
122static av_always_inline int dv_rl2vlc_size(int run, int level)
123{
124 int size;
125
126 if (run < DV_VLC_MAP_RUN_SIZE && level < DV_VLC_MAP_LEV_SIZE) {
127 size = dv_vlc_map[run][level].size;
128 } else {
129 size = (level < DV_VLC_MAP_LEV_SIZE) ? dv_vlc_map[0][level].size : 16;
130 if (run)
131 size += (run < 16) ? dv_vlc_map[run - 1][0].size : 13;
132 }
133 return size;
134}
135#else
136static av_always_inline int dv_rl2vlc(int run, int l, int sign, uint32_t *vlc)
137{
138 *vlc = dv_vlc_map[run][l].vlc | sign;
139 return dv_vlc_map[run][l].size;
140}
141
142static av_always_inline int dv_rl2vlc_size(int run, int l)
143{
144 return dv_vlc_map[run][l].size;
145}
146#endif
147
148typedef struct EncBlockInfo {
149 int area_q[4];
150 int bit_size[4];
151 int prev[5];
152 int cur_ac;
153 int cno;
154 int dct_mode;
155 int16_t mb[64];
156 uint8_t next[64];
157 uint8_t sign[64];
158 uint8_t partial_bit_count;
159 uint32_t partial_bit_buffer; /* we can't use uint16_t here */
160} EncBlockInfo;
161
162static av_always_inline PutBitContext *dv_encode_ac(EncBlockInfo *bi,
163 PutBitContext *pb_pool,
164 PutBitContext *pb_end)
165{
166 int prev, bits_left;
167 PutBitContext *pb = pb_pool;
168 int size = bi->partial_bit_count;
169 uint32_t vlc = bi->partial_bit_buffer;
170
171 bi->partial_bit_count =
172 bi->partial_bit_buffer = 0;
173 for (;;) {
174 /* Find suitable storage space */
175 for (; size > (bits_left = put_bits_left(pb)); pb++) {
176 if (bits_left) {
177 size -= bits_left;
178 put_bits(pb, bits_left, vlc >> size);
179 vlc = vlc & ((1 << size) - 1);
180 }
181 if (pb + 1 >= pb_end) {
182 bi->partial_bit_count = size;
183 bi->partial_bit_buffer = vlc;
184 return pb;
185 }
186 }
187
188 /* Store VLC */
189 put_bits(pb, size, vlc);
190
191 if (bi->cur_ac >= 64)
192 break;
193
194 /* Construct the next VLC */
195 prev = bi->cur_ac;
196 bi->cur_ac = bi->next[prev];
197 if (bi->cur_ac < 64) {
198 size = dv_rl2vlc(bi->cur_ac - prev - 1, bi->mb[bi->cur_ac],
199 bi->sign[bi->cur_ac], &vlc);
200 } else {
201 size = 4;
202 vlc = 6; /* End Of Block stamp */
203 }
204 }
205 return pb;
206}
207
208static av_always_inline int dv_guess_dct_mode(DVVideoContext *s, uint8_t *data,
209 int linesize)
210{
211 if (s->avctx->flags & CODEC_FLAG_INTERLACED_DCT) {
212 int ps = s->ildct_cmp(NULL, data, NULL, linesize, 8) - 400;
213 if (ps > 0) {
214 int is = s->ildct_cmp(NULL, data, NULL, linesize << 1, 4) +
215 s->ildct_cmp(NULL, data + linesize, NULL, linesize << 1, 4);
216 return ps > is;
217 }
218 }
219
220 return 0;
221}
222
223static const int dv_weight_bits = 18;
224static const int dv_weight_88[64] = {
225 131072, 257107, 257107, 242189, 252167, 242189, 235923, 237536,
226 237536, 235923, 229376, 231390, 223754, 231390, 229376, 222935,
227 224969, 217965, 217965, 224969, 222935, 200636, 218652, 211916,
228 212325, 211916, 218652, 200636, 188995, 196781, 205965, 206433,
229 206433, 205965, 196781, 188995, 185364, 185364, 200636, 200704,
230 200636, 185364, 185364, 174609, 180568, 195068, 195068, 180568,
231 174609, 170091, 175557, 189591, 175557, 170091, 165371, 170627,
232 170627, 165371, 160727, 153560, 160727, 144651, 144651, 136258,
233};
234static const int dv_weight_248[64] = {
235 131072, 242189, 257107, 237536, 229376, 200636, 242189, 223754,
236 224969, 196781, 262144, 242189, 229376, 200636, 257107, 237536,
237 211916, 185364, 235923, 217965, 229376, 211916, 206433, 180568,
238 242189, 223754, 224969, 196781, 211916, 185364, 235923, 217965,
239 200704, 175557, 222935, 205965, 200636, 185364, 195068, 170627,
240 229376, 211916, 206433, 180568, 200704, 175557, 222935, 205965,
241 175557, 153560, 188995, 174609, 165371, 144651, 200636, 185364,
242 195068, 170627, 175557, 153560, 188995, 174609, 165371, 144651,
243};
244
245static av_always_inline int dv_init_enc_block(EncBlockInfo *bi, uint8_t *data,
246 int linesize, DVVideoContext *s,
247 int bias)
248{
249 const int *weight;
250 const uint8_t *zigzag_scan;
251 LOCAL_ALIGNED_16(int16_t, blk, [64]);
252 int i, area;
253 /* We offer two different methods for class number assignment: the
254 * method suggested in SMPTE 314M Table 22, and an improved
255 * method. The SMPTE method is very conservative; it assigns class
256 * 3 (i.e. severe quantization) to any block where the largest AC
257 * component is greater than 36. FFmpeg's DV encoder tracks AC bit
258 * consumption precisely, so there is no need to bias most blocks
259 * towards strongly lossy compression. Instead, we assign class 2
260 * to most blocks, and use class 3 only when strictly necessary
261 * (for blocks whose largest AC component exceeds 255). */
262
263#if 0 /* SMPTE spec method */
264 static const int classes[] = { 12, 24, 36, 0xffff };
265#else /* improved FFmpeg method */
266 static const int classes[] = { -1, -1, 255, 0xffff };
267#endif
268 int max = classes[0];
269 int prev = 0;
270
271 av_assert2((((int) blk) & 15) == 0);
272
273 bi->area_q[0] =
274 bi->area_q[1] =
275 bi->area_q[2] =
276 bi->area_q[3] = 0;
277 bi->partial_bit_count = 0;
278 bi->partial_bit_buffer = 0;
279 bi->cur_ac = 0;
280 if (data) {
281 bi->dct_mode = dv_guess_dct_mode(s, data, linesize);
282 s->get_pixels(blk, data, linesize);
283 s->fdct[bi->dct_mode](blk);
284 } else {
285 /* We rely on the fact that encoding all zeros leads to an immediate
286 * EOB, which is precisely what the spec calls for in the "dummy"
287 * blocks. */
288 memset(blk, 0, 64 * sizeof(*blk));
289 bi->dct_mode = 0;
290 }
291 bi->mb[0] = blk[0];
292
293 zigzag_scan = bi->dct_mode ? ff_dv_zigzag248_direct : ff_zigzag_direct;
294 weight = bi->dct_mode ? dv_weight_248 : dv_weight_88;
295
296 for (area = 0; area < 4; area++) {
297 bi->prev[area] = prev;
298 bi->bit_size[area] = 1; // 4 areas 4 bits for EOB :)
299 for (i = mb_area_start[area]; i < mb_area_start[area + 1]; i++) {
300 int level = blk[zigzag_scan[i]];
301
302 if (level + 15 > 30U) {
303 bi->sign[i] = (level >> 31) & 1;
304 /* Weight it and shift down into range, adding for rounding.
305 * The extra division by a factor of 2^4 reverses the 8x
306 * expansion of the DCT AND the 2x doubling of the weights. */
307 level = (FFABS(level) * weight[i] + (1 << (dv_weight_bits + 3))) >>
308 (dv_weight_bits + 4);
309 bi->mb[i] = level;
310 if (level > max)
311 max = level;
312 bi->bit_size[area] += dv_rl2vlc_size(i - prev - 1, level);
313 bi->next[prev] = i;
314 prev = i;
315 }
316 }
317 }
318 bi->next[prev] = i;
319 for (bi->cno = 0; max > classes[bi->cno]; bi->cno++)
320 ;
321
322 bi->cno += bias;
323
324 if (bi->cno >= 3) {
325 bi->cno = 3;
326 prev = 0;
327 i = bi->next[prev];
328 for (area = 0; area < 4; area++) {
329 bi->prev[area] = prev;
330 bi->bit_size[area] = 1; // 4 areas 4 bits for EOB :)
331 for (; i < mb_area_start[area + 1]; i = bi->next[i]) {
332 bi->mb[i] >>= 1;
333
334 if (bi->mb[i]) {
335 bi->bit_size[area] += dv_rl2vlc_size(i - prev - 1, bi->mb[i]);
336 bi->next[prev] = i;
337 prev = i;
338 }
339 }
340 }
341 bi->next[prev] = i;
342 }
343
344 return bi->bit_size[0] + bi->bit_size[1] +
345 bi->bit_size[2] + bi->bit_size[3];
346}
347
348static inline void dv_guess_qnos(EncBlockInfo *blks, int *qnos)
349{
350 int size[5];
351 int i, j, k, a, prev, a2;
352 EncBlockInfo *b;
353
354 size[0] =
355 size[1] =
356 size[2] =
357 size[3] =
358 size[4] = 1 << 24;
359 do {
360 b = blks;
361 for (i = 0; i < 5; i++) {
362 if (!qnos[i])
363 continue;
364
365 qnos[i]--;
366 size[i] = 0;
367 for (j = 0; j < 6; j++, b++) {
368 for (a = 0; a < 4; a++) {
369 if (b->area_q[a] != ff_dv_quant_shifts[qnos[i] + ff_dv_quant_offset[b->cno]][a]) {
370 b->bit_size[a] = 1; // 4 areas 4 bits for EOB :)
371 b->area_q[a]++;
372 prev = b->prev[a];
373 av_assert2(b->next[prev] >= mb_area_start[a + 1] || b->mb[prev]);
374 for (k = b->next[prev]; k < mb_area_start[a + 1]; k = b->next[k]) {
375 b->mb[k] >>= 1;
376 if (b->mb[k]) {
377 b->bit_size[a] += dv_rl2vlc_size(k - prev - 1, b->mb[k]);
378 prev = k;
379 } else {
380 if (b->next[k] >= mb_area_start[a + 1] && b->next[k] < 64) {
381 for (a2 = a + 1; b->next[k] >= mb_area_start[a2 + 1]; a2++)
382 b->prev[a2] = prev;
383 av_assert2(a2 < 4);
384 av_assert2(b->mb[b->next[k]]);
385 b->bit_size[a2] += dv_rl2vlc_size(b->next[k] - prev - 1, b->mb[b->next[k]]) -
386 dv_rl2vlc_size(b->next[k] - k - 1, b->mb[b->next[k]]);
387 av_assert2(b->prev[a2] == k && (a2 + 1 >= 4 || b->prev[a2 + 1] != k));
388 b->prev[a2] = prev;
389 }
390 b->next[prev] = b->next[k];
391 }
392 }
393 b->prev[a + 1] = prev;
394 }
395 size[i] += b->bit_size[a];
396 }
397 }
398 if (vs_total_ac_bits >= size[0] + size[1] + size[2] + size[3] + size[4])
399 return;
400 }
401 } while (qnos[0] | qnos[1] | qnos[2] | qnos[3] | qnos[4]);
402
403 for (a = 2; a == 2 || vs_total_ac_bits < size[0]; a += a) {
404 b = blks;
405 size[0] = 5 * 6 * 4; // EOB
406 for (j = 0; j < 6 * 5; j++, b++) {
407 prev = b->prev[0];
408 for (k = b->next[prev]; k < 64; k = b->next[k]) {
409 if (b->mb[k] < a && b->mb[k] > -a) {
410 b->next[prev] = b->next[k];
411 } else {
412 size[0] += dv_rl2vlc_size(k - prev - 1, b->mb[k]);
413 prev = k;
414 }
415 }
416 }
417 }
418}
419
420static int dv_encode_video_segment(AVCodecContext *avctx, void *arg)
421{
422 DVVideoContext *s = avctx->priv_data;
423 DVwork_chunk *work_chunk = arg;
424 int mb_index, i, j;
425 int mb_x, mb_y, c_offset, linesize, y_stride;
426 uint8_t *y_ptr;
427 uint8_t *dif;
428 LOCAL_ALIGNED_8(uint8_t, scratch, [128]);
429 EncBlockInfo enc_blks[5 * DV_MAX_BPM];
430 PutBitContext pbs[5 * DV_MAX_BPM];
431 PutBitContext *pb;
432 EncBlockInfo *enc_blk;
433 int vs_bit_size = 0;
434 int qnos[5] = { 15, 15, 15, 15, 15 }; /* No quantization */
435 int *qnosp = &qnos[0];
436
437 dif = &s->buf[work_chunk->buf_offset * 80];
438 enc_blk = &enc_blks[0];
439 for (mb_index = 0; mb_index < 5; mb_index++) {
440 dv_calculate_mb_xy(s, work_chunk, mb_index, &mb_x, &mb_y);
441
442 /* initializing luminance blocks */
443 if ((s->sys->pix_fmt == AV_PIX_FMT_YUV420P) ||
444 (s->sys->pix_fmt == AV_PIX_FMT_YUV411P && mb_x >= (704 / 8)) ||
445 (s->sys->height >= 720 && mb_y != 134)) {
446 y_stride = s->frame->linesize[0] << 3;
447 } else {
448 y_stride = 16;
449 }
450 y_ptr = s->frame->data[0] +
451 ((mb_y * s->frame->linesize[0] + mb_x) << 3);
452 linesize = s->frame->linesize[0];
453
454 if (s->sys->video_stype == 4) { /* SD 422 */
455 vs_bit_size +=
456 dv_init_enc_block(enc_blk + 0, y_ptr, linesize, s, 0) +
457 dv_init_enc_block(enc_blk + 1, NULL, linesize, s, 0) +
458 dv_init_enc_block(enc_blk + 2, y_ptr + 8, linesize, s, 0) +
459 dv_init_enc_block(enc_blk + 3, NULL, linesize, s, 0);
460 } else {
461 vs_bit_size +=
462 dv_init_enc_block(enc_blk + 0, y_ptr, linesize, s, 0) +
463 dv_init_enc_block(enc_blk + 1, y_ptr + 8, linesize, s, 0) +
464 dv_init_enc_block(enc_blk + 2, y_ptr + y_stride, linesize, s, 0) +
465 dv_init_enc_block(enc_blk + 3, y_ptr + 8 + y_stride, linesize, s, 0);
466 }
467 enc_blk += 4;
468
469 /* initializing chrominance blocks */
470 c_offset = (((mb_y >> (s->sys->pix_fmt == AV_PIX_FMT_YUV420P)) * s->frame->linesize[1] +
471 (mb_x >> ((s->sys->pix_fmt == AV_PIX_FMT_YUV411P) ? 2 : 1))) << 3);
472 for (j = 2; j; j--) {
473 uint8_t *c_ptr = s->frame->data[j] + c_offset;
474 linesize = s->frame->linesize[j];
475 y_stride = (mb_y == 134) ? 8 : (s->frame->linesize[j] << 3);
476 if (s->sys->pix_fmt == AV_PIX_FMT_YUV411P && mb_x >= (704 / 8)) {
477 uint8_t *d;
478 uint8_t *b = scratch;
479 for (i = 0; i < 8; i++) {
480 d = c_ptr + (linesize << 3);
481 b[0] = c_ptr[0];
482 b[1] = c_ptr[1];
483 b[2] = c_ptr[2];
484 b[3] = c_ptr[3];
485 b[4] = d[0];
486 b[5] = d[1];
487 b[6] = d[2];
488 b[7] = d[3];
489 c_ptr += linesize;
490 b += 16;
491 }
492 c_ptr = scratch;
493 linesize = 16;
494 }
495
496 vs_bit_size += dv_init_enc_block(enc_blk++, c_ptr, linesize, s, 1);
497 if (s->sys->bpm == 8)
498 vs_bit_size += dv_init_enc_block(enc_blk++, c_ptr + y_stride,
499 linesize, s, 1);
500 }
501 }
502
503 if (vs_total_ac_bits < vs_bit_size)
504 dv_guess_qnos(&enc_blks[0], qnosp);
505
506 /* DIF encoding process */
507 for (j = 0; j < 5 * s->sys->bpm;) {
508 int start_mb = j;
509
510 dif[3] = *qnosp++;
511 dif += 4;
512
513 /* First pass over individual cells only */
514 for (i = 0; i < s->sys->bpm; i++, j++) {
515 int sz = s->sys->block_sizes[i] >> 3;
516
517 init_put_bits(&pbs[j], dif, sz);
518 put_sbits(&pbs[j], 9, ((enc_blks[j].mb[0] >> 3) - 1024 + 2) >> 2);
519 put_bits(&pbs[j], 1, enc_blks[j].dct_mode);
520 put_bits(&pbs[j], 2, enc_blks[j].cno);
521
522 dv_encode_ac(&enc_blks[j], &pbs[j], &pbs[j + 1]);
523 dif += sz;
524 }
525
526 /* Second pass over each MB space */
527 pb = &pbs[start_mb];
528 for (i = 0; i < s->sys->bpm; i++)
529 if (enc_blks[start_mb + i].partial_bit_count)
530 pb = dv_encode_ac(&enc_blks[start_mb + i], pb,
531 &pbs[start_mb + s->sys->bpm]);
532 }
533
534 /* Third and final pass over the whole video segment space */
535 pb = &pbs[0];
536 for (j = 0; j < 5 * s->sys->bpm; j++) {
537 if (enc_blks[j].partial_bit_count)
538 pb = dv_encode_ac(&enc_blks[j], pb, &pbs[s->sys->bpm * 5]);
539 if (enc_blks[j].partial_bit_count)
540 av_log(avctx, AV_LOG_ERROR, "ac bitstream overflow\n");
541 }
542
543 for (j = 0; j < 5 * s->sys->bpm; j++) {
544 int pos;
545 int size = pbs[j].size_in_bits >> 3;
546 flush_put_bits(&pbs[j]);
547 pos = put_bits_count(&pbs[j]) >> 3;
548 if (pos > size) {
549 av_log(avctx, AV_LOG_ERROR,
550 "bitstream written beyond buffer size\n");
551 return -1;
552 }
553 memset(pbs[j].buf + pos, 0xff, size - pos);
554 }
555
556 return 0;
557}
558
559static inline int dv_write_pack(enum dv_pack_type pack_id, DVVideoContext *c,
560 uint8_t *buf)
561{
562 /*
563 * Here's what SMPTE314M says about these two:
564 * (page 6) APTn, AP1n, AP2n, AP3n: These data shall be identical
565 * as track application IDs (APTn = 001, AP1n =
566 * 001, AP2n = 001, AP3n = 001), if the source signal
567 * comes from a digital VCR. If the signal source is
568 * unknown, all bits for these data shall be set to 1.
569 * (page 12) STYPE: STYPE defines a signal type of video signal
570 * 00000b = 4:1:1 compression
571 * 00100b = 4:2:2 compression
572 * XXXXXX = Reserved
573 * Now, I've got two problems with these statements:
574 * 1. it looks like APT == 111b should be a safe bet, but it isn't.
575 * It seems that for PAL as defined in IEC 61834 we have to set
576 * APT to 000 and for SMPTE314M to 001.
577 * 2. It is not at all clear what STYPE is used for 4:2:0 PAL
578 * compression scheme (if any).
579 */
580 int apt = (c->sys->pix_fmt == AV_PIX_FMT_YUV420P ? 0 : 1);
581 int fs = c->frame->top_field_first ? 0x00 : 0x40;
582
583 uint8_t aspect = 0;
584 if ((int) (av_q2d(c->avctx->sample_aspect_ratio) *
585 c->avctx->width / c->avctx->height * 10) >= 17) /* 16:9 */
586 aspect = 0x02;
587
588 buf[0] = (uint8_t) pack_id;
589 switch (pack_id) {
590 case dv_header525: /* I can't imagine why these two weren't defined as real */
591 case dv_header625: /* packs in SMPTE314M -- they definitely look like ones */
592 buf[1] = 0xf8 | /* reserved -- always 1 */
593 (apt & 0x07); /* APT: Track application ID */
594 buf[2] = (0 << 7) | /* TF1: audio data is 0 - valid; 1 - invalid */
595 (0x0f << 3) | /* reserved -- always 1 */
596 (apt & 0x07); /* AP1: Audio application ID */
597 buf[3] = (0 << 7) | /* TF2: video data is 0 - valid; 1 - invalid */
598 (0x0f << 3) | /* reserved -- always 1 */
599 (apt & 0x07); /* AP2: Video application ID */
600 buf[4] = (0 << 7) | /* TF3: subcode(SSYB) is 0 - valid; 1 - invalid */
601 (0x0f << 3) | /* reserved -- always 1 */
602 (apt & 0x07); /* AP3: Subcode application ID */
603 break;
604 case dv_video_source:
605 buf[1] = 0xff; /* reserved -- always 1 */
606 buf[2] = (1 << 7) | /* B/W: 0 - b/w, 1 - color */
607 (1 << 6) | /* following CLF is valid - 0, invalid - 1 */
608 (3 << 4) | /* CLF: color frames ID (see ITU-R BT.470-4) */
609 0xf; /* reserved -- always 1 */
610 buf[3] = (3 << 6) | /* reserved -- always 1 */
611 (c->sys->dsf << 5) | /* system: 60fields/50fields */
612 c->sys->video_stype; /* signal type video compression */
613 buf[4] = 0xff; /* VISC: 0xff -- no information */
614 break;
615 case dv_video_control:
616 buf[1] = (0 << 6) | /* Copy generation management (CGMS) 0 -- free */
617 0x3f; /* reserved -- always 1 */
618 buf[2] = 0xc8 | /* reserved -- always b11001xxx */
619 aspect;
620 buf[3] = (1 << 7) | /* frame/field flag 1 -- frame, 0 -- field */
621 fs | /* first/second field flag 0 -- field 2, 1 -- field 1 */
622 (1 << 5) | /* frame change flag 0 -- same picture as before, 1 -- different */
623 (1 << 4) | /* 1 - interlaced, 0 - noninterlaced */
624 0xc; /* reserved -- always b1100 */
625 buf[4] = 0xff; /* reserved -- always 1 */
626 break;
627 default:
628 buf[1] =
629 buf[2] =
630 buf[3] =
631 buf[4] = 0xff;
632 }
633 return 5;
634}
635
636static inline int dv_write_dif_id(enum dv_section_type t, uint8_t chan_num,
637 uint8_t seq_num, uint8_t dif_num,
638 uint8_t *buf)
639{
640 buf[0] = (uint8_t) t; /* Section type */
641 buf[1] = (seq_num << 4) | /* DIF seq number 0-9 for 525/60; 0-11 for 625/50 */
642 (chan_num << 3) | /* FSC: for 50Mb/s 0 - first channel; 1 - second */
643 7; /* reserved -- always 1 */
644 buf[2] = dif_num; /* DIF block number Video: 0-134, Audio: 0-8 */
645 return 3;
646}
647
648static inline int dv_write_ssyb_id(uint8_t syb_num, uint8_t fr, uint8_t *buf)
649{
650 if (syb_num == 0 || syb_num == 6) {
651 buf[0] = (fr << 7) | /* FR ID 1 - first half of each channel; 0 - second */
652 (0 << 4) | /* AP3 (Subcode application ID) */
653 0x0f; /* reserved -- always 1 */
654 } else if (syb_num == 11) {
655 buf[0] = (fr << 7) | /* FR ID 1 - first half of each channel; 0 - second */
656 0x7f; /* reserved -- always 1 */
657 } else {
658 buf[0] = (fr << 7) | /* FR ID 1 - first half of each channel; 0 - second */
659 (0 << 4) | /* APT (Track application ID) */
660 0x0f; /* reserved -- always 1 */
661 }
662 buf[1] = 0xf0 | /* reserved -- always 1 */
663 (syb_num & 0x0f); /* SSYB number 0 - 11 */
664 buf[2] = 0xff; /* reserved -- always 1 */
665 return 3;
666}
667
668static void dv_format_frame(DVVideoContext *c, uint8_t *buf)
669{
670 int chan, i, j, k;
671
672 for (chan = 0; chan < c->sys->n_difchan; chan++) {
673 for (i = 0; i < c->sys->difseg_size; i++) {
674 memset(buf, 0xff, 80 * 6); /* first 6 DIF blocks are for control data */
675
676 /* DV header: 1DIF */
677 buf += dv_write_dif_id(dv_sect_header, chan, i, 0, buf);
678 buf += dv_write_pack((c->sys->dsf ? dv_header625 : dv_header525),
679 c, buf);
680 buf += 72; /* unused bytes */
681
682 /* DV subcode: 2DIFs */
683 for (j = 0; j < 2; j++) {
684 buf += dv_write_dif_id(dv_sect_subcode, chan, i, j, buf);
685 for (k = 0; k < 6; k++)
686 buf += dv_write_ssyb_id(k, (i < c->sys->difseg_size / 2), buf) + 5;
687 buf += 29; /* unused bytes */
688 }
689
690 /* DV VAUX: 3DIFS */
691 for (j = 0; j < 3; j++) {
692 buf += dv_write_dif_id(dv_sect_vaux, chan, i, j, buf);
693 buf += dv_write_pack(dv_video_source, c, buf);
694 buf += dv_write_pack(dv_video_control, c, buf);
695 buf += 7 * 5;
696 buf += dv_write_pack(dv_video_source, c, buf);
697 buf += dv_write_pack(dv_video_control, c, buf);
698 buf += 4 * 5 + 2; /* unused bytes */
699 }
700
701 /* DV Audio/Video: 135 Video DIFs + 9 Audio DIFs */
702 for (j = 0; j < 135; j++) {
703 if (j % 15 == 0) {
704 memset(buf, 0xff, 80);
705 buf += dv_write_dif_id(dv_sect_audio, chan, i, j / 15, buf);
706 buf += 77; /* audio control & shuffled PCM audio */
707 }
708 buf += dv_write_dif_id(dv_sect_video, chan, i, j, buf);
709 buf += 77; /* 1 video macroblock: 1 bytes control
710 * 4 * 14 bytes Y 8x8 data
711 * 10 bytes Cr 8x8 data
712 * 10 bytes Cb 8x8 data */
713 }
714 }
715 }
716}
717
718static int dvvideo_encode_frame(AVCodecContext *c, AVPacket *pkt,
719 const AVFrame *frame, int *got_packet)
720{
721 DVVideoContext *s = c->priv_data;
722 int ret;
723
724 if ((ret = ff_alloc_packet2(c, pkt, s->sys->frame_size)) < 0)
725 return ret;
726
727 c->pix_fmt = s->sys->pix_fmt;
728 s->frame = frame;
729 c->coded_frame->key_frame = 1;
730 c->coded_frame->pict_type = AV_PICTURE_TYPE_I;
731
732 s->buf = pkt->data;
733 c->execute(c, dv_encode_video_segment, s->work_chunks, NULL,
734 dv_work_pool_size(s->sys), sizeof(DVwork_chunk));
735
736 emms_c();
737
738 dv_format_frame(s, pkt->data);
739
740 pkt->flags |= AV_PKT_FLAG_KEY;
741 *got_packet = 1;
742
743 return 0;
744}
745
746static int dvvideo_encode_close(AVCodecContext *avctx)
747{
748 av_frame_free(&avctx->coded_frame);
749 return 0;
750}
751
752AVCodec ff_dvvideo_encoder = {
753 .name = "dvvideo",
754 .long_name = NULL_IF_CONFIG_SMALL("DV (Digital Video)"),
755 .type = AVMEDIA_TYPE_VIDEO,
756 .id = AV_CODEC_ID_DVVIDEO,
757 .priv_data_size = sizeof(DVVideoContext),
758 .init = dvvideo_encode_init,
759 .encode2 = dvvideo_encode_frame,
760 .close = dvvideo_encode_close,
f6fa7814 761 .capabilities = CODEC_CAP_SLICE_THREADS | CODEC_CAP_FRAME_THREADS | CODEC_CAP_INTRA_ONLY,
2ba45a60
DM
762 .pix_fmts = (const enum AVPixelFormat[]) {
763 AV_PIX_FMT_YUV411P, AV_PIX_FMT_YUV422P,
764 AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE
765 },
766};