Commit 0b297700 authored by Daniel Maas's avatar Daniel Maas Committed by Roman Shaposhnik

DVCPRO50 support.

Patch by Daniel Maas dmaas at maasdigital dot com

Originally committed as revision 5113 to svn://svn.ffmpeg.org/ffmpeg/trunk
parent 2ffb22d2
...@@ -25,6 +25,7 @@ Todd Kirby ...@@ -25,6 +25,7 @@ Todd Kirby
Nick Kurshev Nick Kurshev
Benjamin Larsson Benjamin Larsson
Loïc Le Loarer Loïc Le Loarer
Daniel Maas
Mike Melanson Mike Melanson
Loren Merritt Loren Merritt
Jeff Muizelaar Jeff Muizelaar
......
...@@ -6,6 +6,9 @@ ...@@ -6,6 +6,9 @@
* DV encoder * DV encoder
* Copyright (c) 2003 Roman Shaposhnik. * Copyright (c) 2003 Roman Shaposhnik.
* *
* 50 Mbps (DVCPRO50) support
* Copyright (c) 2006 Daniel Maas <dmaas@maasdigital.com>
*
* Many thanks to Dan Dennedy <dan@dennedy.org> for providing wealth * Many thanks to Dan Dennedy <dan@dennedy.org> for providing wealth
* of DV technical info. * of DV technical info.
* *
...@@ -51,8 +54,12 @@ typedef struct DVVideoContext { ...@@ -51,8 +54,12 @@ typedef struct DVVideoContext {
void (*idct_put[2])(uint8_t *dest, int line_size, DCTELEM *block); void (*idct_put[2])(uint8_t *dest, int line_size, DCTELEM *block);
} DVVideoContext; } DVVideoContext;
/* MultiThreading - applies to entire DV codec, not just the avcontext */ /* MultiThreading - dv_anchor applies to entire DV codec, not just the avcontext */
uint8_t** dv_anchor; /* one element is needed for each video segment in a DV frame */
/* at most there are 2 DIF channels * 12 DIF sequences * 27 video segments (PAL 50Mbps) */
#define DV_ANCHOR_SIZE (2*12*27)
static void* dv_anchor[DV_ANCHOR_SIZE];
#define TEX_VLC_BITS 9 #define TEX_VLC_BITS 9
...@@ -118,11 +125,7 @@ static int dvvideo_init(AVCodecContext *avctx) ...@@ -118,11 +125,7 @@ static int dvvideo_init(AVCodecContext *avctx)
return -ENOMEM; return -ENOMEM;
/* dv_anchor lets each thread know its Id */ /* dv_anchor lets each thread know its Id */
dv_anchor = av_malloc(12*27*sizeof(void*)); for (i=0; i<DV_ANCHOR_SIZE; i++)
if (!dv_anchor) {
return -ENOMEM;
}
for (i=0; i<12*27; i++)
dv_anchor[i] = (void*)(size_t)i; dv_anchor[i] = (void*)(size_t)i;
/* it's faster to include sign bit in a generic VLC parsing scheme */ /* it's faster to include sign bit in a generic VLC parsing scheme */
...@@ -239,8 +242,15 @@ static int dvvideo_init(AVCodecContext *avctx) ...@@ -239,8 +242,15 @@ static int dvvideo_init(AVCodecContext *avctx)
dv_build_unquantize_tables(s, dsp.idct_permutation); dv_build_unquantize_tables(s, dsp.idct_permutation);
/* FIXME: I really don't think this should be here */ /* FIXME: I really don't think this should be here */
if (dv_codec_profile(avctx)) s->sys = dv_codec_profile(avctx);
avctx->pix_fmt = dv_codec_profile(avctx)->pix_fmt; if(!s->sys) {
av_log(avctx, AV_LOG_ERROR, "Cannot determine type of DV output stream\n");
return -EINVAL;
}
avctx->pix_fmt = s->sys->pix_fmt;
avctx->bit_rate = av_rescale(s->sys->frame_size * 8,
s->sys->frame_rate,
s->sys->frame_rate_base);
avctx->coded_frame = &s->picture; avctx->coded_frame = &s->picture;
s->avctx= avctx; s->avctx= avctx;
...@@ -495,45 +505,63 @@ static inline void dv_decode_video_segment(DVVideoContext *s, ...@@ -495,45 +505,63 @@ static inline void dv_decode_video_segment(DVVideoContext *s,
v = *mb_pos_ptr++; v = *mb_pos_ptr++;
mb_x = v & 0xff; mb_x = v & 0xff;
mb_y = v >> 8; mb_y = v >> 8;
y_ptr = s->picture.data[0] + ((mb_y * s->picture.linesize[0] + mb_x)<<log2_blocksize); if (s->sys->pix_fmt == PIX_FMT_YUV422P) {
if (s->sys->pix_fmt == PIX_FMT_YUV411P) y_ptr = s->picture.data[0] + ((mb_y * s->picture.linesize[0] + (mb_x>>1))<<log2_blocksize);
c_offset = ((mb_y * s->picture.linesize[1] + (mb_x >> 2))<<log2_blocksize); c_offset = ((mb_y * s->picture.linesize[1] + (mb_x >> 2))<<log2_blocksize);
else } else { /* 4:1:1 or 4:2:0 */
c_offset = (((mb_y >> 1) * s->picture.linesize[1] + (mb_x >> 1))<<log2_blocksize); y_ptr = s->picture.data[0] + ((mb_y * s->picture.linesize[0] + mb_x)<<log2_blocksize);
if (s->sys->pix_fmt == PIX_FMT_YUV411P)
c_offset = ((mb_y * s->picture.linesize[1] + (mb_x >> 2))<<log2_blocksize);
else /* 4:2:0 */
c_offset = (((mb_y >> 1) * s->picture.linesize[1] + (mb_x >> 1))<<log2_blocksize);
}
for(j = 0;j < 6; j++) { for(j = 0;j < 6; j++) {
idct_put = s->idct_put[mb->dct_mode && log2_blocksize==3]; idct_put = s->idct_put[mb->dct_mode && log2_blocksize==3];
if (j < 4) { if (s->sys->pix_fmt == PIX_FMT_YUV422P) { /* 4:2:2 */
if (s->sys->pix_fmt == PIX_FMT_YUV411P && mb_x < (704 / 8)) { if (j == 0 || j == 2) {
/* NOTE: at end of line, the macroblock is handled as 420 */ /* Y0 Y1 */
idct_put(y_ptr + (j<<log2_blocksize), s->picture.linesize[0], block); idct_put(y_ptr + ((j >> 1)<<log2_blocksize),
} else {
idct_put(y_ptr + (((j & 1) + (j >> 1) * s->picture.linesize[0])<<log2_blocksize),
s->picture.linesize[0], block); s->picture.linesize[0], block);
} else if(j > 3) {
/* Cr Cb */
idct_put(s->picture.data[6 - j] + c_offset,
s->picture.linesize[6 - j], block);
} }
} else { /* note: j=1 and j=3 are "dummy" blocks in 4:2:2 */
if (s->sys->pix_fmt == PIX_FMT_YUV411P && mb_x >= (704 / 8)) { } else { /* 4:1:1 or 4:2:0 */
uint64_t aligned_pixels[64/8]; if (j < 4) {
uint8_t *pixels= (uint8_t*)aligned_pixels; if (s->sys->pix_fmt == PIX_FMT_YUV411P && mb_x < (704 / 8)) {
uint8_t *c_ptr, *c_ptr1, *ptr, *ptr1; /* NOTE: at end of line, the macroblock is handled as 420 */
int x, y, linesize; idct_put(y_ptr + (j<<log2_blocksize), s->picture.linesize[0], block);
/* NOTE: at end of line, the macroblock is handled as 420 */ } else {
idct_put(pixels, 8, block); idct_put(y_ptr + (((j & 1) + (j >> 1) * s->picture.linesize[0])<<log2_blocksize),
linesize = s->picture.linesize[6 - j]; s->picture.linesize[0], block);
c_ptr = s->picture.data[6 - j] + c_offset;
ptr = pixels;
for(y = 0;y < (1<<log2_blocksize); y++) {
ptr1= ptr + (1<<(log2_blocksize-1));
c_ptr1 = c_ptr + (linesize<<log2_blocksize);
for(x=0; x < (1<<(log2_blocksize-1)); x++){
c_ptr[x]= ptr[x]; c_ptr1[x]= ptr1[x];
}
c_ptr += linesize;
ptr += 8;
} }
} else { } else {
/* don't ask me why they inverted Cb and Cr ! */ if (s->sys->pix_fmt == PIX_FMT_YUV411P && mb_x >= (704 / 8)) {
idct_put(s->picture.data[6 - j] + c_offset, uint64_t aligned_pixels[64/8];
s->picture.linesize[6 - j], block); uint8_t *pixels= (uint8_t*)aligned_pixels;
uint8_t *c_ptr, *c_ptr1, *ptr, *ptr1;
int x, y, linesize;
/* NOTE: at end of line, the macroblock is handled as 420 */
idct_put(pixels, 8, block);
linesize = s->picture.linesize[6 - j];
c_ptr = s->picture.data[6 - j] + c_offset;
ptr = pixels;
for(y = 0;y < (1<<log2_blocksize); y++) {
ptr1= ptr + (1<<(log2_blocksize-1));
c_ptr1 = c_ptr + (linesize<<log2_blocksize);
for(x=0; x < (1<<(log2_blocksize-1)); x++){
c_ptr[x]= ptr[x]; c_ptr1[x]= ptr1[x];
}
c_ptr += linesize;
ptr += 8;
}
} else {
/* don't ask me why they inverted Cb and Cr ! */
idct_put(s->picture.data[6 - j] + c_offset,
s->picture.linesize[6 - j], block);
}
} }
} }
block += 64; block += 64;
...@@ -845,28 +873,52 @@ static inline void dv_encode_video_segment(DVVideoContext *s, ...@@ -845,28 +873,52 @@ static inline void dv_encode_video_segment(DVVideoContext *s,
v = *mb_pos_ptr++; v = *mb_pos_ptr++;
mb_x = v & 0xff; mb_x = v & 0xff;
mb_y = v >> 8; mb_y = v >> 8;
y_ptr = s->picture.data[0] + (mb_y * s->picture.linesize[0] * 8) + (mb_x * 8); if (s->sys->pix_fmt == PIX_FMT_YUV422P) {
c_offset = (s->sys->pix_fmt == PIX_FMT_YUV411P) ? y_ptr = s->picture.data[0] + (mb_y * s->picture.linesize[0] * 8) + (mb_x * 4);
((mb_y * s->picture.linesize[1] * 8) + ((mb_x >> 2) * 8)) : } else { /* 4:1:1 */
(((mb_y >> 1) * s->picture.linesize[1] * 8) + ((mb_x >> 1) * 8)); y_ptr = s->picture.data[0] + (mb_y * s->picture.linesize[0] * 8) + (mb_x * 8);
}
if (s->sys->pix_fmt == PIX_FMT_YUV420P) {
c_offset = (((mb_y >> 1) * s->picture.linesize[1] * 8) + ((mb_x >> 1) * 8));
} else { /* 4:2:2 or 4:1:1 */
c_offset = ((mb_y * s->picture.linesize[1] * 8) + ((mb_x >> 2) * 8));
}
do_edge_wrap = 0; do_edge_wrap = 0;
qnos[mb_index] = 15; /* No quantization */ qnos[mb_index] = 15; /* No quantization */
ptr = dif + mb_index*80 + 4; ptr = dif + mb_index*80 + 4;
for(j = 0;j < 6; j++) { for(j = 0;j < 6; j++) {
if (j < 4) { /* Four Y blocks */ int dummy = 0;
/* NOTE: at end of line, the macroblock is handled as 420 */ if (s->sys->pix_fmt == PIX_FMT_YUV422P) { /* 4:2:2 */
if (s->sys->pix_fmt == PIX_FMT_YUV411P && mb_x < (704 / 8)) { if (j == 0 || j == 2) {
data = y_ptr + (j * 8); /* Y0 Y1 */
data = y_ptr + ((j>>1) * 8);
linesize = s->picture.linesize[0];
} else if (j > 3) {
/* Cr Cb */
data = s->picture.data[6 - j] + c_offset;
linesize = s->picture.linesize[6 - j];
} else { } else {
data = y_ptr + ((j & 1) * 8) + ((j >> 1) * 8 * s->picture.linesize[0]); /* j=1 and j=3 are "dummy" blocks, used for AC data only */
data = 0;
linesize = 0;
dummy = 1;
}
} else { /* 4:1:1 or 4:2:0 */
if (j < 4) { /* Four Y blocks */
/* NOTE: at end of line, the macroblock is handled as 420 */
if (s->sys->pix_fmt == PIX_FMT_YUV411P && mb_x < (704 / 8)) {
data = y_ptr + (j * 8);
} else {
data = y_ptr + ((j & 1) * 8) + ((j >> 1) * 8 * s->picture.linesize[0]);
}
linesize = s->picture.linesize[0];
} else { /* Cr and Cb blocks */
/* don't ask Fabrice why they inverted Cb and Cr ! */
data = s->picture.data[6 - j] + c_offset;
linesize = s->picture.linesize[6 - j];
if (s->sys->pix_fmt == PIX_FMT_YUV411P && mb_x >= (704 / 8))
do_edge_wrap = 1;
} }
linesize = s->picture.linesize[0];
} else { /* Cr and Cb blocks */
/* don't ask Fabrice why they inverted Cb and Cr ! */
data = s->picture.data[6 - j] + c_offset;
linesize = s->picture.linesize[6 - j];
if (s->sys->pix_fmt == PIX_FMT_YUV411P && mb_x >= (704 / 8))
do_edge_wrap = 1;
} }
/* Everything is set up -- now just copy data -> DCT block */ /* Everything is set up -- now just copy data -> DCT block */
...@@ -881,7 +933,8 @@ static inline void dv_encode_video_segment(DVVideoContext *s, ...@@ -881,7 +933,8 @@ static inline void dv_encode_video_segment(DVVideoContext *s,
b += 8; b += 8;
} }
} else { /* Simple copy: 8x8 -> 8x8 */ } else { /* Simple copy: 8x8 -> 8x8 */
s->get_pixels(block, data, linesize); if (!dummy)
s->get_pixels(block, data, linesize);
} }
if(s->avctx->flags & CODEC_FLAG_INTERLACED_DCT) if(s->avctx->flags & CODEC_FLAG_INTERLACED_DCT)
...@@ -893,7 +946,13 @@ static inline void dv_encode_video_segment(DVVideoContext *s, ...@@ -893,7 +946,13 @@ static inline void dv_encode_video_segment(DVVideoContext *s,
enc_blk->partial_bit_buffer = 0; enc_blk->partial_bit_buffer = 0;
enc_blk->cur_ac = 0; enc_blk->cur_ac = 0;
s->fdct[enc_blk->dct_mode](block); if (dummy) {
/* We rely on the fact that encoding all zeros leads to an immediate EOB,
which is precisely what the spec calls for in the "dummy" blocks. */
memset(block, 0, sizeof(block));
} else {
s->fdct[enc_blk->dct_mode](block);
}
dv_set_class_number(block, enc_blk, dv_set_class_number(block, enc_blk,
enc_blk->dct_mode ? ff_zigzag248_direct : ff_zigzag_direct, enc_blk->dct_mode ? ff_zigzag248_direct : ff_zigzag_direct,
...@@ -950,7 +1009,17 @@ static int dv_decode_mt(AVCodecContext *avctx, void* sl) ...@@ -950,7 +1009,17 @@ static int dv_decode_mt(AVCodecContext *avctx, void* sl)
{ {
DVVideoContext *s = avctx->priv_data; DVVideoContext *s = avctx->priv_data;
int slice = (size_t)sl; int slice = (size_t)sl;
dv_decode_video_segment(s, &s->buf[((slice/27)*6+(slice/3)+slice*5+7)*80],
/* which DIF channel is this? */
int chan = slice / (s->sys->difseg_size * 27);
/* slice within the DIF channel */
int chan_slice = slice % (s->sys->difseg_size * 27);
/* byte offset of this channel's data */
int chan_offset = chan * s->sys->difseg_size * 150 * 80;
dv_decode_video_segment(s, &s->buf[((chan_slice/27)*6+(chan_slice/3)+chan_slice*5+7)*80 + chan_offset],
&s->sys->video_place[slice*5]); &s->sys->video_place[slice*5]);
return 0; return 0;
} }
...@@ -959,13 +1028,23 @@ static int dv_encode_mt(AVCodecContext *avctx, void* sl) ...@@ -959,13 +1028,23 @@ static int dv_encode_mt(AVCodecContext *avctx, void* sl)
{ {
DVVideoContext *s = avctx->priv_data; DVVideoContext *s = avctx->priv_data;
int slice = (size_t)sl; int slice = (size_t)sl;
dv_encode_video_segment(s, &s->buf[((slice/27)*6+(slice/3)+slice*5+7)*80],
/* which DIF channel is this? */
int chan = slice / (s->sys->difseg_size * 27);
/* slice within the DIF channel */
int chan_slice = slice % (s->sys->difseg_size * 27);
/* byte offset of this channel's data */
int chan_offset = chan * s->sys->difseg_size * 150 * 80;
dv_encode_video_segment(s, &s->buf[((chan_slice/27)*6+(chan_slice/3)+chan_slice*5+7)*80 + chan_offset],
&s->sys->video_place[slice*5]); &s->sys->video_place[slice*5]);
return 0; return 0;
} }
/* NOTE: exactly one frame must be given (120000 bytes for NTSC, /* NOTE: exactly one frame must be given (120000 bytes for NTSC,
144000 bytes for PAL) */ 144000 bytes for PAL - or twice those for 50Mbps) */
static int dvvideo_decode_frame(AVCodecContext *avctx, static int dvvideo_decode_frame(AVCodecContext *avctx,
void *data, int *data_size, void *data, int *data_size,
uint8_t *buf, int buf_size) uint8_t *buf, int buf_size)
...@@ -993,7 +1072,7 @@ static int dvvideo_decode_frame(AVCodecContext *avctx, ...@@ -993,7 +1072,7 @@ static int dvvideo_decode_frame(AVCodecContext *avctx,
s->buf = buf; s->buf = buf;
avctx->execute(avctx, dv_decode_mt, (void**)&dv_anchor[0], NULL, avctx->execute(avctx, dv_decode_mt, (void**)&dv_anchor[0], NULL,
s->sys->difseg_size * 27); s->sys->n_difchan * s->sys->difseg_size * 27);
emms_c(); emms_c();
...@@ -1022,9 +1101,23 @@ static int dvvideo_encode_frame(AVCodecContext *c, uint8_t *buf, int buf_size, ...@@ -1022,9 +1101,23 @@ static int dvvideo_encode_frame(AVCodecContext *c, uint8_t *buf, int buf_size,
s->buf = buf; s->buf = buf;
c->execute(c, dv_encode_mt, (void**)&dv_anchor[0], NULL, c->execute(c, dv_encode_mt, (void**)&dv_anchor[0], NULL,
s->sys->difseg_size * 27); s->sys->n_difchan * s->sys->difseg_size * 27);
emms_c(); emms_c();
/* Fill in just enough of the header for dv_frame_profile() to
return the correct result, so that the frame can be decoded
correctly. The rest of the metadata is filled in by the dvvideo
avformat. (this should probably change so that encode_frame()
fills in ALL of the metadata - e.g. for Quicktime-wrapped DV
streams) */
/* NTSC/PAL format */
buf[3] = s->sys->dsf ? 0x80 : 0x00;
/* 25Mbps or 50Mbps */
buf[80*5 + 48 + 3] = (s->sys->pix_fmt == PIX_FMT_YUV422P) ? 0x4 : 0x0;
return s->sys->frame_size; return s->sys->frame_size;
} }
......
...@@ -31,7 +31,8 @@ ...@@ -31,7 +31,8 @@
typedef struct DVprofile { typedef struct DVprofile {
int dsf; /* value of the dsf in the DV header */ int dsf; /* value of the dsf in the DV header */
int frame_size; /* total size of one frame in bytes */ int frame_size; /* total size of one frame in bytes */
int difseg_size; /* number of DIF segments */ int difseg_size; /* number of DIF segments per DIF channel */
int n_difchan; /* number of DIF channels per frame */
int frame_rate; int frame_rate;
int frame_rate_base; int frame_rate_base;
int ltc_divisor; /* FPS from the LTS standpoint */ int ltc_divisor; /* FPS from the LTS standpoint */
...@@ -1256,6 +1257,1206 @@ static const uint16_t dv_place_411[1350] = { ...@@ -1256,6 +1257,1206 @@ static const uint16_t dv_place_411[1350] = {
0x0834, 0x2320, 0x2f44, 0x3810, 0x1658, 0x0834, 0x2320, 0x2f44, 0x3810, 0x1658,
}; };
/* 4:2:2 macroblock placement tables created by dvtables.py */
/* 2 channels per frame, 10 DIF sequences per channel,
27 video segments per DIF sequence, 5 macroblocks per video segment */
static const uint16_t dv_place_422_525[2*10*27*5] = {
0x0c48, 0x2424, 0x306c, 0x0000, 0x1890,
0x0d48, 0x2524, 0x316c, 0x0100, 0x1990,
0x0e48, 0x2624, 0x326c, 0x0200, 0x1a90,
0x0e4c, 0x2628, 0x3270, 0x0204, 0x1a94,
0x0d4c, 0x2528, 0x3170, 0x0104, 0x1994,
0x0c4c, 0x2428, 0x3070, 0x0004, 0x1894,
0x0c50, 0x242c, 0x3074, 0x0008, 0x1898,
0x0d50, 0x252c, 0x3174, 0x0108, 0x1998,
0x0e50, 0x262c, 0x3274, 0x0208, 0x1a98,
0x0e54, 0x2630, 0x3278, 0x020c, 0x1a9c,
0x0d54, 0x2530, 0x3178, 0x010c, 0x199c,
0x0c54, 0x2430, 0x3078, 0x000c, 0x189c,
0x0c58, 0x2434, 0x307c, 0x0010, 0x18a0,
0x0d58, 0x2534, 0x317c, 0x0110, 0x19a0,
0x0e58, 0x2634, 0x327c, 0x0210, 0x1aa0,
0x0e5c, 0x2638, 0x3280, 0x0214, 0x1aa4,
0x0d5c, 0x2538, 0x3180, 0x0114, 0x19a4,
0x0c5c, 0x2438, 0x3080, 0x0014, 0x18a4,
0x0c60, 0x243c, 0x3084, 0x0018, 0x18a8,
0x0d60, 0x253c, 0x3184, 0x0118, 0x19a8,
0x0e60, 0x263c, 0x3284, 0x0218, 0x1aa8,
0x0e64, 0x2640, 0x3288, 0x021c, 0x1aac,
0x0d64, 0x2540, 0x3188, 0x011c, 0x19ac,
0x0c64, 0x2440, 0x3088, 0x001c, 0x18ac,
0x0c68, 0x2444, 0x308c, 0x0020, 0x18b0,
0x0d68, 0x2544, 0x318c, 0x0120, 0x19b0,
0x0e68, 0x2644, 0x328c, 0x0220, 0x1ab0,
0x1248, 0x2a24, 0x366c, 0x0600, 0x1e90,
0x1348, 0x2b24, 0x376c, 0x0700, 0x1f90,
0x1448, 0x2c24, 0x386c, 0x0800, 0x2090,
0x144c, 0x2c28, 0x3870, 0x0804, 0x2094,
0x134c, 0x2b28, 0x3770, 0x0704, 0x1f94,
0x124c, 0x2a28, 0x3670, 0x0604, 0x1e94,
0x1250, 0x2a2c, 0x3674, 0x0608, 0x1e98,
0x1350, 0x2b2c, 0x3774, 0x0708, 0x1f98,
0x1450, 0x2c2c, 0x3874, 0x0808, 0x2098,
0x1454, 0x2c30, 0x3878, 0x080c, 0x209c,
0x1354, 0x2b30, 0x3778, 0x070c, 0x1f9c,
0x1254, 0x2a30, 0x3678, 0x060c, 0x1e9c,
0x1258, 0x2a34, 0x367c, 0x0610, 0x1ea0,
0x1358, 0x2b34, 0x377c, 0x0710, 0x1fa0,
0x1458, 0x2c34, 0x387c, 0x0810, 0x20a0,
0x145c, 0x2c38, 0x3880, 0x0814, 0x20a4,
0x135c, 0x2b38, 0x3780, 0x0714, 0x1fa4,
0x125c, 0x2a38, 0x3680, 0x0614, 0x1ea4,
0x1260, 0x2a3c, 0x3684, 0x0618, 0x1ea8,
0x1360, 0x2b3c, 0x3784, 0x0718, 0x1fa8,
0x1460, 0x2c3c, 0x3884, 0x0818, 0x20a8,
0x1464, 0x2c40, 0x3888, 0x081c, 0x20ac,
0x1364, 0x2b40, 0x3788, 0x071c, 0x1fac,
0x1264, 0x2a40, 0x3688, 0x061c, 0x1eac,
0x1268, 0x2a44, 0x368c, 0x0620, 0x1eb0,
0x1368, 0x2b44, 0x378c, 0x0720, 0x1fb0,
0x1468, 0x2c44, 0x388c, 0x0820, 0x20b0,
0x1848, 0x3024, 0x006c, 0x0c00, 0x2490,
0x1948, 0x3124, 0x016c, 0x0d00, 0x2590,
0x1a48, 0x3224, 0x026c, 0x0e00, 0x2690,
0x1a4c, 0x3228, 0x0270, 0x0e04, 0x2694,
0x194c, 0x3128, 0x0170, 0x0d04, 0x2594,
0x184c, 0x3028, 0x0070, 0x0c04, 0x2494,
0x1850, 0x302c, 0x0074, 0x0c08, 0x2498,
0x1950, 0x312c, 0x0174, 0x0d08, 0x2598,
0x1a50, 0x322c, 0x0274, 0x0e08, 0x2698,
0x1a54, 0x3230, 0x0278, 0x0e0c, 0x269c,
0x1954, 0x3130, 0x0178, 0x0d0c, 0x259c,
0x1854, 0x3030, 0x0078, 0x0c0c, 0x249c,
0x1858, 0x3034, 0x007c, 0x0c10, 0x24a0,
0x1958, 0x3134, 0x017c, 0x0d10, 0x25a0,
0x1a58, 0x3234, 0x027c, 0x0e10, 0x26a0,
0x1a5c, 0x3238, 0x0280, 0x0e14, 0x26a4,
0x195c, 0x3138, 0x0180, 0x0d14, 0x25a4,
0x185c, 0x3038, 0x0080, 0x0c14, 0x24a4,
0x1860, 0x303c, 0x0084, 0x0c18, 0x24a8,
0x1960, 0x313c, 0x0184, 0x0d18, 0x25a8,
0x1a60, 0x323c, 0x0284, 0x0e18, 0x26a8,
0x1a64, 0x3240, 0x0288, 0x0e1c, 0x26ac,
0x1964, 0x3140, 0x0188, 0x0d1c, 0x25ac,
0x1864, 0x3040, 0x0088, 0x0c1c, 0x24ac,
0x1868, 0x3044, 0x008c, 0x0c20, 0x24b0,
0x1968, 0x3144, 0x018c, 0x0d20, 0x25b0,
0x1a68, 0x3244, 0x028c, 0x0e20, 0x26b0,
0x1e48, 0x3624, 0x066c, 0x1200, 0x2a90,
0x1f48, 0x3724, 0x076c, 0x1300, 0x2b90,
0x2048, 0x3824, 0x086c, 0x1400, 0x2c90,
0x204c, 0x3828, 0x0870, 0x1404, 0x2c94,
0x1f4c, 0x3728, 0x0770, 0x1304, 0x2b94,
0x1e4c, 0x3628, 0x0670, 0x1204, 0x2a94,
0x1e50, 0x362c, 0x0674, 0x1208, 0x2a98,
0x1f50, 0x372c, 0x0774, 0x1308, 0x2b98,
0x2050, 0x382c, 0x0874, 0x1408, 0x2c98,
0x2054, 0x3830, 0x0878, 0x140c, 0x2c9c,
0x1f54, 0x3730, 0x0778, 0x130c, 0x2b9c,
0x1e54, 0x3630, 0x0678, 0x120c, 0x2a9c,
0x1e58, 0x3634, 0x067c, 0x1210, 0x2aa0,
0x1f58, 0x3734, 0x077c, 0x1310, 0x2ba0,
0x2058, 0x3834, 0x087c, 0x1410, 0x2ca0,
0x205c, 0x3838, 0x0880, 0x1414, 0x2ca4,
0x1f5c, 0x3738, 0x0780, 0x1314, 0x2ba4,
0x1e5c, 0x3638, 0x0680, 0x1214, 0x2aa4,
0x1e60, 0x363c, 0x0684, 0x1218, 0x2aa8,
0x1f60, 0x373c, 0x0784, 0x1318, 0x2ba8,
0x2060, 0x383c, 0x0884, 0x1418, 0x2ca8,
0x2064, 0x3840, 0x0888, 0x141c, 0x2cac,
0x1f64, 0x3740, 0x0788, 0x131c, 0x2bac,
0x1e64, 0x3640, 0x0688, 0x121c, 0x2aac,
0x1e68, 0x3644, 0x068c, 0x1220, 0x2ab0,
0x1f68, 0x3744, 0x078c, 0x1320, 0x2bb0,
0x2068, 0x3844, 0x088c, 0x1420, 0x2cb0,
0x2448, 0x0024, 0x0c6c, 0x1800, 0x3090,
0x2548, 0x0124, 0x0d6c, 0x1900, 0x3190,
0x2648, 0x0224, 0x0e6c, 0x1a00, 0x3290,
0x264c, 0x0228, 0x0e70, 0x1a04, 0x3294,
0x254c, 0x0128, 0x0d70, 0x1904, 0x3194,
0x244c, 0x0028, 0x0c70, 0x1804, 0x3094,
0x2450, 0x002c, 0x0c74, 0x1808, 0x3098,
0x2550, 0x012c, 0x0d74, 0x1908, 0x3198,
0x2650, 0x022c, 0x0e74, 0x1a08, 0x3298,
0x2654, 0x0230, 0x0e78, 0x1a0c, 0x329c,
0x2554, 0x0130, 0x0d78, 0x190c, 0x319c,
0x2454, 0x0030, 0x0c78, 0x180c, 0x309c,
0x2458, 0x0034, 0x0c7c, 0x1810, 0x30a0,
0x2558, 0x0134, 0x0d7c, 0x1910, 0x31a0,
0x2658, 0x0234, 0x0e7c, 0x1a10, 0x32a0,
0x265c, 0x0238, 0x0e80, 0x1a14, 0x32a4,
0x255c, 0x0138, 0x0d80, 0x1914, 0x31a4,
0x245c, 0x0038, 0x0c80, 0x1814, 0x30a4,
0x2460, 0x003c, 0x0c84, 0x1818, 0x30a8,
0x2560, 0x013c, 0x0d84, 0x1918, 0x31a8,
0x2660, 0x023c, 0x0e84, 0x1a18, 0x32a8,
0x2664, 0x0240, 0x0e88, 0x1a1c, 0x32ac,
0x2564, 0x0140, 0x0d88, 0x191c, 0x31ac,
0x2464, 0x0040, 0x0c88, 0x181c, 0x30ac,
0x2468, 0x0044, 0x0c8c, 0x1820, 0x30b0,
0x2568, 0x0144, 0x0d8c, 0x1920, 0x31b0,
0x2668, 0x0244, 0x0e8c, 0x1a20, 0x32b0,
0x2a48, 0x0624, 0x126c, 0x1e00, 0x3690,
0x2b48, 0x0724, 0x136c, 0x1f00, 0x3790,
0x2c48, 0x0824, 0x146c, 0x2000, 0x3890,
0x2c4c, 0x0828, 0x1470, 0x2004, 0x3894,
0x2b4c, 0x0728, 0x1370, 0x1f04, 0x3794,
0x2a4c, 0x0628, 0x1270, 0x1e04, 0x3694,
0x2a50, 0x062c, 0x1274, 0x1e08, 0x3698,
0x2b50, 0x072c, 0x1374, 0x1f08, 0x3798,
0x2c50, 0x082c, 0x1474, 0x2008, 0x3898,
0x2c54, 0x0830, 0x1478, 0x200c, 0x389c,
0x2b54, 0x0730, 0x1378, 0x1f0c, 0x379c,
0x2a54, 0x0630, 0x1278, 0x1e0c, 0x369c,
0x2a58, 0x0634, 0x127c, 0x1e10, 0x36a0,
0x2b58, 0x0734, 0x137c, 0x1f10, 0x37a0,
0x2c58, 0x0834, 0x147c, 0x2010, 0x38a0,
0x2c5c, 0x0838, 0x1480, 0x2014, 0x38a4,
0x2b5c, 0x0738, 0x1380, 0x1f14, 0x37a4,
0x2a5c, 0x0638, 0x1280, 0x1e14, 0x36a4,
0x2a60, 0x063c, 0x1284, 0x1e18, 0x36a8,
0x2b60, 0x073c, 0x1384, 0x1f18, 0x37a8,
0x2c60, 0x083c, 0x1484, 0x2018, 0x38a8,
0x2c64, 0x0840, 0x1488, 0x201c, 0x38ac,
0x2b64, 0x0740, 0x1388, 0x1f1c, 0x37ac,
0x2a64, 0x0640, 0x1288, 0x1e1c, 0x36ac,
0x2a68, 0x0644, 0x128c, 0x1e20, 0x36b0,
0x2b68, 0x0744, 0x138c, 0x1f20, 0x37b0,
0x2c68, 0x0844, 0x148c, 0x2020, 0x38b0,
0x3048, 0x0c24, 0x186c, 0x2400, 0x0090,
0x3148, 0x0d24, 0x196c, 0x2500, 0x0190,
0x3248, 0x0e24, 0x1a6c, 0x2600, 0x0290,
0x324c, 0x0e28, 0x1a70, 0x2604, 0x0294,
0x314c, 0x0d28, 0x1970, 0x2504, 0x0194,
0x304c, 0x0c28, 0x1870, 0x2404, 0x0094,
0x3050, 0x0c2c, 0x1874, 0x2408, 0x0098,
0x3150, 0x0d2c, 0x1974, 0x2508, 0x0198,
0x3250, 0x0e2c, 0x1a74, 0x2608, 0x0298,
0x3254, 0x0e30, 0x1a78, 0x260c, 0x029c,
0x3154, 0x0d30, 0x1978, 0x250c, 0x019c,
0x3054, 0x0c30, 0x1878, 0x240c, 0x009c,
0x3058, 0x0c34, 0x187c, 0x2410, 0x00a0,
0x3158, 0x0d34, 0x197c, 0x2510, 0x01a0,
0x3258, 0x0e34, 0x1a7c, 0x2610, 0x02a0,
0x325c, 0x0e38, 0x1a80, 0x2614, 0x02a4,
0x315c, 0x0d38, 0x1980, 0x2514, 0x01a4,
0x305c, 0x0c38, 0x1880, 0x2414, 0x00a4,
0x3060, 0x0c3c, 0x1884, 0x2418, 0x00a8,
0x3160, 0x0d3c, 0x1984, 0x2518, 0x01a8,
0x3260, 0x0e3c, 0x1a84, 0x2618, 0x02a8,
0x3264, 0x0e40, 0x1a88, 0x261c, 0x02ac,
0x3164, 0x0d40, 0x1988, 0x251c, 0x01ac,
0x3064, 0x0c40, 0x1888, 0x241c, 0x00ac,
0x3068, 0x0c44, 0x188c, 0x2420, 0x00b0,
0x3168, 0x0d44, 0x198c, 0x2520, 0x01b0,
0x3268, 0x0e44, 0x1a8c, 0x2620, 0x02b0,
0x3648, 0x1224, 0x1e6c, 0x2a00, 0x0690,
0x3748, 0x1324, 0x1f6c, 0x2b00, 0x0790,
0x3848, 0x1424, 0x206c, 0x2c00, 0x0890,
0x384c, 0x1428, 0x2070, 0x2c04, 0x0894,
0x374c, 0x1328, 0x1f70, 0x2b04, 0x0794,
0x364c, 0x1228, 0x1e70, 0x2a04, 0x0694,
0x3650, 0x122c, 0x1e74, 0x2a08, 0x0698,
0x3750, 0x132c, 0x1f74, 0x2b08, 0x0798,
0x3850, 0x142c, 0x2074, 0x2c08, 0x0898,
0x3854, 0x1430, 0x2078, 0x2c0c, 0x089c,
0x3754, 0x1330, 0x1f78, 0x2b0c, 0x079c,
0x3654, 0x1230, 0x1e78, 0x2a0c, 0x069c,
0x3658, 0x1234, 0x1e7c, 0x2a10, 0x06a0,
0x3758, 0x1334, 0x1f7c, 0x2b10, 0x07a0,
0x3858, 0x1434, 0x207c, 0x2c10, 0x08a0,
0x385c, 0x1438, 0x2080, 0x2c14, 0x08a4,
0x375c, 0x1338, 0x1f80, 0x2b14, 0x07a4,
0x365c, 0x1238, 0x1e80, 0x2a14, 0x06a4,
0x3660, 0x123c, 0x1e84, 0x2a18, 0x06a8,
0x3760, 0x133c, 0x1f84, 0x2b18, 0x07a8,
0x3860, 0x143c, 0x2084, 0x2c18, 0x08a8,
0x3864, 0x1440, 0x2088, 0x2c1c, 0x08ac,
0x3764, 0x1340, 0x1f88, 0x2b1c, 0x07ac,
0x3664, 0x1240, 0x1e88, 0x2a1c, 0x06ac,
0x3668, 0x1244, 0x1e8c, 0x2a20, 0x06b0,
0x3768, 0x1344, 0x1f8c, 0x2b20, 0x07b0,
0x3868, 0x1444, 0x208c, 0x2c20, 0x08b0,
0x0048, 0x1824, 0x246c, 0x3000, 0x0c90,
0x0148, 0x1924, 0x256c, 0x3100, 0x0d90,
0x0248, 0x1a24, 0x266c, 0x3200, 0x0e90,
0x024c, 0x1a28, 0x2670, 0x3204, 0x0e94,
0x014c, 0x1928, 0x2570, 0x3104, 0x0d94,
0x004c, 0x1828, 0x2470, 0x3004, 0x0c94,
0x0050, 0x182c, 0x2474, 0x3008, 0x0c98,
0x0150, 0x192c, 0x2574, 0x3108, 0x0d98,
0x0250, 0x1a2c, 0x2674, 0x3208, 0x0e98,
0x0254, 0x1a30, 0x2678, 0x320c, 0x0e9c,
0x0154, 0x1930, 0x2578, 0x310c, 0x0d9c,
0x0054, 0x1830, 0x2478, 0x300c, 0x0c9c,
0x0058, 0x1834, 0x247c, 0x3010, 0x0ca0,
0x0158, 0x1934, 0x257c, 0x3110, 0x0da0,
0x0258, 0x1a34, 0x267c, 0x3210, 0x0ea0,
0x025c, 0x1a38, 0x2680, 0x3214, 0x0ea4,
0x015c, 0x1938, 0x2580, 0x3114, 0x0da4,
0x005c, 0x1838, 0x2480, 0x3014, 0x0ca4,
0x0060, 0x183c, 0x2484, 0x3018, 0x0ca8,
0x0160, 0x193c, 0x2584, 0x3118, 0x0da8,
0x0260, 0x1a3c, 0x2684, 0x3218, 0x0ea8,
0x0264, 0x1a40, 0x2688, 0x321c, 0x0eac,
0x0164, 0x1940, 0x2588, 0x311c, 0x0dac,
0x0064, 0x1840, 0x2488, 0x301c, 0x0cac,
0x0068, 0x1844, 0x248c, 0x3020, 0x0cb0,
0x0168, 0x1944, 0x258c, 0x3120, 0x0db0,
0x0268, 0x1a44, 0x268c, 0x3220, 0x0eb0,
0x0648, 0x1e24, 0x2a6c, 0x3600, 0x1290,
0x0748, 0x1f24, 0x2b6c, 0x3700, 0x1390,
0x0848, 0x2024, 0x2c6c, 0x3800, 0x1490,
0x084c, 0x2028, 0x2c70, 0x3804, 0x1494,
0x074c, 0x1f28, 0x2b70, 0x3704, 0x1394,
0x064c, 0x1e28, 0x2a70, 0x3604, 0x1294,
0x0650, 0x1e2c, 0x2a74, 0x3608, 0x1298,
0x0750, 0x1f2c, 0x2b74, 0x3708, 0x1398,
0x0850, 0x202c, 0x2c74, 0x3808, 0x1498,
0x0854, 0x2030, 0x2c78, 0x380c, 0x149c,
0x0754, 0x1f30, 0x2b78, 0x370c, 0x139c,
0x0654, 0x1e30, 0x2a78, 0x360c, 0x129c,
0x0658, 0x1e34, 0x2a7c, 0x3610, 0x12a0,
0x0758, 0x1f34, 0x2b7c, 0x3710, 0x13a0,
0x0858, 0x2034, 0x2c7c, 0x3810, 0x14a0,
0x085c, 0x2038, 0x2c80, 0x3814, 0x14a4,
0x075c, 0x1f38, 0x2b80, 0x3714, 0x13a4,
0x065c, 0x1e38, 0x2a80, 0x3614, 0x12a4,
0x0660, 0x1e3c, 0x2a84, 0x3618, 0x12a8,
0x0760, 0x1f3c, 0x2b84, 0x3718, 0x13a8,
0x0860, 0x203c, 0x2c84, 0x3818, 0x14a8,
0x0864, 0x2040, 0x2c88, 0x381c, 0x14ac,
0x0764, 0x1f40, 0x2b88, 0x371c, 0x13ac,
0x0664, 0x1e40, 0x2a88, 0x361c, 0x12ac,
0x0668, 0x1e44, 0x2a8c, 0x3620, 0x12b0,
0x0768, 0x1f44, 0x2b8c, 0x3720, 0x13b0,
0x0868, 0x2044, 0x2c8c, 0x3820, 0x14b0,
0x0f48, 0x2724, 0x336c, 0x0300, 0x1b90,
0x1048, 0x2824, 0x346c, 0x0400, 0x1c90,
0x1148, 0x2924, 0x356c, 0x0500, 0x1d90,
0x114c, 0x2928, 0x3570, 0x0504, 0x1d94,
0x104c, 0x2828, 0x3470, 0x0404, 0x1c94,
0x0f4c, 0x2728, 0x3370, 0x0304, 0x1b94,
0x0f50, 0x272c, 0x3374, 0x0308, 0x1b98,
0x1050, 0x282c, 0x3474, 0x0408, 0x1c98,
0x1150, 0x292c, 0x3574, 0x0508, 0x1d98,
0x1154, 0x2930, 0x3578, 0x050c, 0x1d9c,
0x1054, 0x2830, 0x3478, 0x040c, 0x1c9c,
0x0f54, 0x2730, 0x3378, 0x030c, 0x1b9c,
0x0f58, 0x2734, 0x337c, 0x0310, 0x1ba0,
0x1058, 0x2834, 0x347c, 0x0410, 0x1ca0,
0x1158, 0x2934, 0x357c, 0x0510, 0x1da0,
0x115c, 0x2938, 0x3580, 0x0514, 0x1da4,
0x105c, 0x2838, 0x3480, 0x0414, 0x1ca4,
0x0f5c, 0x2738, 0x3380, 0x0314, 0x1ba4,
0x0f60, 0x273c, 0x3384, 0x0318, 0x1ba8,
0x1060, 0x283c, 0x3484, 0x0418, 0x1ca8,
0x1160, 0x293c, 0x3584, 0x0518, 0x1da8,
0x1164, 0x2940, 0x3588, 0x051c, 0x1dac,
0x1064, 0x2840, 0x3488, 0x041c, 0x1cac,
0x0f64, 0x2740, 0x3388, 0x031c, 0x1bac,
0x0f68, 0x2744, 0x338c, 0x0320, 0x1bb0,
0x1068, 0x2844, 0x348c, 0x0420, 0x1cb0,
0x1168, 0x2944, 0x358c, 0x0520, 0x1db0,
0x1548, 0x2d24, 0x396c, 0x0900, 0x2190,
0x1648, 0x2e24, 0x3a6c, 0x0a00, 0x2290,
0x1748, 0x2f24, 0x3b6c, 0x0b00, 0x2390,
0x174c, 0x2f28, 0x3b70, 0x0b04, 0x2394,
0x164c, 0x2e28, 0x3a70, 0x0a04, 0x2294,
0x154c, 0x2d28, 0x3970, 0x0904, 0x2194,
0x1550, 0x2d2c, 0x3974, 0x0908, 0x2198,
0x1650, 0x2e2c, 0x3a74, 0x0a08, 0x2298,
0x1750, 0x2f2c, 0x3b74, 0x0b08, 0x2398,
0x1754, 0x2f30, 0x3b78, 0x0b0c, 0x239c,
0x1654, 0x2e30, 0x3a78, 0x0a0c, 0x229c,
0x1554, 0x2d30, 0x3978, 0x090c, 0x219c,
0x1558, 0x2d34, 0x397c, 0x0910, 0x21a0,
0x1658, 0x2e34, 0x3a7c, 0x0a10, 0x22a0,
0x1758, 0x2f34, 0x3b7c, 0x0b10, 0x23a0,
0x175c, 0x2f38, 0x3b80, 0x0b14, 0x23a4,
0x165c, 0x2e38, 0x3a80, 0x0a14, 0x22a4,
0x155c, 0x2d38, 0x3980, 0x0914, 0x21a4,
0x1560, 0x2d3c, 0x3984, 0x0918, 0x21a8,
0x1660, 0x2e3c, 0x3a84, 0x0a18, 0x22a8,
0x1760, 0x2f3c, 0x3b84, 0x0b18, 0x23a8,
0x1764, 0x2f40, 0x3b88, 0x0b1c, 0x23ac,
0x1664, 0x2e40, 0x3a88, 0x0a1c, 0x22ac,
0x1564, 0x2d40, 0x3988, 0x091c, 0x21ac,
0x1568, 0x2d44, 0x398c, 0x0920, 0x21b0,
0x1668, 0x2e44, 0x3a8c, 0x0a20, 0x22b0,
0x1768, 0x2f44, 0x3b8c, 0x0b20, 0x23b0,
0x1b48, 0x3324, 0x036c, 0x0f00, 0x2790,
0x1c48, 0x3424, 0x046c, 0x1000, 0x2890,
0x1d48, 0x3524, 0x056c, 0x1100, 0x2990,
0x1d4c, 0x3528, 0x0570, 0x1104, 0x2994,
0x1c4c, 0x3428, 0x0470, 0x1004, 0x2894,
0x1b4c, 0x3328, 0x0370, 0x0f04, 0x2794,
0x1b50, 0x332c, 0x0374, 0x0f08, 0x2798,
0x1c50, 0x342c, 0x0474, 0x1008, 0x2898,
0x1d50, 0x352c, 0x0574, 0x1108, 0x2998,
0x1d54, 0x3530, 0x0578, 0x110c, 0x299c,
0x1c54, 0x3430, 0x0478, 0x100c, 0x289c,
0x1b54, 0x3330, 0x0378, 0x0f0c, 0x279c,
0x1b58, 0x3334, 0x037c, 0x0f10, 0x27a0,
0x1c58, 0x3434, 0x047c, 0x1010, 0x28a0,
0x1d58, 0x3534, 0x057c, 0x1110, 0x29a0,
0x1d5c, 0x3538, 0x0580, 0x1114, 0x29a4,
0x1c5c, 0x3438, 0x0480, 0x1014, 0x28a4,
0x1b5c, 0x3338, 0x0380, 0x0f14, 0x27a4,
0x1b60, 0x333c, 0x0384, 0x0f18, 0x27a8,
0x1c60, 0x343c, 0x0484, 0x1018, 0x28a8,
0x1d60, 0x353c, 0x0584, 0x1118, 0x29a8,
0x1d64, 0x3540, 0x0588, 0x111c, 0x29ac,
0x1c64, 0x3440, 0x0488, 0x101c, 0x28ac,
0x1b64, 0x3340, 0x0388, 0x0f1c, 0x27ac,
0x1b68, 0x3344, 0x038c, 0x0f20, 0x27b0,
0x1c68, 0x3444, 0x048c, 0x1020, 0x28b0,
0x1d68, 0x3544, 0x058c, 0x1120, 0x29b0,
0x2148, 0x3924, 0x096c, 0x1500, 0x2d90,
0x2248, 0x3a24, 0x0a6c, 0x1600, 0x2e90,
0x2348, 0x3b24, 0x0b6c, 0x1700, 0x2f90,
0x234c, 0x3b28, 0x0b70, 0x1704, 0x2f94,
0x224c, 0x3a28, 0x0a70, 0x1604, 0x2e94,
0x214c, 0x3928, 0x0970, 0x1504, 0x2d94,
0x2150, 0x392c, 0x0974, 0x1508, 0x2d98,
0x2250, 0x3a2c, 0x0a74, 0x1608, 0x2e98,
0x2350, 0x3b2c, 0x0b74, 0x1708, 0x2f98,
0x2354, 0x3b30, 0x0b78, 0x170c, 0x2f9c,
0x2254, 0x3a30, 0x0a78, 0x160c, 0x2e9c,
0x2154, 0x3930, 0x0978, 0x150c, 0x2d9c,
0x2158, 0x3934, 0x097c, 0x1510, 0x2da0,
0x2258, 0x3a34, 0x0a7c, 0x1610, 0x2ea0,
0x2358, 0x3b34, 0x0b7c, 0x1710, 0x2fa0,
0x235c, 0x3b38, 0x0b80, 0x1714, 0x2fa4,
0x225c, 0x3a38, 0x0a80, 0x1614, 0x2ea4,
0x215c, 0x3938, 0x0980, 0x1514, 0x2da4,
0x2160, 0x393c, 0x0984, 0x1518, 0x2da8,
0x2260, 0x3a3c, 0x0a84, 0x1618, 0x2ea8,
0x2360, 0x3b3c, 0x0b84, 0x1718, 0x2fa8,
0x2364, 0x3b40, 0x0b88, 0x171c, 0x2fac,
0x2264, 0x3a40, 0x0a88, 0x161c, 0x2eac,
0x2164, 0x3940, 0x0988, 0x151c, 0x2dac,
0x2168, 0x3944, 0x098c, 0x1520, 0x2db0,
0x2268, 0x3a44, 0x0a8c, 0x1620, 0x2eb0,
0x2368, 0x3b44, 0x0b8c, 0x1720, 0x2fb0,
0x2748, 0x0324, 0x0f6c, 0x1b00, 0x3390,
0x2848, 0x0424, 0x106c, 0x1c00, 0x3490,
0x2948, 0x0524, 0x116c, 0x1d00, 0x3590,
0x294c, 0x0528, 0x1170, 0x1d04, 0x3594,
0x284c, 0x0428, 0x1070, 0x1c04, 0x3494,
0x274c, 0x0328, 0x0f70, 0x1b04, 0x3394,
0x2750, 0x032c, 0x0f74, 0x1b08, 0x3398,
0x2850, 0x042c, 0x1074, 0x1c08, 0x3498,
0x2950, 0x052c, 0x1174, 0x1d08, 0x3598,
0x2954, 0x0530, 0x1178, 0x1d0c, 0x359c,
0x2854, 0x0430, 0x1078, 0x1c0c, 0x349c,
0x2754, 0x0330, 0x0f78, 0x1b0c, 0x339c,
0x2758, 0x0334, 0x0f7c, 0x1b10, 0x33a0,
0x2858, 0x0434, 0x107c, 0x1c10, 0x34a0,
0x2958, 0x0534, 0x117c, 0x1d10, 0x35a0,
0x295c, 0x0538, 0x1180, 0x1d14, 0x35a4,
0x285c, 0x0438, 0x1080, 0x1c14, 0x34a4,
0x275c, 0x0338, 0x0f80, 0x1b14, 0x33a4,
0x2760, 0x033c, 0x0f84, 0x1b18, 0x33a8,
0x2860, 0x043c, 0x1084, 0x1c18, 0x34a8,
0x2960, 0x053c, 0x1184, 0x1d18, 0x35a8,
0x2964, 0x0540, 0x1188, 0x1d1c, 0x35ac,
0x2864, 0x0440, 0x1088, 0x1c1c, 0x34ac,
0x2764, 0x0340, 0x0f88, 0x1b1c, 0x33ac,
0x2768, 0x0344, 0x0f8c, 0x1b20, 0x33b0,
0x2868, 0x0444, 0x108c, 0x1c20, 0x34b0,
0x2968, 0x0544, 0x118c, 0x1d20, 0x35b0,
0x2d48, 0x0924, 0x156c, 0x2100, 0x3990,
0x2e48, 0x0a24, 0x166c, 0x2200, 0x3a90,
0x2f48, 0x0b24, 0x176c, 0x2300, 0x3b90,
0x2f4c, 0x0b28, 0x1770, 0x2304, 0x3b94,
0x2e4c, 0x0a28, 0x1670, 0x2204, 0x3a94,
0x2d4c, 0x0928, 0x1570, 0x2104, 0x3994,
0x2d50, 0x092c, 0x1574, 0x2108, 0x3998,
0x2e50, 0x0a2c, 0x1674, 0x2208, 0x3a98,
0x2f50, 0x0b2c, 0x1774, 0x2308, 0x3b98,
0x2f54, 0x0b30, 0x1778, 0x230c, 0x3b9c,
0x2e54, 0x0a30, 0x1678, 0x220c, 0x3a9c,
0x2d54, 0x0930, 0x1578, 0x210c, 0x399c,
0x2d58, 0x0934, 0x157c, 0x2110, 0x39a0,
0x2e58, 0x0a34, 0x167c, 0x2210, 0x3aa0,
0x2f58, 0x0b34, 0x177c, 0x2310, 0x3ba0,
0x2f5c, 0x0b38, 0x1780, 0x2314, 0x3ba4,
0x2e5c, 0x0a38, 0x1680, 0x2214, 0x3aa4,
0x2d5c, 0x0938, 0x1580, 0x2114, 0x39a4,
0x2d60, 0x093c, 0x1584, 0x2118, 0x39a8,
0x2e60, 0x0a3c, 0x1684, 0x2218, 0x3aa8,
0x2f60, 0x0b3c, 0x1784, 0x2318, 0x3ba8,
0x2f64, 0x0b40, 0x1788, 0x231c, 0x3bac,
0x2e64, 0x0a40, 0x1688, 0x221c, 0x3aac,
0x2d64, 0x0940, 0x1588, 0x211c, 0x39ac,
0x2d68, 0x0944, 0x158c, 0x2120, 0x39b0,
0x2e68, 0x0a44, 0x168c, 0x2220, 0x3ab0,
0x2f68, 0x0b44, 0x178c, 0x2320, 0x3bb0,
0x3348, 0x0f24, 0x1b6c, 0x2700, 0x0390,
0x3448, 0x1024, 0x1c6c, 0x2800, 0x0490,
0x3548, 0x1124, 0x1d6c, 0x2900, 0x0590,
0x354c, 0x1128, 0x1d70, 0x2904, 0x0594,
0x344c, 0x1028, 0x1c70, 0x2804, 0x0494,
0x334c, 0x0f28, 0x1b70, 0x2704, 0x0394,
0x3350, 0x0f2c, 0x1b74, 0x2708, 0x0398,
0x3450, 0x102c, 0x1c74, 0x2808, 0x0498,
0x3550, 0x112c, 0x1d74, 0x2908, 0x0598,
0x3554, 0x1130, 0x1d78, 0x290c, 0x059c,
0x3454, 0x1030, 0x1c78, 0x280c, 0x049c,
0x3354, 0x0f30, 0x1b78, 0x270c, 0x039c,
0x3358, 0x0f34, 0x1b7c, 0x2710, 0x03a0,
0x3458, 0x1034, 0x1c7c, 0x2810, 0x04a0,
0x3558, 0x1134, 0x1d7c, 0x2910, 0x05a0,
0x355c, 0x1138, 0x1d80, 0x2914, 0x05a4,
0x345c, 0x1038, 0x1c80, 0x2814, 0x04a4,
0x335c, 0x0f38, 0x1b80, 0x2714, 0x03a4,
0x3360, 0x0f3c, 0x1b84, 0x2718, 0x03a8,
0x3460, 0x103c, 0x1c84, 0x2818, 0x04a8,
0x3560, 0x113c, 0x1d84, 0x2918, 0x05a8,
0x3564, 0x1140, 0x1d88, 0x291c, 0x05ac,
0x3464, 0x1040, 0x1c88, 0x281c, 0x04ac,
0x3364, 0x0f40, 0x1b88, 0x271c, 0x03ac,
0x3368, 0x0f44, 0x1b8c, 0x2720, 0x03b0,
0x3468, 0x1044, 0x1c8c, 0x2820, 0x04b0,
0x3568, 0x1144, 0x1d8c, 0x2920, 0x05b0,
0x3948, 0x1524, 0x216c, 0x2d00, 0x0990,
0x3a48, 0x1624, 0x226c, 0x2e00, 0x0a90,
0x3b48, 0x1724, 0x236c, 0x2f00, 0x0b90,
0x3b4c, 0x1728, 0x2370, 0x2f04, 0x0b94,
0x3a4c, 0x1628, 0x2270, 0x2e04, 0x0a94,
0x394c, 0x1528, 0x2170, 0x2d04, 0x0994,
0x3950, 0x152c, 0x2174, 0x2d08, 0x0998,
0x3a50, 0x162c, 0x2274, 0x2e08, 0x0a98,
0x3b50, 0x172c, 0x2374, 0x2f08, 0x0b98,
0x3b54, 0x1730, 0x2378, 0x2f0c, 0x0b9c,
0x3a54, 0x1630, 0x2278, 0x2e0c, 0x0a9c,
0x3954, 0x1530, 0x2178, 0x2d0c, 0x099c,
0x3958, 0x1534, 0x217c, 0x2d10, 0x09a0,
0x3a58, 0x1634, 0x227c, 0x2e10, 0x0aa0,
0x3b58, 0x1734, 0x237c, 0x2f10, 0x0ba0,
0x3b5c, 0x1738, 0x2380, 0x2f14, 0x0ba4,
0x3a5c, 0x1638, 0x2280, 0x2e14, 0x0aa4,
0x395c, 0x1538, 0x2180, 0x2d14, 0x09a4,
0x3960, 0x153c, 0x2184, 0x2d18, 0x09a8,
0x3a60, 0x163c, 0x2284, 0x2e18, 0x0aa8,
0x3b60, 0x173c, 0x2384, 0x2f18, 0x0ba8,
0x3b64, 0x1740, 0x2388, 0x2f1c, 0x0bac,
0x3a64, 0x1640, 0x2288, 0x2e1c, 0x0aac,
0x3964, 0x1540, 0x2188, 0x2d1c, 0x09ac,
0x3968, 0x1544, 0x218c, 0x2d20, 0x09b0,
0x3a68, 0x1644, 0x228c, 0x2e20, 0x0ab0,
0x3b68, 0x1744, 0x238c, 0x2f20, 0x0bb0,
0x0348, 0x1b24, 0x276c, 0x3300, 0x0f90,
0x0448, 0x1c24, 0x286c, 0x3400, 0x1090,
0x0548, 0x1d24, 0x296c, 0x3500, 0x1190,
0x054c, 0x1d28, 0x2970, 0x3504, 0x1194,
0x044c, 0x1c28, 0x2870, 0x3404, 0x1094,
0x034c, 0x1b28, 0x2770, 0x3304, 0x0f94,
0x0350, 0x1b2c, 0x2774, 0x3308, 0x0f98,
0x0450, 0x1c2c, 0x2874, 0x3408, 0x1098,
0x0550, 0x1d2c, 0x2974, 0x3508, 0x1198,
0x0554, 0x1d30, 0x2978, 0x350c, 0x119c,
0x0454, 0x1c30, 0x2878, 0x340c, 0x109c,
0x0354, 0x1b30, 0x2778, 0x330c, 0x0f9c,
0x0358, 0x1b34, 0x277c, 0x3310, 0x0fa0,
0x0458, 0x1c34, 0x287c, 0x3410, 0x10a0,
0x0558, 0x1d34, 0x297c, 0x3510, 0x11a0,
0x055c, 0x1d38, 0x2980, 0x3514, 0x11a4,
0x045c, 0x1c38, 0x2880, 0x3414, 0x10a4,
0x035c, 0x1b38, 0x2780, 0x3314, 0x0fa4,
0x0360, 0x1b3c, 0x2784, 0x3318, 0x0fa8,
0x0460, 0x1c3c, 0x2884, 0x3418, 0x10a8,
0x0560, 0x1d3c, 0x2984, 0x3518, 0x11a8,
0x0564, 0x1d40, 0x2988, 0x351c, 0x11ac,
0x0464, 0x1c40, 0x2888, 0x341c, 0x10ac,
0x0364, 0x1b40, 0x2788, 0x331c, 0x0fac,
0x0368, 0x1b44, 0x278c, 0x3320, 0x0fb0,
0x0468, 0x1c44, 0x288c, 0x3420, 0x10b0,
0x0568, 0x1d44, 0x298c, 0x3520, 0x11b0,
0x0948, 0x2124, 0x2d6c, 0x3900, 0x1590,
0x0a48, 0x2224, 0x2e6c, 0x3a00, 0x1690,
0x0b48, 0x2324, 0x2f6c, 0x3b00, 0x1790,
0x0b4c, 0x2328, 0x2f70, 0x3b04, 0x1794,
0x0a4c, 0x2228, 0x2e70, 0x3a04, 0x1694,
0x094c, 0x2128, 0x2d70, 0x3904, 0x1594,
0x0950, 0x212c, 0x2d74, 0x3908, 0x1598,
0x0a50, 0x222c, 0x2e74, 0x3a08, 0x1698,
0x0b50, 0x232c, 0x2f74, 0x3b08, 0x1798,
0x0b54, 0x2330, 0x2f78, 0x3b0c, 0x179c,
0x0a54, 0x2230, 0x2e78, 0x3a0c, 0x169c,
0x0954, 0x2130, 0x2d78, 0x390c, 0x159c,
0x0958, 0x2134, 0x2d7c, 0x3910, 0x15a0,
0x0a58, 0x2234, 0x2e7c, 0x3a10, 0x16a0,
0x0b58, 0x2334, 0x2f7c, 0x3b10, 0x17a0,
0x0b5c, 0x2338, 0x2f80, 0x3b14, 0x17a4,
0x0a5c, 0x2238, 0x2e80, 0x3a14, 0x16a4,
0x095c, 0x2138, 0x2d80, 0x3914, 0x15a4,
0x0960, 0x213c, 0x2d84, 0x3918, 0x15a8,
0x0a60, 0x223c, 0x2e84, 0x3a18, 0x16a8,
0x0b60, 0x233c, 0x2f84, 0x3b18, 0x17a8,
0x0b64, 0x2340, 0x2f88, 0x3b1c, 0x17ac,
0x0a64, 0x2240, 0x2e88, 0x3a1c, 0x16ac,
0x0964, 0x2140, 0x2d88, 0x391c, 0x15ac,
0x0968, 0x2144, 0x2d8c, 0x3920, 0x15b0,
0x0a68, 0x2244, 0x2e8c, 0x3a20, 0x16b0,
0x0b68, 0x2344, 0x2f8c, 0x3b20, 0x17b0,
};
/* 2 channels per frame, 12 DIF sequences per channel,
27 video segments per DIF sequence, 5 macroblocks per video segment */
static const uint16_t dv_place_422_625[2*12*27*5] = {
0x0c48, 0x2424, 0x306c, 0x0000, 0x1890,
0x0d48, 0x2524, 0x316c, 0x0100, 0x1990,
0x0e48, 0x2624, 0x326c, 0x0200, 0x1a90,
0x0e4c, 0x2628, 0x3270, 0x0204, 0x1a94,
0x0d4c, 0x2528, 0x3170, 0x0104, 0x1994,
0x0c4c, 0x2428, 0x3070, 0x0004, 0x1894,
0x0c50, 0x242c, 0x3074, 0x0008, 0x1898,
0x0d50, 0x252c, 0x3174, 0x0108, 0x1998,
0x0e50, 0x262c, 0x3274, 0x0208, 0x1a98,
0x0e54, 0x2630, 0x3278, 0x020c, 0x1a9c,
0x0d54, 0x2530, 0x3178, 0x010c, 0x199c,
0x0c54, 0x2430, 0x3078, 0x000c, 0x189c,
0x0c58, 0x2434, 0x307c, 0x0010, 0x18a0,
0x0d58, 0x2534, 0x317c, 0x0110, 0x19a0,
0x0e58, 0x2634, 0x327c, 0x0210, 0x1aa0,
0x0e5c, 0x2638, 0x3280, 0x0214, 0x1aa4,
0x0d5c, 0x2538, 0x3180, 0x0114, 0x19a4,
0x0c5c, 0x2438, 0x3080, 0x0014, 0x18a4,
0x0c60, 0x243c, 0x3084, 0x0018, 0x18a8,
0x0d60, 0x253c, 0x3184, 0x0118, 0x19a8,
0x0e60, 0x263c, 0x3284, 0x0218, 0x1aa8,
0x0e64, 0x2640, 0x3288, 0x021c, 0x1aac,
0x0d64, 0x2540, 0x3188, 0x011c, 0x19ac,
0x0c64, 0x2440, 0x3088, 0x001c, 0x18ac,
0x0c68, 0x2444, 0x308c, 0x0020, 0x18b0,
0x0d68, 0x2544, 0x318c, 0x0120, 0x19b0,
0x0e68, 0x2644, 0x328c, 0x0220, 0x1ab0,
0x1248, 0x2a24, 0x366c, 0x0600, 0x1e90,
0x1348, 0x2b24, 0x376c, 0x0700, 0x1f90,
0x1448, 0x2c24, 0x386c, 0x0800, 0x2090,
0x144c, 0x2c28, 0x3870, 0x0804, 0x2094,
0x134c, 0x2b28, 0x3770, 0x0704, 0x1f94,
0x124c, 0x2a28, 0x3670, 0x0604, 0x1e94,
0x1250, 0x2a2c, 0x3674, 0x0608, 0x1e98,
0x1350, 0x2b2c, 0x3774, 0x0708, 0x1f98,
0x1450, 0x2c2c, 0x3874, 0x0808, 0x2098,
0x1454, 0x2c30, 0x3878, 0x080c, 0x209c,
0x1354, 0x2b30, 0x3778, 0x070c, 0x1f9c,
0x1254, 0x2a30, 0x3678, 0x060c, 0x1e9c,
0x1258, 0x2a34, 0x367c, 0x0610, 0x1ea0,
0x1358, 0x2b34, 0x377c, 0x0710, 0x1fa0,
0x1458, 0x2c34, 0x387c, 0x0810, 0x20a0,
0x145c, 0x2c38, 0x3880, 0x0814, 0x20a4,
0x135c, 0x2b38, 0x3780, 0x0714, 0x1fa4,
0x125c, 0x2a38, 0x3680, 0x0614, 0x1ea4,
0x1260, 0x2a3c, 0x3684, 0x0618, 0x1ea8,
0x1360, 0x2b3c, 0x3784, 0x0718, 0x1fa8,
0x1460, 0x2c3c, 0x3884, 0x0818, 0x20a8,
0x1464, 0x2c40, 0x3888, 0x081c, 0x20ac,
0x1364, 0x2b40, 0x3788, 0x071c, 0x1fac,
0x1264, 0x2a40, 0x3688, 0x061c, 0x1eac,
0x1268, 0x2a44, 0x368c, 0x0620, 0x1eb0,
0x1368, 0x2b44, 0x378c, 0x0720, 0x1fb0,
0x1468, 0x2c44, 0x388c, 0x0820, 0x20b0,
0x1848, 0x3024, 0x3c6c, 0x0c00, 0x2490,
0x1948, 0x3124, 0x3d6c, 0x0d00, 0x2590,
0x1a48, 0x3224, 0x3e6c, 0x0e00, 0x2690,
0x1a4c, 0x3228, 0x3e70, 0x0e04, 0x2694,
0x194c, 0x3128, 0x3d70, 0x0d04, 0x2594,
0x184c, 0x3028, 0x3c70, 0x0c04, 0x2494,
0x1850, 0x302c, 0x3c74, 0x0c08, 0x2498,
0x1950, 0x312c, 0x3d74, 0x0d08, 0x2598,
0x1a50, 0x322c, 0x3e74, 0x0e08, 0x2698,
0x1a54, 0x3230, 0x3e78, 0x0e0c, 0x269c,
0x1954, 0x3130, 0x3d78, 0x0d0c, 0x259c,
0x1854, 0x3030, 0x3c78, 0x0c0c, 0x249c,
0x1858, 0x3034, 0x3c7c, 0x0c10, 0x24a0,
0x1958, 0x3134, 0x3d7c, 0x0d10, 0x25a0,
0x1a58, 0x3234, 0x3e7c, 0x0e10, 0x26a0,
0x1a5c, 0x3238, 0x3e80, 0x0e14, 0x26a4,
0x195c, 0x3138, 0x3d80, 0x0d14, 0x25a4,
0x185c, 0x3038, 0x3c80, 0x0c14, 0x24a4,
0x1860, 0x303c, 0x3c84, 0x0c18, 0x24a8,
0x1960, 0x313c, 0x3d84, 0x0d18, 0x25a8,
0x1a60, 0x323c, 0x3e84, 0x0e18, 0x26a8,
0x1a64, 0x3240, 0x3e88, 0x0e1c, 0x26ac,
0x1964, 0x3140, 0x3d88, 0x0d1c, 0x25ac,
0x1864, 0x3040, 0x3c88, 0x0c1c, 0x24ac,
0x1868, 0x3044, 0x3c8c, 0x0c20, 0x24b0,
0x1968, 0x3144, 0x3d8c, 0x0d20, 0x25b0,
0x1a68, 0x3244, 0x3e8c, 0x0e20, 0x26b0,
0x1e48, 0x3624, 0x426c, 0x1200, 0x2a90,
0x1f48, 0x3724, 0x436c, 0x1300, 0x2b90,
0x2048, 0x3824, 0x446c, 0x1400, 0x2c90,
0x204c, 0x3828, 0x4470, 0x1404, 0x2c94,
0x1f4c, 0x3728, 0x4370, 0x1304, 0x2b94,
0x1e4c, 0x3628, 0x4270, 0x1204, 0x2a94,
0x1e50, 0x362c, 0x4274, 0x1208, 0x2a98,
0x1f50, 0x372c, 0x4374, 0x1308, 0x2b98,
0x2050, 0x382c, 0x4474, 0x1408, 0x2c98,
0x2054, 0x3830, 0x4478, 0x140c, 0x2c9c,
0x1f54, 0x3730, 0x4378, 0x130c, 0x2b9c,
0x1e54, 0x3630, 0x4278, 0x120c, 0x2a9c,
0x1e58, 0x3634, 0x427c, 0x1210, 0x2aa0,
0x1f58, 0x3734, 0x437c, 0x1310, 0x2ba0,
0x2058, 0x3834, 0x447c, 0x1410, 0x2ca0,
0x205c, 0x3838, 0x4480, 0x1414, 0x2ca4,
0x1f5c, 0x3738, 0x4380, 0x1314, 0x2ba4,
0x1e5c, 0x3638, 0x4280, 0x1214, 0x2aa4,
0x1e60, 0x363c, 0x4284, 0x1218, 0x2aa8,
0x1f60, 0x373c, 0x4384, 0x1318, 0x2ba8,
0x2060, 0x383c, 0x4484, 0x1418, 0x2ca8,
0x2064, 0x3840, 0x4488, 0x141c, 0x2cac,
0x1f64, 0x3740, 0x4388, 0x131c, 0x2bac,
0x1e64, 0x3640, 0x4288, 0x121c, 0x2aac,
0x1e68, 0x3644, 0x428c, 0x1220, 0x2ab0,
0x1f68, 0x3744, 0x438c, 0x1320, 0x2bb0,
0x2068, 0x3844, 0x448c, 0x1420, 0x2cb0,
0x2448, 0x3c24, 0x006c, 0x1800, 0x3090,
0x2548, 0x3d24, 0x016c, 0x1900, 0x3190,
0x2648, 0x3e24, 0x026c, 0x1a00, 0x3290,
0x264c, 0x3e28, 0x0270, 0x1a04, 0x3294,
0x254c, 0x3d28, 0x0170, 0x1904, 0x3194,
0x244c, 0x3c28, 0x0070, 0x1804, 0x3094,
0x2450, 0x3c2c, 0x0074, 0x1808, 0x3098,
0x2550, 0x3d2c, 0x0174, 0x1908, 0x3198,
0x2650, 0x3e2c, 0x0274, 0x1a08, 0x3298,
0x2654, 0x3e30, 0x0278, 0x1a0c, 0x329c,
0x2554, 0x3d30, 0x0178, 0x190c, 0x319c,
0x2454, 0x3c30, 0x0078, 0x180c, 0x309c,
0x2458, 0x3c34, 0x007c, 0x1810, 0x30a0,
0x2558, 0x3d34, 0x017c, 0x1910, 0x31a0,
0x2658, 0x3e34, 0x027c, 0x1a10, 0x32a0,
0x265c, 0x3e38, 0x0280, 0x1a14, 0x32a4,
0x255c, 0x3d38, 0x0180, 0x1914, 0x31a4,
0x245c, 0x3c38, 0x0080, 0x1814, 0x30a4,
0x2460, 0x3c3c, 0x0084, 0x1818, 0x30a8,
0x2560, 0x3d3c, 0x0184, 0x1918, 0x31a8,
0x2660, 0x3e3c, 0x0284, 0x1a18, 0x32a8,
0x2664, 0x3e40, 0x0288, 0x1a1c, 0x32ac,
0x2564, 0x3d40, 0x0188, 0x191c, 0x31ac,
0x2464, 0x3c40, 0x0088, 0x181c, 0x30ac,
0x2468, 0x3c44, 0x008c, 0x1820, 0x30b0,
0x2568, 0x3d44, 0x018c, 0x1920, 0x31b0,
0x2668, 0x3e44, 0x028c, 0x1a20, 0x32b0,
0x2a48, 0x4224, 0x066c, 0x1e00, 0x3690,
0x2b48, 0x4324, 0x076c, 0x1f00, 0x3790,
0x2c48, 0x4424, 0x086c, 0x2000, 0x3890,
0x2c4c, 0x4428, 0x0870, 0x2004, 0x3894,
0x2b4c, 0x4328, 0x0770, 0x1f04, 0x3794,
0x2a4c, 0x4228, 0x0670, 0x1e04, 0x3694,
0x2a50, 0x422c, 0x0674, 0x1e08, 0x3698,
0x2b50, 0x432c, 0x0774, 0x1f08, 0x3798,
0x2c50, 0x442c, 0x0874, 0x2008, 0x3898,
0x2c54, 0x4430, 0x0878, 0x200c, 0x389c,
0x2b54, 0x4330, 0x0778, 0x1f0c, 0x379c,
0x2a54, 0x4230, 0x0678, 0x1e0c, 0x369c,
0x2a58, 0x4234, 0x067c, 0x1e10, 0x36a0,
0x2b58, 0x4334, 0x077c, 0x1f10, 0x37a0,
0x2c58, 0x4434, 0x087c, 0x2010, 0x38a0,
0x2c5c, 0x4438, 0x0880, 0x2014, 0x38a4,
0x2b5c, 0x4338, 0x0780, 0x1f14, 0x37a4,
0x2a5c, 0x4238, 0x0680, 0x1e14, 0x36a4,
0x2a60, 0x423c, 0x0684, 0x1e18, 0x36a8,
0x2b60, 0x433c, 0x0784, 0x1f18, 0x37a8,
0x2c60, 0x443c, 0x0884, 0x2018, 0x38a8,
0x2c64, 0x4440, 0x0888, 0x201c, 0x38ac,
0x2b64, 0x4340, 0x0788, 0x1f1c, 0x37ac,
0x2a64, 0x4240, 0x0688, 0x1e1c, 0x36ac,
0x2a68, 0x4244, 0x068c, 0x1e20, 0x36b0,
0x2b68, 0x4344, 0x078c, 0x1f20, 0x37b0,
0x2c68, 0x4444, 0x088c, 0x2020, 0x38b0,
0x3048, 0x0024, 0x0c6c, 0x2400, 0x3c90,
0x3148, 0x0124, 0x0d6c, 0x2500, 0x3d90,
0x3248, 0x0224, 0x0e6c, 0x2600, 0x3e90,
0x324c, 0x0228, 0x0e70, 0x2604, 0x3e94,
0x314c, 0x0128, 0x0d70, 0x2504, 0x3d94,
0x304c, 0x0028, 0x0c70, 0x2404, 0x3c94,
0x3050, 0x002c, 0x0c74, 0x2408, 0x3c98,
0x3150, 0x012c, 0x0d74, 0x2508, 0x3d98,
0x3250, 0x022c, 0x0e74, 0x2608, 0x3e98,
0x3254, 0x0230, 0x0e78, 0x260c, 0x3e9c,
0x3154, 0x0130, 0x0d78, 0x250c, 0x3d9c,
0x3054, 0x0030, 0x0c78, 0x240c, 0x3c9c,
0x3058, 0x0034, 0x0c7c, 0x2410, 0x3ca0,
0x3158, 0x0134, 0x0d7c, 0x2510, 0x3da0,
0x3258, 0x0234, 0x0e7c, 0x2610, 0x3ea0,
0x325c, 0x0238, 0x0e80, 0x2614, 0x3ea4,
0x315c, 0x0138, 0x0d80, 0x2514, 0x3da4,
0x305c, 0x0038, 0x0c80, 0x2414, 0x3ca4,
0x3060, 0x003c, 0x0c84, 0x2418, 0x3ca8,
0x3160, 0x013c, 0x0d84, 0x2518, 0x3da8,
0x3260, 0x023c, 0x0e84, 0x2618, 0x3ea8,
0x3264, 0x0240, 0x0e88, 0x261c, 0x3eac,
0x3164, 0x0140, 0x0d88, 0x251c, 0x3dac,
0x3064, 0x0040, 0x0c88, 0x241c, 0x3cac,
0x3068, 0x0044, 0x0c8c, 0x2420, 0x3cb0,
0x3168, 0x0144, 0x0d8c, 0x2520, 0x3db0,
0x3268, 0x0244, 0x0e8c, 0x2620, 0x3eb0,
0x3648, 0x0624, 0x126c, 0x2a00, 0x4290,
0x3748, 0x0724, 0x136c, 0x2b00, 0x4390,
0x3848, 0x0824, 0x146c, 0x2c00, 0x4490,
0x384c, 0x0828, 0x1470, 0x2c04, 0x4494,
0x374c, 0x0728, 0x1370, 0x2b04, 0x4394,
0x364c, 0x0628, 0x1270, 0x2a04, 0x4294,
0x3650, 0x062c, 0x1274, 0x2a08, 0x4298,
0x3750, 0x072c, 0x1374, 0x2b08, 0x4398,
0x3850, 0x082c, 0x1474, 0x2c08, 0x4498,
0x3854, 0x0830, 0x1478, 0x2c0c, 0x449c,
0x3754, 0x0730, 0x1378, 0x2b0c, 0x439c,
0x3654, 0x0630, 0x1278, 0x2a0c, 0x429c,
0x3658, 0x0634, 0x127c, 0x2a10, 0x42a0,
0x3758, 0x0734, 0x137c, 0x2b10, 0x43a0,
0x3858, 0x0834, 0x147c, 0x2c10, 0x44a0,
0x385c, 0x0838, 0x1480, 0x2c14, 0x44a4,
0x375c, 0x0738, 0x1380, 0x2b14, 0x43a4,
0x365c, 0x0638, 0x1280, 0x2a14, 0x42a4,
0x3660, 0x063c, 0x1284, 0x2a18, 0x42a8,
0x3760, 0x073c, 0x1384, 0x2b18, 0x43a8,
0x3860, 0x083c, 0x1484, 0x2c18, 0x44a8,
0x3864, 0x0840, 0x1488, 0x2c1c, 0x44ac,
0x3764, 0x0740, 0x1388, 0x2b1c, 0x43ac,
0x3664, 0x0640, 0x1288, 0x2a1c, 0x42ac,
0x3668, 0x0644, 0x128c, 0x2a20, 0x42b0,
0x3768, 0x0744, 0x138c, 0x2b20, 0x43b0,
0x3868, 0x0844, 0x148c, 0x2c20, 0x44b0,
0x3c48, 0x0c24, 0x186c, 0x3000, 0x0090,
0x3d48, 0x0d24, 0x196c, 0x3100, 0x0190,
0x3e48, 0x0e24, 0x1a6c, 0x3200, 0x0290,
0x3e4c, 0x0e28, 0x1a70, 0x3204, 0x0294,
0x3d4c, 0x0d28, 0x1970, 0x3104, 0x0194,
0x3c4c, 0x0c28, 0x1870, 0x3004, 0x0094,
0x3c50, 0x0c2c, 0x1874, 0x3008, 0x0098,
0x3d50, 0x0d2c, 0x1974, 0x3108, 0x0198,
0x3e50, 0x0e2c, 0x1a74, 0x3208, 0x0298,
0x3e54, 0x0e30, 0x1a78, 0x320c, 0x029c,
0x3d54, 0x0d30, 0x1978, 0x310c, 0x019c,
0x3c54, 0x0c30, 0x1878, 0x300c, 0x009c,
0x3c58, 0x0c34, 0x187c, 0x3010, 0x00a0,
0x3d58, 0x0d34, 0x197c, 0x3110, 0x01a0,
0x3e58, 0x0e34, 0x1a7c, 0x3210, 0x02a0,
0x3e5c, 0x0e38, 0x1a80, 0x3214, 0x02a4,
0x3d5c, 0x0d38, 0x1980, 0x3114, 0x01a4,
0x3c5c, 0x0c38, 0x1880, 0x3014, 0x00a4,
0x3c60, 0x0c3c, 0x1884, 0x3018, 0x00a8,
0x3d60, 0x0d3c, 0x1984, 0x3118, 0x01a8,
0x3e60, 0x0e3c, 0x1a84, 0x3218, 0x02a8,
0x3e64, 0x0e40, 0x1a88, 0x321c, 0x02ac,
0x3d64, 0x0d40, 0x1988, 0x311c, 0x01ac,
0x3c64, 0x0c40, 0x1888, 0x301c, 0x00ac,
0x3c68, 0x0c44, 0x188c, 0x3020, 0x00b0,
0x3d68, 0x0d44, 0x198c, 0x3120, 0x01b0,
0x3e68, 0x0e44, 0x1a8c, 0x3220, 0x02b0,
0x4248, 0x1224, 0x1e6c, 0x3600, 0x0690,
0x4348, 0x1324, 0x1f6c, 0x3700, 0x0790,
0x4448, 0x1424, 0x206c, 0x3800, 0x0890,
0x444c, 0x1428, 0x2070, 0x3804, 0x0894,
0x434c, 0x1328, 0x1f70, 0x3704, 0x0794,
0x424c, 0x1228, 0x1e70, 0x3604, 0x0694,
0x4250, 0x122c, 0x1e74, 0x3608, 0x0698,
0x4350, 0x132c, 0x1f74, 0x3708, 0x0798,
0x4450, 0x142c, 0x2074, 0x3808, 0x0898,
0x4454, 0x1430, 0x2078, 0x380c, 0x089c,
0x4354, 0x1330, 0x1f78, 0x370c, 0x079c,
0x4254, 0x1230, 0x1e78, 0x360c, 0x069c,
0x4258, 0x1234, 0x1e7c, 0x3610, 0x06a0,
0x4358, 0x1334, 0x1f7c, 0x3710, 0x07a0,
0x4458, 0x1434, 0x207c, 0x3810, 0x08a0,
0x445c, 0x1438, 0x2080, 0x3814, 0x08a4,
0x435c, 0x1338, 0x1f80, 0x3714, 0x07a4,
0x425c, 0x1238, 0x1e80, 0x3614, 0x06a4,
0x4260, 0x123c, 0x1e84, 0x3618, 0x06a8,
0x4360, 0x133c, 0x1f84, 0x3718, 0x07a8,
0x4460, 0x143c, 0x2084, 0x3818, 0x08a8,
0x4464, 0x1440, 0x2088, 0x381c, 0x08ac,
0x4364, 0x1340, 0x1f88, 0x371c, 0x07ac,
0x4264, 0x1240, 0x1e88, 0x361c, 0x06ac,
0x4268, 0x1244, 0x1e8c, 0x3620, 0x06b0,
0x4368, 0x1344, 0x1f8c, 0x3720, 0x07b0,
0x4468, 0x1444, 0x208c, 0x3820, 0x08b0,
0x0048, 0x1824, 0x246c, 0x3c00, 0x0c90,
0x0148, 0x1924, 0x256c, 0x3d00, 0x0d90,
0x0248, 0x1a24, 0x266c, 0x3e00, 0x0e90,
0x024c, 0x1a28, 0x2670, 0x3e04, 0x0e94,
0x014c, 0x1928, 0x2570, 0x3d04, 0x0d94,
0x004c, 0x1828, 0x2470, 0x3c04, 0x0c94,
0x0050, 0x182c, 0x2474, 0x3c08, 0x0c98,
0x0150, 0x192c, 0x2574, 0x3d08, 0x0d98,
0x0250, 0x1a2c, 0x2674, 0x3e08, 0x0e98,
0x0254, 0x1a30, 0x2678, 0x3e0c, 0x0e9c,
0x0154, 0x1930, 0x2578, 0x3d0c, 0x0d9c,
0x0054, 0x1830, 0x2478, 0x3c0c, 0x0c9c,
0x0058, 0x1834, 0x247c, 0x3c10, 0x0ca0,
0x0158, 0x1934, 0x257c, 0x3d10, 0x0da0,
0x0258, 0x1a34, 0x267c, 0x3e10, 0x0ea0,
0x025c, 0x1a38, 0x2680, 0x3e14, 0x0ea4,
0x015c, 0x1938, 0x2580, 0x3d14, 0x0da4,
0x005c, 0x1838, 0x2480, 0x3c14, 0x0ca4,
0x0060, 0x183c, 0x2484, 0x3c18, 0x0ca8,
0x0160, 0x193c, 0x2584, 0x3d18, 0x0da8,
0x0260, 0x1a3c, 0x2684, 0x3e18, 0x0ea8,
0x0264, 0x1a40, 0x2688, 0x3e1c, 0x0eac,
0x0164, 0x1940, 0x2588, 0x3d1c, 0x0dac,
0x0064, 0x1840, 0x2488, 0x3c1c, 0x0cac,
0x0068, 0x1844, 0x248c, 0x3c20, 0x0cb0,
0x0168, 0x1944, 0x258c, 0x3d20, 0x0db0,
0x0268, 0x1a44, 0x268c, 0x3e20, 0x0eb0,
0x0648, 0x1e24, 0x2a6c, 0x4200, 0x1290,
0x0748, 0x1f24, 0x2b6c, 0x4300, 0x1390,
0x0848, 0x2024, 0x2c6c, 0x4400, 0x1490,
0x084c, 0x2028, 0x2c70, 0x4404, 0x1494,
0x074c, 0x1f28, 0x2b70, 0x4304, 0x1394,
0x064c, 0x1e28, 0x2a70, 0x4204, 0x1294,
0x0650, 0x1e2c, 0x2a74, 0x4208, 0x1298,
0x0750, 0x1f2c, 0x2b74, 0x4308, 0x1398,
0x0850, 0x202c, 0x2c74, 0x4408, 0x1498,
0x0854, 0x2030, 0x2c78, 0x440c, 0x149c,
0x0754, 0x1f30, 0x2b78, 0x430c, 0x139c,
0x0654, 0x1e30, 0x2a78, 0x420c, 0x129c,
0x0658, 0x1e34, 0x2a7c, 0x4210, 0x12a0,
0x0758, 0x1f34, 0x2b7c, 0x4310, 0x13a0,
0x0858, 0x2034, 0x2c7c, 0x4410, 0x14a0,
0x085c, 0x2038, 0x2c80, 0x4414, 0x14a4,
0x075c, 0x1f38, 0x2b80, 0x4314, 0x13a4,
0x065c, 0x1e38, 0x2a80, 0x4214, 0x12a4,
0x0660, 0x1e3c, 0x2a84, 0x4218, 0x12a8,
0x0760, 0x1f3c, 0x2b84, 0x4318, 0x13a8,
0x0860, 0x203c, 0x2c84, 0x4418, 0x14a8,
0x0864, 0x2040, 0x2c88, 0x441c, 0x14ac,
0x0764, 0x1f40, 0x2b88, 0x431c, 0x13ac,
0x0664, 0x1e40, 0x2a88, 0x421c, 0x12ac,
0x0668, 0x1e44, 0x2a8c, 0x4220, 0x12b0,
0x0768, 0x1f44, 0x2b8c, 0x4320, 0x13b0,
0x0868, 0x2044, 0x2c8c, 0x4420, 0x14b0,
0x0f48, 0x2724, 0x336c, 0x0300, 0x1b90,
0x1048, 0x2824, 0x346c, 0x0400, 0x1c90,
0x1148, 0x2924, 0x356c, 0x0500, 0x1d90,
0x114c, 0x2928, 0x3570, 0x0504, 0x1d94,
0x104c, 0x2828, 0x3470, 0x0404, 0x1c94,
0x0f4c, 0x2728, 0x3370, 0x0304, 0x1b94,
0x0f50, 0x272c, 0x3374, 0x0308, 0x1b98,
0x1050, 0x282c, 0x3474, 0x0408, 0x1c98,
0x1150, 0x292c, 0x3574, 0x0508, 0x1d98,
0x1154, 0x2930, 0x3578, 0x050c, 0x1d9c,
0x1054, 0x2830, 0x3478, 0x040c, 0x1c9c,
0x0f54, 0x2730, 0x3378, 0x030c, 0x1b9c,
0x0f58, 0x2734, 0x337c, 0x0310, 0x1ba0,
0x1058, 0x2834, 0x347c, 0x0410, 0x1ca0,
0x1158, 0x2934, 0x357c, 0x0510, 0x1da0,
0x115c, 0x2938, 0x3580, 0x0514, 0x1da4,
0x105c, 0x2838, 0x3480, 0x0414, 0x1ca4,
0x0f5c, 0x2738, 0x3380, 0x0314, 0x1ba4,
0x0f60, 0x273c, 0x3384, 0x0318, 0x1ba8,
0x1060, 0x283c, 0x3484, 0x0418, 0x1ca8,
0x1160, 0x293c, 0x3584, 0x0518, 0x1da8,
0x1164, 0x2940, 0x3588, 0x051c, 0x1dac,
0x1064, 0x2840, 0x3488, 0x041c, 0x1cac,
0x0f64, 0x2740, 0x3388, 0x031c, 0x1bac,
0x0f68, 0x2744, 0x338c, 0x0320, 0x1bb0,
0x1068, 0x2844, 0x348c, 0x0420, 0x1cb0,
0x1168, 0x2944, 0x358c, 0x0520, 0x1db0,
0x1548, 0x2d24, 0x396c, 0x0900, 0x2190,
0x1648, 0x2e24, 0x3a6c, 0x0a00, 0x2290,
0x1748, 0x2f24, 0x3b6c, 0x0b00, 0x2390,
0x174c, 0x2f28, 0x3b70, 0x0b04, 0x2394,
0x164c, 0x2e28, 0x3a70, 0x0a04, 0x2294,
0x154c, 0x2d28, 0x3970, 0x0904, 0x2194,
0x1550, 0x2d2c, 0x3974, 0x0908, 0x2198,
0x1650, 0x2e2c, 0x3a74, 0x0a08, 0x2298,
0x1750, 0x2f2c, 0x3b74, 0x0b08, 0x2398,
0x1754, 0x2f30, 0x3b78, 0x0b0c, 0x239c,
0x1654, 0x2e30, 0x3a78, 0x0a0c, 0x229c,
0x1554, 0x2d30, 0x3978, 0x090c, 0x219c,
0x1558, 0x2d34, 0x397c, 0x0910, 0x21a0,
0x1658, 0x2e34, 0x3a7c, 0x0a10, 0x22a0,
0x1758, 0x2f34, 0x3b7c, 0x0b10, 0x23a0,
0x175c, 0x2f38, 0x3b80, 0x0b14, 0x23a4,
0x165c, 0x2e38, 0x3a80, 0x0a14, 0x22a4,
0x155c, 0x2d38, 0x3980, 0x0914, 0x21a4,
0x1560, 0x2d3c, 0x3984, 0x0918, 0x21a8,
0x1660, 0x2e3c, 0x3a84, 0x0a18, 0x22a8,
0x1760, 0x2f3c, 0x3b84, 0x0b18, 0x23a8,
0x1764, 0x2f40, 0x3b88, 0x0b1c, 0x23ac,
0x1664, 0x2e40, 0x3a88, 0x0a1c, 0x22ac,
0x1564, 0x2d40, 0x3988, 0x091c, 0x21ac,
0x1568, 0x2d44, 0x398c, 0x0920, 0x21b0,
0x1668, 0x2e44, 0x3a8c, 0x0a20, 0x22b0,
0x1768, 0x2f44, 0x3b8c, 0x0b20, 0x23b0,
0x1b48, 0x3324, 0x3f6c, 0x0f00, 0x2790,
0x1c48, 0x3424, 0x406c, 0x1000, 0x2890,
0x1d48, 0x3524, 0x416c, 0x1100, 0x2990,
0x1d4c, 0x3528, 0x4170, 0x1104, 0x2994,
0x1c4c, 0x3428, 0x4070, 0x1004, 0x2894,
0x1b4c, 0x3328, 0x3f70, 0x0f04, 0x2794,
0x1b50, 0x332c, 0x3f74, 0x0f08, 0x2798,
0x1c50, 0x342c, 0x4074, 0x1008, 0x2898,
0x1d50, 0x352c, 0x4174, 0x1108, 0x2998,
0x1d54, 0x3530, 0x4178, 0x110c, 0x299c,
0x1c54, 0x3430, 0x4078, 0x100c, 0x289c,
0x1b54, 0x3330, 0x3f78, 0x0f0c, 0x279c,
0x1b58, 0x3334, 0x3f7c, 0x0f10, 0x27a0,
0x1c58, 0x3434, 0x407c, 0x1010, 0x28a0,
0x1d58, 0x3534, 0x417c, 0x1110, 0x29a0,
0x1d5c, 0x3538, 0x4180, 0x1114, 0x29a4,
0x1c5c, 0x3438, 0x4080, 0x1014, 0x28a4,
0x1b5c, 0x3338, 0x3f80, 0x0f14, 0x27a4,
0x1b60, 0x333c, 0x3f84, 0x0f18, 0x27a8,
0x1c60, 0x343c, 0x4084, 0x1018, 0x28a8,
0x1d60, 0x353c, 0x4184, 0x1118, 0x29a8,
0x1d64, 0x3540, 0x4188, 0x111c, 0x29ac,
0x1c64, 0x3440, 0x4088, 0x101c, 0x28ac,
0x1b64, 0x3340, 0x3f88, 0x0f1c, 0x27ac,
0x1b68, 0x3344, 0x3f8c, 0x0f20, 0x27b0,
0x1c68, 0x3444, 0x408c, 0x1020, 0x28b0,
0x1d68, 0x3544, 0x418c, 0x1120, 0x29b0,
0x2148, 0x3924, 0x456c, 0x1500, 0x2d90,
0x2248, 0x3a24, 0x466c, 0x1600, 0x2e90,
0x2348, 0x3b24, 0x476c, 0x1700, 0x2f90,
0x234c, 0x3b28, 0x4770, 0x1704, 0x2f94,
0x224c, 0x3a28, 0x4670, 0x1604, 0x2e94,
0x214c, 0x3928, 0x4570, 0x1504, 0x2d94,
0x2150, 0x392c, 0x4574, 0x1508, 0x2d98,
0x2250, 0x3a2c, 0x4674, 0x1608, 0x2e98,
0x2350, 0x3b2c, 0x4774, 0x1708, 0x2f98,
0x2354, 0x3b30, 0x4778, 0x170c, 0x2f9c,
0x2254, 0x3a30, 0x4678, 0x160c, 0x2e9c,
0x2154, 0x3930, 0x4578, 0x150c, 0x2d9c,
0x2158, 0x3934, 0x457c, 0x1510, 0x2da0,
0x2258, 0x3a34, 0x467c, 0x1610, 0x2ea0,
0x2358, 0x3b34, 0x477c, 0x1710, 0x2fa0,
0x235c, 0x3b38, 0x4780, 0x1714, 0x2fa4,
0x225c, 0x3a38, 0x4680, 0x1614, 0x2ea4,
0x215c, 0x3938, 0x4580, 0x1514, 0x2da4,
0x2160, 0x393c, 0x4584, 0x1518, 0x2da8,
0x2260, 0x3a3c, 0x4684, 0x1618, 0x2ea8,
0x2360, 0x3b3c, 0x4784, 0x1718, 0x2fa8,
0x2364, 0x3b40, 0x4788, 0x171c, 0x2fac,
0x2264, 0x3a40, 0x4688, 0x161c, 0x2eac,
0x2164, 0x3940, 0x4588, 0x151c, 0x2dac,
0x2168, 0x3944, 0x458c, 0x1520, 0x2db0,
0x2268, 0x3a44, 0x468c, 0x1620, 0x2eb0,
0x2368, 0x3b44, 0x478c, 0x1720, 0x2fb0,
0x2748, 0x3f24, 0x036c, 0x1b00, 0x3390,
0x2848, 0x4024, 0x046c, 0x1c00, 0x3490,
0x2948, 0x4124, 0x056c, 0x1d00, 0x3590,
0x294c, 0x4128, 0x0570, 0x1d04, 0x3594,
0x284c, 0x4028, 0x0470, 0x1c04, 0x3494,
0x274c, 0x3f28, 0x0370, 0x1b04, 0x3394,
0x2750, 0x3f2c, 0x0374, 0x1b08, 0x3398,
0x2850, 0x402c, 0x0474, 0x1c08, 0x3498,
0x2950, 0x412c, 0x0574, 0x1d08, 0x3598,
0x2954, 0x4130, 0x0578, 0x1d0c, 0x359c,
0x2854, 0x4030, 0x0478, 0x1c0c, 0x349c,
0x2754, 0x3f30, 0x0378, 0x1b0c, 0x339c,
0x2758, 0x3f34, 0x037c, 0x1b10, 0x33a0,
0x2858, 0x4034, 0x047c, 0x1c10, 0x34a0,
0x2958, 0x4134, 0x057c, 0x1d10, 0x35a0,
0x295c, 0x4138, 0x0580, 0x1d14, 0x35a4,
0x285c, 0x4038, 0x0480, 0x1c14, 0x34a4,
0x275c, 0x3f38, 0x0380, 0x1b14, 0x33a4,
0x2760, 0x3f3c, 0x0384, 0x1b18, 0x33a8,
0x2860, 0x403c, 0x0484, 0x1c18, 0x34a8,
0x2960, 0x413c, 0x0584, 0x1d18, 0x35a8,
0x2964, 0x4140, 0x0588, 0x1d1c, 0x35ac,
0x2864, 0x4040, 0x0488, 0x1c1c, 0x34ac,
0x2764, 0x3f40, 0x0388, 0x1b1c, 0x33ac,
0x2768, 0x3f44, 0x038c, 0x1b20, 0x33b0,
0x2868, 0x4044, 0x048c, 0x1c20, 0x34b0,
0x2968, 0x4144, 0x058c, 0x1d20, 0x35b0,
0x2d48, 0x4524, 0x096c, 0x2100, 0x3990,
0x2e48, 0x4624, 0x0a6c, 0x2200, 0x3a90,
0x2f48, 0x4724, 0x0b6c, 0x2300, 0x3b90,
0x2f4c, 0x4728, 0x0b70, 0x2304, 0x3b94,
0x2e4c, 0x4628, 0x0a70, 0x2204, 0x3a94,
0x2d4c, 0x4528, 0x0970, 0x2104, 0x3994,
0x2d50, 0x452c, 0x0974, 0x2108, 0x3998,
0x2e50, 0x462c, 0x0a74, 0x2208, 0x3a98,
0x2f50, 0x472c, 0x0b74, 0x2308, 0x3b98,
0x2f54, 0x4730, 0x0b78, 0x230c, 0x3b9c,
0x2e54, 0x4630, 0x0a78, 0x220c, 0x3a9c,
0x2d54, 0x4530, 0x0978, 0x210c, 0x399c,
0x2d58, 0x4534, 0x097c, 0x2110, 0x39a0,
0x2e58, 0x4634, 0x0a7c, 0x2210, 0x3aa0,
0x2f58, 0x4734, 0x0b7c, 0x2310, 0x3ba0,
0x2f5c, 0x4738, 0x0b80, 0x2314, 0x3ba4,
0x2e5c, 0x4638, 0x0a80, 0x2214, 0x3aa4,
0x2d5c, 0x4538, 0x0980, 0x2114, 0x39a4,
0x2d60, 0x453c, 0x0984, 0x2118, 0x39a8,
0x2e60, 0x463c, 0x0a84, 0x2218, 0x3aa8,
0x2f60, 0x473c, 0x0b84, 0x2318, 0x3ba8,
0x2f64, 0x4740, 0x0b88, 0x231c, 0x3bac,
0x2e64, 0x4640, 0x0a88, 0x221c, 0x3aac,
0x2d64, 0x4540, 0x0988, 0x211c, 0x39ac,
0x2d68, 0x4544, 0x098c, 0x2120, 0x39b0,
0x2e68, 0x4644, 0x0a8c, 0x2220, 0x3ab0,
0x2f68, 0x4744, 0x0b8c, 0x2320, 0x3bb0,
0x3348, 0x0324, 0x0f6c, 0x2700, 0x3f90,
0x3448, 0x0424, 0x106c, 0x2800, 0x4090,
0x3548, 0x0524, 0x116c, 0x2900, 0x4190,
0x354c, 0x0528, 0x1170, 0x2904, 0x4194,
0x344c, 0x0428, 0x1070, 0x2804, 0x4094,
0x334c, 0x0328, 0x0f70, 0x2704, 0x3f94,
0x3350, 0x032c, 0x0f74, 0x2708, 0x3f98,
0x3450, 0x042c, 0x1074, 0x2808, 0x4098,
0x3550, 0x052c, 0x1174, 0x2908, 0x4198,
0x3554, 0x0530, 0x1178, 0x290c, 0x419c,
0x3454, 0x0430, 0x1078, 0x280c, 0x409c,
0x3354, 0x0330, 0x0f78, 0x270c, 0x3f9c,
0x3358, 0x0334, 0x0f7c, 0x2710, 0x3fa0,
0x3458, 0x0434, 0x107c, 0x2810, 0x40a0,
0x3558, 0x0534, 0x117c, 0x2910, 0x41a0,
0x355c, 0x0538, 0x1180, 0x2914, 0x41a4,
0x345c, 0x0438, 0x1080, 0x2814, 0x40a4,
0x335c, 0x0338, 0x0f80, 0x2714, 0x3fa4,
0x3360, 0x033c, 0x0f84, 0x2718, 0x3fa8,
0x3460, 0x043c, 0x1084, 0x2818, 0x40a8,
0x3560, 0x053c, 0x1184, 0x2918, 0x41a8,
0x3564, 0x0540, 0x1188, 0x291c, 0x41ac,
0x3464, 0x0440, 0x1088, 0x281c, 0x40ac,
0x3364, 0x0340, 0x0f88, 0x271c, 0x3fac,
0x3368, 0x0344, 0x0f8c, 0x2720, 0x3fb0,
0x3468, 0x0444, 0x108c, 0x2820, 0x40b0,
0x3568, 0x0544, 0x118c, 0x2920, 0x41b0,
0x3948, 0x0924, 0x156c, 0x2d00, 0x4590,
0x3a48, 0x0a24, 0x166c, 0x2e00, 0x4690,
0x3b48, 0x0b24, 0x176c, 0x2f00, 0x4790,
0x3b4c, 0x0b28, 0x1770, 0x2f04, 0x4794,
0x3a4c, 0x0a28, 0x1670, 0x2e04, 0x4694,
0x394c, 0x0928, 0x1570, 0x2d04, 0x4594,
0x3950, 0x092c, 0x1574, 0x2d08, 0x4598,
0x3a50, 0x0a2c, 0x1674, 0x2e08, 0x4698,
0x3b50, 0x0b2c, 0x1774, 0x2f08, 0x4798,
0x3b54, 0x0b30, 0x1778, 0x2f0c, 0x479c,
0x3a54, 0x0a30, 0x1678, 0x2e0c, 0x469c,
0x3954, 0x0930, 0x1578, 0x2d0c, 0x459c,
0x3958, 0x0934, 0x157c, 0x2d10, 0x45a0,
0x3a58, 0x0a34, 0x167c, 0x2e10, 0x46a0,
0x3b58, 0x0b34, 0x177c, 0x2f10, 0x47a0,
0x3b5c, 0x0b38, 0x1780, 0x2f14, 0x47a4,
0x3a5c, 0x0a38, 0x1680, 0x2e14, 0x46a4,
0x395c, 0x0938, 0x1580, 0x2d14, 0x45a4,
0x3960, 0x093c, 0x1584, 0x2d18, 0x45a8,
0x3a60, 0x0a3c, 0x1684, 0x2e18, 0x46a8,
0x3b60, 0x0b3c, 0x1784, 0x2f18, 0x47a8,
0x3b64, 0x0b40, 0x1788, 0x2f1c, 0x47ac,
0x3a64, 0x0a40, 0x1688, 0x2e1c, 0x46ac,
0x3964, 0x0940, 0x1588, 0x2d1c, 0x45ac,
0x3968, 0x0944, 0x158c, 0x2d20, 0x45b0,
0x3a68, 0x0a44, 0x168c, 0x2e20, 0x46b0,
0x3b68, 0x0b44, 0x178c, 0x2f20, 0x47b0,
0x3f48, 0x0f24, 0x1b6c, 0x3300, 0x0390,
0x4048, 0x1024, 0x1c6c, 0x3400, 0x0490,
0x4148, 0x1124, 0x1d6c, 0x3500, 0x0590,
0x414c, 0x1128, 0x1d70, 0x3504, 0x0594,
0x404c, 0x1028, 0x1c70, 0x3404, 0x0494,
0x3f4c, 0x0f28, 0x1b70, 0x3304, 0x0394,
0x3f50, 0x0f2c, 0x1b74, 0x3308, 0x0398,
0x4050, 0x102c, 0x1c74, 0x3408, 0x0498,
0x4150, 0x112c, 0x1d74, 0x3508, 0x0598,
0x4154, 0x1130, 0x1d78, 0x350c, 0x059c,
0x4054, 0x1030, 0x1c78, 0x340c, 0x049c,
0x3f54, 0x0f30, 0x1b78, 0x330c, 0x039c,
0x3f58, 0x0f34, 0x1b7c, 0x3310, 0x03a0,
0x4058, 0x1034, 0x1c7c, 0x3410, 0x04a0,
0x4158, 0x1134, 0x1d7c, 0x3510, 0x05a0,
0x415c, 0x1138, 0x1d80, 0x3514, 0x05a4,
0x405c, 0x1038, 0x1c80, 0x3414, 0x04a4,
0x3f5c, 0x0f38, 0x1b80, 0x3314, 0x03a4,
0x3f60, 0x0f3c, 0x1b84, 0x3318, 0x03a8,
0x4060, 0x103c, 0x1c84, 0x3418, 0x04a8,
0x4160, 0x113c, 0x1d84, 0x3518, 0x05a8,
0x4164, 0x1140, 0x1d88, 0x351c, 0x05ac,
0x4064, 0x1040, 0x1c88, 0x341c, 0x04ac,
0x3f64, 0x0f40, 0x1b88, 0x331c, 0x03ac,
0x3f68, 0x0f44, 0x1b8c, 0x3320, 0x03b0,
0x4068, 0x1044, 0x1c8c, 0x3420, 0x04b0,
0x4168, 0x1144, 0x1d8c, 0x3520, 0x05b0,
0x4548, 0x1524, 0x216c, 0x3900, 0x0990,
0x4648, 0x1624, 0x226c, 0x3a00, 0x0a90,
0x4748, 0x1724, 0x236c, 0x3b00, 0x0b90,
0x474c, 0x1728, 0x2370, 0x3b04, 0x0b94,
0x464c, 0x1628, 0x2270, 0x3a04, 0x0a94,
0x454c, 0x1528, 0x2170, 0x3904, 0x0994,
0x4550, 0x152c, 0x2174, 0x3908, 0x0998,
0x4650, 0x162c, 0x2274, 0x3a08, 0x0a98,
0x4750, 0x172c, 0x2374, 0x3b08, 0x0b98,
0x4754, 0x1730, 0x2378, 0x3b0c, 0x0b9c,
0x4654, 0x1630, 0x2278, 0x3a0c, 0x0a9c,
0x4554, 0x1530, 0x2178, 0x390c, 0x099c,
0x4558, 0x1534, 0x217c, 0x3910, 0x09a0,
0x4658, 0x1634, 0x227c, 0x3a10, 0x0aa0,
0x4758, 0x1734, 0x237c, 0x3b10, 0x0ba0,
0x475c, 0x1738, 0x2380, 0x3b14, 0x0ba4,
0x465c, 0x1638, 0x2280, 0x3a14, 0x0aa4,
0x455c, 0x1538, 0x2180, 0x3914, 0x09a4,
0x4560, 0x153c, 0x2184, 0x3918, 0x09a8,
0x4660, 0x163c, 0x2284, 0x3a18, 0x0aa8,
0x4760, 0x173c, 0x2384, 0x3b18, 0x0ba8,
0x4764, 0x1740, 0x2388, 0x3b1c, 0x0bac,
0x4664, 0x1640, 0x2288, 0x3a1c, 0x0aac,
0x4564, 0x1540, 0x2188, 0x391c, 0x09ac,
0x4568, 0x1544, 0x218c, 0x3920, 0x09b0,
0x4668, 0x1644, 0x228c, 0x3a20, 0x0ab0,
0x4768, 0x1744, 0x238c, 0x3b20, 0x0bb0,
0x0348, 0x1b24, 0x276c, 0x3f00, 0x0f90,
0x0448, 0x1c24, 0x286c, 0x4000, 0x1090,
0x0548, 0x1d24, 0x296c, 0x4100, 0x1190,
0x054c, 0x1d28, 0x2970, 0x4104, 0x1194,
0x044c, 0x1c28, 0x2870, 0x4004, 0x1094,
0x034c, 0x1b28, 0x2770, 0x3f04, 0x0f94,
0x0350, 0x1b2c, 0x2774, 0x3f08, 0x0f98,
0x0450, 0x1c2c, 0x2874, 0x4008, 0x1098,
0x0550, 0x1d2c, 0x2974, 0x4108, 0x1198,
0x0554, 0x1d30, 0x2978, 0x410c, 0x119c,
0x0454, 0x1c30, 0x2878, 0x400c, 0x109c,
0x0354, 0x1b30, 0x2778, 0x3f0c, 0x0f9c,
0x0358, 0x1b34, 0x277c, 0x3f10, 0x0fa0,
0x0458, 0x1c34, 0x287c, 0x4010, 0x10a0,
0x0558, 0x1d34, 0x297c, 0x4110, 0x11a0,
0x055c, 0x1d38, 0x2980, 0x4114, 0x11a4,
0x045c, 0x1c38, 0x2880, 0x4014, 0x10a4,
0x035c, 0x1b38, 0x2780, 0x3f14, 0x0fa4,
0x0360, 0x1b3c, 0x2784, 0x3f18, 0x0fa8,
0x0460, 0x1c3c, 0x2884, 0x4018, 0x10a8,
0x0560, 0x1d3c, 0x2984, 0x4118, 0x11a8,
0x0564, 0x1d40, 0x2988, 0x411c, 0x11ac,
0x0464, 0x1c40, 0x2888, 0x401c, 0x10ac,
0x0364, 0x1b40, 0x2788, 0x3f1c, 0x0fac,
0x0368, 0x1b44, 0x278c, 0x3f20, 0x0fb0,
0x0468, 0x1c44, 0x288c, 0x4020, 0x10b0,
0x0568, 0x1d44, 0x298c, 0x4120, 0x11b0,
0x0948, 0x2124, 0x2d6c, 0x4500, 0x1590,
0x0a48, 0x2224, 0x2e6c, 0x4600, 0x1690,
0x0b48, 0x2324, 0x2f6c, 0x4700, 0x1790,
0x0b4c, 0x2328, 0x2f70, 0x4704, 0x1794,
0x0a4c, 0x2228, 0x2e70, 0x4604, 0x1694,
0x094c, 0x2128, 0x2d70, 0x4504, 0x1594,
0x0950, 0x212c, 0x2d74, 0x4508, 0x1598,
0x0a50, 0x222c, 0x2e74, 0x4608, 0x1698,
0x0b50, 0x232c, 0x2f74, 0x4708, 0x1798,
0x0b54, 0x2330, 0x2f78, 0x470c, 0x179c,
0x0a54, 0x2230, 0x2e78, 0x460c, 0x169c,
0x0954, 0x2130, 0x2d78, 0x450c, 0x159c,
0x0958, 0x2134, 0x2d7c, 0x4510, 0x15a0,
0x0a58, 0x2234, 0x2e7c, 0x4610, 0x16a0,
0x0b58, 0x2334, 0x2f7c, 0x4710, 0x17a0,
0x0b5c, 0x2338, 0x2f80, 0x4714, 0x17a4,
0x0a5c, 0x2238, 0x2e80, 0x4614, 0x16a4,
0x095c, 0x2138, 0x2d80, 0x4514, 0x15a4,
0x0960, 0x213c, 0x2d84, 0x4518, 0x15a8,
0x0a60, 0x223c, 0x2e84, 0x4618, 0x16a8,
0x0b60, 0x233c, 0x2f84, 0x4718, 0x17a8,
0x0b64, 0x2340, 0x2f88, 0x471c, 0x17ac,
0x0a64, 0x2240, 0x2e88, 0x461c, 0x16ac,
0x0964, 0x2140, 0x2d88, 0x451c, 0x15ac,
0x0968, 0x2144, 0x2d8c, 0x4520, 0x15b0,
0x0a68, 0x2244, 0x2e8c, 0x4620, 0x16b0,
0x0b68, 0x2344, 0x2f8c, 0x4720, 0x17b0,
};
/* DV25/50 DCT coefficient weights and inverse weights */ /* DV25/50 DCT coefficient weights and inverse weights */
/* created by dvtables.py */ /* created by dvtables.py */
static const int dv_weight_bits = 18; static const int dv_weight_bits = 18;
...@@ -1339,6 +2540,7 @@ static const DVprofile dv_profiles[] = { ...@@ -1339,6 +2540,7 @@ static const DVprofile dv_profiles[] = {
{ .dsf = 0, { .dsf = 0,
.frame_size = 120000, /* IEC 61834, SMPTE-314M - 525/60 (NTSC) */ .frame_size = 120000, /* IEC 61834, SMPTE-314M - 525/60 (NTSC) */
.difseg_size = 10, .difseg_size = 10,
.n_difchan = 1,
.frame_rate = 30000, .frame_rate = 30000,
.ltc_divisor = 30, .ltc_divisor = 30,
.frame_rate_base = 1001, .frame_rate_base = 1001,
...@@ -1349,12 +2551,13 @@ static const DVprofile dv_profiles[] = { ...@@ -1349,12 +2551,13 @@ static const DVprofile dv_profiles[] = {
.pix_fmt = PIX_FMT_YUV411P, .pix_fmt = PIX_FMT_YUV411P,
.audio_stride = 90, .audio_stride = 90,
.audio_min_samples = { 1580, 1452, 1053 }, /* for 48, 44.1 and 32Khz */ .audio_min_samples = { 1580, 1452, 1053 }, /* for 48, 44.1 and 32Khz */
.audio_samples_dist = { 1602, 1601, 1602, 1601, 1602 }, .audio_samples_dist = { 1600, 1602, 1602, 1602, 1602 }, /* per SMPTE-314M */
.audio_shuffle = dv_audio_shuffle525, .audio_shuffle = dv_audio_shuffle525,
}, },
{ .dsf = 1, { .dsf = 1,
.frame_size = 144000, /* IEC 61834 - 625/50 (PAL) */ .frame_size = 144000, /* IEC 61834 - 625/50 (PAL) */
.difseg_size = 12, .difseg_size = 12,
.n_difchan = 1,
.frame_rate = 25, .frame_rate = 25,
.frame_rate_base = 1, .frame_rate_base = 1,
.ltc_divisor = 25, .ltc_divisor = 25,
...@@ -1371,6 +2574,7 @@ static const DVprofile dv_profiles[] = { ...@@ -1371,6 +2574,7 @@ static const DVprofile dv_profiles[] = {
{ .dsf = 1, { .dsf = 1,
.frame_size = 144000, /* SMPTE-314M - 625/50 (PAL) */ .frame_size = 144000, /* SMPTE-314M - 625/50 (PAL) */
.difseg_size = 12, .difseg_size = 12,
.n_difchan = 1,
.frame_rate = 25, .frame_rate = 25,
.frame_rate_base = 1, .frame_rate_base = 1,
.ltc_divisor = 25, .ltc_divisor = 25,
...@@ -1383,29 +2587,79 @@ static const DVprofile dv_profiles[] = { ...@@ -1383,29 +2587,79 @@ static const DVprofile dv_profiles[] = {
.audio_min_samples = { 1896, 1742, 1264 }, /* for 48, 44.1 and 32Khz */ .audio_min_samples = { 1896, 1742, 1264 }, /* for 48, 44.1 and 32Khz */
.audio_samples_dist = { 1920, 1920, 1920, 1920, 1920 }, .audio_samples_dist = { 1920, 1920, 1920, 1920, 1920 },
.audio_shuffle = dv_audio_shuffle625, .audio_shuffle = dv_audio_shuffle625,
} },
{ .dsf = 0,
.frame_size = 240000, /* SMPTE-314M - 525/60 (NTSC) 50 Mbps */
.difseg_size = 10, /* also known as "DVCPRO50" */
.n_difchan = 2,
.frame_rate = 30000,
.ltc_divisor = 30,
.frame_rate_base = 1001,
.height = 480,
.width = 720,
.sar = {{10, 11}, {40, 33}},
.video_place = dv_place_422_525,
.pix_fmt = PIX_FMT_YUV422P,
.audio_stride = 90,
.audio_min_samples = { 1580, 1452, 1053 }, /* for 48, 44.1 and 32Khz */
.audio_samples_dist = { 1600, 1602, 1602, 1602, 1602 }, /* per SMPTE-314M */
.audio_shuffle = dv_audio_shuffle525,
},
{ .dsf = 1,
.frame_size = 288000, /* SMPTE-314M - 625/50 (PAL) 50 Mbps */
.difseg_size = 12, /* also known as "DVCPRO50" */
.n_difchan = 2,
.frame_rate = 25,
.frame_rate_base = 1,
.ltc_divisor = 25,
.height = 576,
.width = 720,
.sar = {{59, 54}, {118, 81}},
.video_place = dv_place_422_625,
.pix_fmt = PIX_FMT_YUV422P,
.audio_stride = 108,
.audio_min_samples = { 1896, 1742, 1264 }, /* for 48, 44.1 and 32Khz */
.audio_samples_dist = { 1920, 1920, 1920, 1920, 1920 },
.audio_shuffle = dv_audio_shuffle625,
}
}; };
/* minimum number of bytes to read from a DV stream in order to determine the profile */
#define DV_PROFILE_BYTES (6*80) /* 6 DIF blocks */
/* largest possible DV frame, in bytes (PAL 50Mbps) */
#define DV_MAX_FRAME_SIZE 288000
static inline const DVprofile* dv_frame_profile(uint8_t* frame) static inline const DVprofile* dv_frame_profile(uint8_t* frame)
{ {
if ((frame[3] & 0x80) == 0) { /* DSF flag */ if ((frame[3] & 0x80) == 0) { /* DSF flag */
return &dv_profiles[0]; /* it's an NTSC format */
if ((frame[80*5 + 48 + 3] & 0x4)) { /* 4:2:2 sampling */
return &dv_profiles[3]; /* NTSC 50Mbps */
} else { /* 4:1:1 sampling */
return &dv_profiles[0]; /* NTSC 25Mbps */
}
} else {
/* it's a PAL format */
if ((frame[80*5 + 48 + 3] & 0x4)) { /* 4:2:2 sampling */
return &dv_profiles[4]; /* PAL 50Mbps */
} else if ((frame[5] & 0x07) == 0) { /* APT flag */
return &dv_profiles[1]; /* PAL 25Mbps 4:2:0 */
} else
return &dv_profiles[2]; /* PAL 25Mbps 4:1:1 */
} }
else if ((frame[5] & 0x07) == 0) { /* APT flag */
return &dv_profiles[1];
}
else
return &dv_profiles[2];
} }
static inline const DVprofile* dv_codec_profile(AVCodecContext* codec) static inline const DVprofile* dv_codec_profile(AVCodecContext* codec)
{ {
if (codec->width != 720) { int i;
if (codec->width != 720)
return NULL; return NULL;
}
else if (codec->height == 480) { for (i=0; i<sizeof(dv_profiles)/sizeof(DVprofile); i++)
return &dv_profiles[0]; if (codec->height == dv_profiles[i].height && codec->pix_fmt == dv_profiles[i].pix_fmt)
} return &dv_profiles[i];
else
return &dv_profiles[1]; return NULL;
} }
...@@ -8,6 +8,9 @@ ...@@ -8,6 +8,9 @@
* Raw DV format * Raw DV format
* Copyright (c) 2002 Fabrice Bellard. * Copyright (c) 2002 Fabrice Bellard.
* *
* 50 Mbps (DVCPRO50) support
* Copyright (c) 2006 Daniel Maas <dmaas@maasdigital.com>
*
* This library is free software; you can redistribute it and/or * This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public * modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either * License as published by the Free Software Foundation; either
...@@ -28,6 +31,7 @@ ...@@ -28,6 +31,7 @@
#include "dv.h" #include "dv.h"
struct DVDemuxContext { struct DVDemuxContext {
const DVprofile* sys; /* Current DV profile. E.g.: 525/60, 625/50 */
AVFormatContext* fctx; AVFormatContext* fctx;
AVStream* vst; AVStream* vst;
AVStream* ast[2]; AVStream* ast[2];
...@@ -40,13 +44,15 @@ struct DVDemuxContext { ...@@ -40,13 +44,15 @@ struct DVDemuxContext {
struct DVMuxContext { struct DVMuxContext {
const DVprofile* sys; /* Current DV profile. E.g.: 525/60, 625/50 */ const DVprofile* sys; /* Current DV profile. E.g.: 525/60, 625/50 */
uint8_t frame_buf[144000]; /* frame under contruction */ int n_ast; /* Number of stereo audio streams (up to 2) */
FifoBuffer audio_data; /* Fifo for storing excessive amounts of PCM */ AVStream *ast[2]; /* Stereo audio streams */
FifoBuffer audio_data[2]; /* Fifo for storing excessive amounts of PCM */
int frames; /* Number of a current frame */ int frames; /* Number of a current frame */
time_t start_time; /* Start time of recording */ time_t start_time; /* Start time of recording */
uint8_t aspect; /* Aspect ID 0 - 4:3, 7 - 16:9 */ uint8_t aspect; /* Aspect ID 0 - 4:3, 7 - 16:9 */
int has_audio; /* frame under contruction has audio */ int has_audio; /* frame under contruction has audio */
int has_video; /* frame under contruction has video */ int has_video; /* frame under contruction has video */
uint8_t frame_buf[DV_MAX_FRAME_SIZE]; /* frame under contruction */
}; };
enum dv_section_type { enum dv_section_type {
...@@ -177,21 +183,25 @@ static int dv_write_pack(enum dv_pack_type pack_id, DVMuxContext *c, uint8_t* bu ...@@ -177,21 +183,25 @@ static int dv_write_pack(enum dv_pack_type pack_id, DVMuxContext *c, uint8_t* bu
time_t ct; time_t ct;
int ltc_frame; int ltc_frame;
/* Its hard to tell what SMPTE requires w.r.t. APT, but Quicktime needs it.
* We set it based on pix_fmt value but it really should be per DV profile */
int apt = (c->sys->pix_fmt == PIX_FMT_YUV422P ? 1 : 0);
buf[0] = (uint8_t)pack_id; buf[0] = (uint8_t)pack_id;
switch (pack_id) { switch (pack_id) {
case dv_header525: /* I can't imagine why these two weren't defined as real */ case dv_header525: /* I can't imagine why these two weren't defined as real */
case dv_header625: /* packs in SMPTE314M -- they definitely look like ones */ case dv_header625: /* packs in SMPTE314M -- they definitely look like ones */
buf[1] = 0xf8 | /* reserved -- always 1 */ buf[1] = 0xf8 | /* reserved -- always 1 */
(0 & 0x07); /* APT: Track application ID */ (apt & 0x07); /* APT: Track application ID */
buf[2] = (0 << 7) | /* TF1: audio data is 0 - valid; 1 - invalid */ buf[2] = (0 << 7) | /* TF1: audio data is 0 - valid; 1 - invalid */
(0x0f << 3) | /* reserved -- always 1 */ (0x0f << 3) | /* reserved -- always 1 */
(0 & 0x07); /* AP1: Audio application ID */ (apt & 0x07); /* AP1: Audio application ID */
buf[3] = (0 << 7) | /* TF2: video data is 0 - valid; 1 - invalid */ buf[3] = (0 << 7) | /* TF2: video data is 0 - valid; 1 - invalid */
(0x0f << 3) | /* reserved -- always 1 */ (0x0f << 3) | /* reserved -- always 1 */
(0 & 0x07); /* AP2: Video application ID */ (apt & 0x07); /* AP2: Video application ID */
buf[4] = (0 << 7) | /* TF3: subcode(SSYB) is 0 - valid; 1 - invalid */ buf[4] = (0 << 7) | /* TF3: subcode(SSYB) is 0 - valid; 1 - invalid */
(0x0f << 3) | /* reserved -- always 1 */ (0x0f << 3) | /* reserved -- always 1 */
(0 & 0x07); /* AP3: Subcode application ID */ (apt & 0x07); /* AP3: Subcode application ID */
break; break;
case dv_timecode: case dv_timecode:
ct = (time_t)(c->frames / ((float)c->sys->frame_rate / ct = (time_t)(c->frames / ((float)c->sys->frame_rate /
...@@ -230,7 +240,7 @@ static int dv_write_pack(enum dv_pack_type pack_id, DVMuxContext *c, uint8_t* bu ...@@ -230,7 +240,7 @@ static int dv_write_pack(enum dv_pack_type pack_id, DVMuxContext *c, uint8_t* bu
buf[3] = (1 << 7) | /* res */ buf[3] = (1 << 7) | /* res */
(1 << 6) | /* multi-language flag */ (1 << 6) | /* multi-language flag */
(c->sys->dsf << 5) | /* system: 60fields/50fields */ (c->sys->dsf << 5) | /* system: 60fields/50fields */
0; /* definition: 0 -- SD (525/625) */ (apt << 1);/* definition: 0 -- 25Mbps, 2 -- 50Mbps */
buf[4] = (1 << 7) | /* emphasis: 1 -- off */ buf[4] = (1 << 7) | /* emphasis: 1 -- off */
(0 << 6) | /* emphasis time constant: 0 -- reserved */ (0 << 6) | /* emphasis time constant: 0 -- reserved */
(0 << 3) | /* frequency: 0 -- 48Khz, 1 -- 44,1Khz, 2 -- 32Khz */ (0 << 3) | /* frequency: 0 -- 48Khz, 1 -- 44,1Khz, 2 -- 32Khz */
...@@ -291,7 +301,7 @@ static int dv_write_pack(enum dv_pack_type pack_id, DVMuxContext *c, uint8_t* bu ...@@ -291,7 +301,7 @@ static int dv_write_pack(enum dv_pack_type pack_id, DVMuxContext *c, uint8_t* bu
0xf; /* reserved -- always 1 */ 0xf; /* reserved -- always 1 */
buf[3] = (3 << 6) | /* reserved -- always 1 */ buf[3] = (3 << 6) | /* reserved -- always 1 */
(c->sys->dsf << 5) | /* system: 60fields/50fields */ (c->sys->dsf << 5) | /* system: 60fields/50fields */
0; /* signal type video compression */ (apt << 2); /* signal type video compression */
buf[4] = 0xff; /* VISC: 0xff -- no information */ buf[4] = 0xff; /* VISC: 0xff -- no information */
break; break;
case dv_video_control: case dv_video_control:
...@@ -312,12 +322,12 @@ static int dv_write_pack(enum dv_pack_type pack_id, DVMuxContext *c, uint8_t* bu ...@@ -312,12 +322,12 @@ static int dv_write_pack(enum dv_pack_type pack_id, DVMuxContext *c, uint8_t* bu
return 5; return 5;
} }
static inline int dv_write_dif_id(enum dv_section_type t, uint8_t seq_num, static inline int dv_write_dif_id(enum dv_section_type t, uint8_t chan_num, uint8_t seq_num,
uint8_t dif_num, uint8_t* buf) uint8_t dif_num, uint8_t* buf)
{ {
buf[0] = (uint8_t)t; /* Section type */ buf[0] = (uint8_t)t; /* Section type */
buf[1] = (seq_num<<4) | /* DIF seq number 0-9 for 525/60; 0-11 for 625/50 */ buf[1] = (seq_num<<4) | /* DIF seq number 0-9 for 525/60; 0-11 for 625/50 */
(0 << 3) | /* FSC: for 50Mb/s 0 - first channel; 1 - second */ (chan_num << 3) | /* FSC: for 50Mb/s 0 - first channel; 1 - second */
7; /* reserved -- always 1 */ 7; /* reserved -- always 1 */
buf[2] = dif_num; /* DIF block number Video: 0-134, Audio: 0-8 */ buf[2] = dif_num; /* DIF block number Video: 0-134, Audio: 0-8 */
return 3; return 3;
...@@ -347,54 +357,57 @@ static inline int dv_write_ssyb_id(uint8_t syb_num, uint8_t fr, uint8_t* buf) ...@@ -347,54 +357,57 @@ static inline int dv_write_ssyb_id(uint8_t syb_num, uint8_t fr, uint8_t* buf)
static void dv_format_frame(DVMuxContext *c, uint8_t* buf) static void dv_format_frame(DVMuxContext *c, uint8_t* buf)
{ {
int i, j, k; int chan, i, j, k;
for (i = 0; i < c->sys->difseg_size; i++) { for (chan = 0; chan < c->sys->n_difchan; chan++) {
memset(buf, 0xff, 80 * 6); /* First 6 DIF blocks are for control data */ for (i = 0; i < c->sys->difseg_size; i++) {
memset(buf, 0xff, 80 * 6); /* First 6 DIF blocks are for control data */
/* DV header: 1DIF */
buf += dv_write_dif_id(dv_sect_header, i, 0, buf); /* DV header: 1DIF */
buf += dv_write_pack((c->sys->dsf ? dv_header625 : dv_header525), c, buf); buf += dv_write_dif_id(dv_sect_header, chan, i, 0, buf);
buf += 72; /* unused bytes */ buf += dv_write_pack((c->sys->dsf ? dv_header625 : dv_header525), c, buf);
buf += 72; /* unused bytes */
/* DV subcode: 2DIFs */
for (j = 0; j < 2; j++) { /* DV subcode: 2DIFs */
buf += dv_write_dif_id( dv_sect_subcode, i, j, buf); for (j = 0; j < 2; j++) {
for (k = 0; k < 6; k++) { buf += dv_write_dif_id(dv_sect_subcode, chan, i, j, buf);
buf += dv_write_ssyb_id(k, (i < c->sys->difseg_size/2), buf); for (k = 0; k < 6; k++) {
buf += dv_write_pack(dv_ssyb_packs_dist[i][k], c, buf); buf += dv_write_ssyb_id(k, (i < c->sys->difseg_size/2), buf);
} buf += dv_write_pack(dv_ssyb_packs_dist[i][k], c, buf);
buf += 29; /* unused bytes */ }
} buf += 29; /* unused bytes */
}
/* DV VAUX: 3DIFs */ /* DV VAUX: 3DIFs */
for (j = 0; j < 3; j++) { for (j = 0; j < 3; j++) {
buf += dv_write_dif_id(dv_sect_vaux, i, j, buf); buf += dv_write_dif_id(dv_sect_vaux, chan, i, j, buf);
for (k = 0; k < 15 ; k++) for (k = 0; k < 15 ; k++)
buf += dv_write_pack(dv_vaux_packs_dist[i][k], c, buf); buf += dv_write_pack(dv_vaux_packs_dist[i][k], c, buf);
buf += 2; /* unused bytes */ buf += 2; /* unused bytes */
} }
/* DV Audio/Video: 135 Video DIFs + 9 Audio DIFs */ /* DV Audio/Video: 135 Video DIFs + 9 Audio DIFs */
for (j = 0; j < 135; j++) { for (j = 0; j < 135; j++) {
if (j%15 == 0) { if (j%15 == 0) {
memset(buf, 0xff, 80); memset(buf, 0xff, 80);
buf += dv_write_dif_id(dv_sect_audio, i, j/15, buf); buf += dv_write_dif_id(dv_sect_audio, chan, i, j/15, buf);
buf += 77; /* audio control & shuffled PCM audio */ buf += 77; /* audio control & shuffled PCM audio */
}
buf += dv_write_dif_id(dv_sect_video, chan, i, j, buf);
buf += 77; /* 1 video macro block: 1 bytes control
4 * 14 bytes Y 8x8 data
10 bytes Cr 8x8 data
10 bytes Cb 8x8 data */
} }
buf += dv_write_dif_id(dv_sect_video, i, j, buf); }
buf += 77; /* 1 video macro block: 1 bytes control
4 * 14 bytes Y 8x8 data
10 bytes Cr 8x8 data
10 bytes Cb 8x8 data */
}
} }
} }
static void dv_inject_audio(DVMuxContext *c, const uint8_t* pcm, uint8_t* frame_ptr) static void dv_inject_audio(DVMuxContext *c, const uint8_t* pcm, int channel, uint8_t* frame_ptr)
{ {
int i, j, d, of, size; int i, j, d, of, size;
size = 4 * dv_audio_frame_size(c->sys, c->frames); size = 4 * dv_audio_frame_size(c->sys, c->frames);
frame_ptr += channel * c->sys->difseg_size * 150 * 80;
for (i = 0; i < c->sys->difseg_size; i++) { for (i = 0; i < c->sys->difseg_size; i++) {
frame_ptr += 6 * 80; /* skip DIF segment header */ frame_ptr += 6 * 80; /* skip DIF segment header */
for (j = 0; j < 9; j++) { for (j = 0; j < 9; j++) {
...@@ -414,18 +427,20 @@ static void dv_inject_audio(DVMuxContext *c, const uint8_t* pcm, uint8_t* frame_ ...@@ -414,18 +427,20 @@ static void dv_inject_audio(DVMuxContext *c, const uint8_t* pcm, uint8_t* frame_
static void dv_inject_video(DVMuxContext *c, const uint8_t* video_data, uint8_t* frame_ptr) static void dv_inject_video(DVMuxContext *c, const uint8_t* video_data, uint8_t* frame_ptr)
{ {
int i, j; int chan, i, j;
int ptr = 0; int ptr = 0;
for (i = 0; i < c->sys->difseg_size; i++) { for (chan = 0; chan < c->sys->n_difchan; chan++) {
ptr += 6 * 80; /* skip DIF segment header */ for (i = 0; i < c->sys->difseg_size; i++) {
for (j = 0; j < 135; j++) { ptr += 6 * 80; /* skip DIF segment header */
if (j%15 == 0) for (j = 0; j < 135; j++) {
ptr += 80; /* skip Audio DIF */ if (j%15 == 0)
ptr += 3; ptr += 80; /* skip Audio DIF */
memcpy(frame_ptr + ptr, video_data + ptr, 77); ptr += 3;
ptr += 77; memcpy(frame_ptr + ptr, video_data + ptr, 77);
} ptr += 77;
}
}
} }
} }
...@@ -463,18 +478,17 @@ static const uint8_t* dv_extract_pack(uint8_t* frame, enum dv_pack_type t) ...@@ -463,18 +478,17 @@ static const uint8_t* dv_extract_pack(uint8_t* frame, enum dv_pack_type t)
* 3. Audio is always returned as 16bit linear samples: 12bit nonlinear samples * 3. Audio is always returned as 16bit linear samples: 12bit nonlinear samples
* are converted into 16bit linear ones. * are converted into 16bit linear ones.
*/ */
static int dv_extract_audio(uint8_t* frame, uint8_t* pcm, uint8_t* pcm2) static int dv_extract_audio(uint8_t* frame, uint8_t* pcm, uint8_t* pcm2,
const DVprofile *sys)
{ {
int size, i, j, d, of, smpls, freq, quant, half_ch; int size, chan, i, j, d, of, smpls, freq, quant, half_ch;
uint16_t lc, rc; uint16_t lc, rc;
const DVprofile* sys;
const uint8_t* as_pack; const uint8_t* as_pack;
as_pack = dv_extract_pack(frame, dv_audio_source); as_pack = dv_extract_pack(frame, dv_audio_source);
if (!as_pack) /* No audio ? */ if (!as_pack) /* No audio ? */
return 0; return 0;
sys = dv_frame_profile(frame);
smpls = as_pack[1] & 0x3f; /* samples in this frame - min. samples */ smpls = as_pack[1] & 0x3f; /* samples in this frame - min. samples */
freq = (as_pack[4] >> 3) & 0x07; /* 0 - 48KHz, 1 - 44,1kHz, 2 - 32 kHz */ freq = (as_pack[4] >> 3) & 0x07; /* 0 - 48KHz, 1 - 44,1kHz, 2 - 32 kHz */
quant = as_pack[4] & 0x07; /* 0 - 16bit linear, 1 - 12bit nonlinear */ quant = as_pack[4] & 0x07; /* 0 - 16bit linear, 1 - 12bit nonlinear */
...@@ -485,51 +499,61 @@ static int dv_extract_audio(uint8_t* frame, uint8_t* pcm, uint8_t* pcm2) ...@@ -485,51 +499,61 @@ static int dv_extract_audio(uint8_t* frame, uint8_t* pcm, uint8_t* pcm2)
size = (sys->audio_min_samples[freq] + smpls) * 4; /* 2ch, 2bytes */ size = (sys->audio_min_samples[freq] + smpls) * 4; /* 2ch, 2bytes */
half_ch = sys->difseg_size/2; half_ch = sys->difseg_size/2;
/* for each DIF segment */ /* for each DIF channel */
for (i = 0; i < sys->difseg_size; i++) { for (chan = 0; chan < sys->n_difchan; chan++) {
frame += 6 * 80; /* skip DIF segment header */ /* for each DIF segment */
if (quant == 1 && i == half_ch) { for (i = 0; i < sys->difseg_size; i++) {
if (!pcm2) frame += 6 * 80; /* skip DIF segment header */
break; if (quant == 1 && i == half_ch) {
else /* next stereo channel (12bit mode only) */
pcm = pcm2; if (!pcm2)
} break;
else
for (j = 0; j < 9; j++) { pcm = pcm2;
for (d = 8; d < 80; d += 2) { }
if (quant == 0) { /* 16bit quantization */
of = sys->audio_shuffle[i][j] + (d - 8)/2 * sys->audio_stride;
if (of*2 >= size)
continue;
pcm[of*2] = frame[d+1]; // FIXME: may be we have to admit
pcm[of*2+1] = frame[d]; // that DV is a big endian PCM
if (pcm[of*2+1] == 0x80 && pcm[of*2] == 0x00)
pcm[of*2+1] = 0;
} else { /* 12bit quantization */
lc = ((uint16_t)frame[d] << 4) |
((uint16_t)frame[d+2] >> 4);
rc = ((uint16_t)frame[d+1] << 4) |
((uint16_t)frame[d+2] & 0x0f);
lc = (lc == 0x800 ? 0 : dv_audio_12to16(lc));
rc = (rc == 0x800 ? 0 : dv_audio_12to16(rc));
of = sys->audio_shuffle[i%half_ch][j] + (d - 8)/3 * sys->audio_stride;
if (of*2 >= size)
continue;
pcm[of*2] = lc & 0xff; // FIXME: may be we have to admit
pcm[of*2+1] = lc >> 8; // that DV is a big endian PCM
of = sys->audio_shuffle[i%half_ch+half_ch][j] +
(d - 8)/3 * sys->audio_stride;
pcm[of*2] = rc & 0xff; // FIXME: may be we have to admit
pcm[of*2+1] = rc >> 8; // that DV is a big endian PCM
++d;
}
}
frame += 16 * 80; /* 15 Video DIFs + 1 Audio DIF */ /* for each AV sequence */
for (j = 0; j < 9; j++) {
for (d = 8; d < 80; d += 2) {
if (quant == 0) { /* 16bit quantization */
of = sys->audio_shuffle[i][j] + (d - 8)/2 * sys->audio_stride;
if (of*2 >= size)
continue;
pcm[of*2] = frame[d+1]; // FIXME: may be we have to admit
pcm[of*2+1] = frame[d]; // that DV is a big endian PCM
if (pcm[of*2+1] == 0x80 && pcm[of*2] == 0x00)
pcm[of*2+1] = 0;
} else { /* 12bit quantization */
lc = ((uint16_t)frame[d] << 4) |
((uint16_t)frame[d+2] >> 4);
rc = ((uint16_t)frame[d+1] << 4) |
((uint16_t)frame[d+2] & 0x0f);
lc = (lc == 0x800 ? 0 : dv_audio_12to16(lc));
rc = (rc == 0x800 ? 0 : dv_audio_12to16(rc));
of = sys->audio_shuffle[i%half_ch][j] + (d - 8)/3 * sys->audio_stride;
if (of*2 >= size)
continue;
pcm[of*2] = lc & 0xff; // FIXME: may be we have to admit
pcm[of*2+1] = lc >> 8; // that DV is a big endian PCM
of = sys->audio_shuffle[i%half_ch+half_ch][j] +
(d - 8)/3 * sys->audio_stride;
pcm[of*2] = rc & 0xff; // FIXME: may be we have to admit
pcm[of*2+1] = rc >> 8; // that DV is a big endian PCM
++d;
}
}
frame += 16 * 80; /* 15 Video DIFs + 1 Audio DIF */
}
} }
/* next stereo channel (50Mbps only) */
if(!pcm2)
break;
pcm = pcm2;
} }
return size; return size;
...@@ -538,20 +562,21 @@ static int dv_extract_audio(uint8_t* frame, uint8_t* pcm, uint8_t* pcm2) ...@@ -538,20 +562,21 @@ static int dv_extract_audio(uint8_t* frame, uint8_t* pcm, uint8_t* pcm2)
static int dv_extract_audio_info(DVDemuxContext* c, uint8_t* frame) static int dv_extract_audio_info(DVDemuxContext* c, uint8_t* frame)
{ {
const uint8_t* as_pack; const uint8_t* as_pack;
const DVprofile* sys; int freq, stype, smpls, quant, i, ach;
int freq, smpls, quant, i, ach;
sys = dv_frame_profile(frame);
as_pack = dv_extract_pack(frame, dv_audio_source); as_pack = dv_extract_pack(frame, dv_audio_source);
if (!as_pack || !sys) { /* No audio ? */ if (!as_pack || !c->sys) { /* No audio ? */
c->ach = 0; c->ach = 0;
return 0; return 0;
} }
smpls = as_pack[1] & 0x3f; /* samples in this frame - min. samples */ smpls = as_pack[1] & 0x3f; /* samples in this frame - min. samples */
freq = (as_pack[4] >> 3) & 0x07; /* 0 - 48KHz, 1 - 44,1kHz, 2 - 32 kHz */ freq = (as_pack[4] >> 3) & 0x07; /* 0 - 48KHz, 1 - 44,1kHz, 2 - 32 kHz */
stype = (as_pack[3] & 0x1f); /* 0 - 2CH, 2 - 4CH */
quant = as_pack[4] & 0x07; /* 0 - 16bit linear, 1 - 12bit nonlinear */ quant = as_pack[4] & 0x07; /* 0 - 16bit linear, 1 - 12bit nonlinear */
ach = (quant && freq == 2) ? 2 : 1;
/* note: ach counts PAIRS of channels (i.e. stereo channels) */
ach = (stype == 2 || (quant && (freq == 2))) ? 2 : 1;
/* Dynamic handling of the audio streams in DV */ /* Dynamic handling of the audio streams in DV */
for (i=0; i<ach; i++) { for (i=0; i<ach; i++) {
...@@ -576,37 +601,37 @@ static int dv_extract_audio_info(DVDemuxContext* c, uint8_t* frame) ...@@ -576,37 +601,37 @@ static int dv_extract_audio_info(DVDemuxContext* c, uint8_t* frame)
} }
c->ach = i; c->ach = i;
return (sys->audio_min_samples[freq] + smpls) * 4; /* 2ch, 2bytes */; return (c->sys->audio_min_samples[freq] + smpls) * 4; /* 2ch, 2bytes */;
} }
static int dv_extract_video_info(DVDemuxContext *c, uint8_t* frame) static int dv_extract_video_info(DVDemuxContext *c, uint8_t* frame)
{ {
const DVprofile* sys;
const uint8_t* vsc_pack; const uint8_t* vsc_pack;
AVCodecContext* avctx; AVCodecContext* avctx;
int apt, is16_9; int apt, is16_9;
int size = 0; int size = 0;
sys = dv_frame_profile(frame); if (c->sys) {
if (sys) {
avctx = c->vst->codec; avctx = c->vst->codec;
av_set_pts_info(c->vst, 64, sys->frame_rate_base, sys->frame_rate); av_set_pts_info(c->vst, 64, c->sys->frame_rate_base, c->sys->frame_rate);
avctx->time_base= (AVRational){sys->frame_rate_base, sys->frame_rate}; avctx->time_base= (AVRational){c->sys->frame_rate_base, c->sys->frame_rate};
if(!avctx->width){ if(!avctx->width){
avctx->width = sys->width; avctx->width = c->sys->width;
avctx->height = sys->height; avctx->height = c->sys->height;
} }
avctx->pix_fmt = sys->pix_fmt; avctx->pix_fmt = c->sys->pix_fmt;
/* finding out SAR is a little bit messy */ /* finding out SAR is a little bit messy */
vsc_pack = dv_extract_pack(frame, dv_video_control); vsc_pack = dv_extract_pack(frame, dv_video_control);
apt = frame[4] & 0x07; apt = frame[4] & 0x07;
is16_9 = (vsc_pack && ((vsc_pack[2] & 0x07) == 0x02 || is16_9 = (vsc_pack && ((vsc_pack[2] & 0x07) == 0x02 ||
(!apt && (vsc_pack[2] & 0x07) == 0x07))); (!apt && (vsc_pack[2] & 0x07) == 0x07)));
avctx->sample_aspect_ratio = sys->sar[is16_9]; avctx->sample_aspect_ratio = c->sys->sar[is16_9];
avctx->bit_rate = av_rescale(c->sys->frame_size * 8,
size = sys->frame_size; c->sys->frame_rate,
c->sys->frame_rate_base);
size = c->sys->frame_size;
} }
return size; return size;
} }
...@@ -619,10 +644,12 @@ int dv_assemble_frame(DVMuxContext *c, AVStream* st, ...@@ -619,10 +644,12 @@ int dv_assemble_frame(DVMuxContext *c, AVStream* st,
const uint8_t* data, int data_size, uint8_t** frame) const uint8_t* data, int data_size, uint8_t** frame)
{ {
uint8_t pcm[8192]; uint8_t pcm[8192];
int fsize, reqasize; int i;
*frame = &c->frame_buf[0]; *frame = &c->frame_buf[0];
if (c->has_audio && c->has_video) { /* must be a stale frame */ if (c->has_audio && c->has_video &&
(c->has_audio == -1 || c->has_audio == c->n_ast)) {
/* must be a stale frame */
dv_format_frame(c, *frame); dv_format_frame(c, *frame);
c->frames++; c->frames++;
if (c->has_audio > 0) if (c->has_audio > 0)
...@@ -642,46 +669,53 @@ int dv_assemble_frame(DVMuxContext *c, AVStream* st, ...@@ -642,46 +669,53 @@ int dv_assemble_frame(DVMuxContext *c, AVStream* st,
goto out; goto out;
} }
reqasize = 4 * dv_audio_frame_size(c->sys, c->frames); for (i = 0; i < c->n_ast; i++) {
fsize = fifo_size(&c->audio_data, c->audio_data.rptr); int reqasize, fsize;
if (st->codec->codec_type == CODEC_TYPE_AUDIO || (c->has_video && fsize >= reqasize)) { if (st != c->ast[i])
if (fsize + data_size >= reqasize && !c->has_audio) { continue;
if (fsize >= reqasize) { reqasize = 4 * dv_audio_frame_size(c->sys, c->frames);
fifo_read(&c->audio_data, &pcm[0], reqasize, &c->audio_data.rptr); fsize = fifo_size(&c->audio_data[i], c->audio_data[i].rptr);
} else { if (st->codec->codec_type == CODEC_TYPE_AUDIO ||
fifo_read(&c->audio_data, &pcm[0], fsize, &c->audio_data.rptr); (c->has_video && fsize >= reqasize)) {
memcpy(&pcm[fsize], &data[0], reqasize - fsize); if (fsize + data_size >= reqasize && (c->has_audio < c->n_ast)) {
data += reqasize - fsize; if (fsize >= reqasize) {
data_size -= reqasize - fsize; fifo_read(&c->audio_data[i], &pcm[0], reqasize, &c->audio_data[i].rptr);
} else {
fifo_read(&c->audio_data[i], &pcm[0], fsize, &c->audio_data[i].rptr);
memcpy(&pcm[fsize], &data[0], reqasize - fsize);
data += reqasize - fsize;
data_size -= reqasize - fsize;
}
dv_inject_audio(c, &pcm[0], i, *frame);
c->has_audio += 1;
} }
dv_inject_audio(c, &pcm[0], *frame); /* FIXME: we have to have more sensible approach than this one */
c->has_audio = 1; if (fifo_size(&c->audio_data[i], c->audio_data[i].rptr) + data_size >= 100*AVCODEC_MAX_AUDIO_FRAME_SIZE)
av_log(st->codec, AV_LOG_ERROR, "Can't process DV frame #%d. Insufficient video data or severe sync problem.\n", c->frames);
fifo_write(&c->audio_data[i], (uint8_t *)data, data_size, &c->audio_data[i].wptr);
} }
/* FIXME: we have to have more sensible approach than this one */
if (fifo_size(&c->audio_data, c->audio_data.rptr) + data_size >= 100*AVCODEC_MAX_AUDIO_FRAME_SIZE)
av_log(st->codec, AV_LOG_ERROR, "Can't process DV frame #%d. Insufficient video data or severe sync problem.\n", c->frames);
fifo_write(&c->audio_data, (uint8_t *)data, data_size, &c->audio_data.wptr);
} }
out: out:
return (c->has_audio && c->has_video) ? c->sys->frame_size : 0; return ((c->has_audio == -1 || c->has_audio == c->n_ast) && c->has_video) ? c->sys->frame_size : 0;
} }
DVMuxContext* dv_init_mux(AVFormatContext* s) DVMuxContext* dv_init_mux(AVFormatContext* s)
{ {
DVMuxContext *c; DVMuxContext *c;
AVStream *vst = NULL; AVStream *vst = NULL;
AVStream *ast = NULL;
int i; int i;
if (s->nb_streams > 2) /* we support at most 1 video and 2 audio streams */
if (s->nb_streams > 3)
return NULL; return NULL;
c = av_mallocz(sizeof(DVMuxContext)); c = av_mallocz(sizeof(DVMuxContext));
if (!c) if (!c)
return NULL; return NULL;
c->n_ast = 0;
c->ast[0] = c->ast[1] = NULL;
/* We have to sort out where audio and where video stream is */ /* We have to sort out where audio and where video stream is */
for (i=0; i<s->nb_streams; i++) { for (i=0; i<s->nb_streams; i++) {
switch (s->streams[i]->codec->codec_type) { switch (s->streams[i]->codec->codec_type) {
...@@ -689,8 +723,8 @@ DVMuxContext* dv_init_mux(AVFormatContext* s) ...@@ -689,8 +723,8 @@ DVMuxContext* dv_init_mux(AVFormatContext* s)
vst = s->streams[i]; vst = s->streams[i];
break; break;
case CODEC_TYPE_AUDIO: case CODEC_TYPE_AUDIO:
ast = s->streams[i]; c->ast[c->n_ast++] = s->streams[i];
break; break;
default: default:
goto bail_out; goto bail_out;
} }
...@@ -699,25 +733,39 @@ DVMuxContext* dv_init_mux(AVFormatContext* s) ...@@ -699,25 +733,39 @@ DVMuxContext* dv_init_mux(AVFormatContext* s)
/* Some checks -- DV format is very picky about its incoming streams */ /* Some checks -- DV format is very picky about its incoming streams */
if (!vst || vst->codec->codec_id != CODEC_ID_DVVIDEO) if (!vst || vst->codec->codec_id != CODEC_ID_DVVIDEO)
goto bail_out; goto bail_out;
if (ast && (ast->codec->codec_id != CODEC_ID_PCM_S16LE || for (i=0; i<c->n_ast; i++) {
ast->codec->sample_rate != 48000 || if (c->ast[i] && (c->ast[i]->codec->codec_id != CODEC_ID_PCM_S16LE ||
ast->codec->channels != 2)) c->ast[i]->codec->sample_rate != 48000 ||
goto bail_out; c->ast[i]->codec->channels != 2))
goto bail_out;
}
c->sys = dv_codec_profile(vst->codec); c->sys = dv_codec_profile(vst->codec);
if (!c->sys) if (!c->sys)
goto bail_out; goto bail_out;
if((c->n_ast > 1) && (c->sys->n_difchan < 2)) {
/* only 1 stereo pair is allowed in 25Mbps mode */
goto bail_out;
}
/* Ok, everything seems to be in working order */ /* Ok, everything seems to be in working order */
c->frames = 0; c->frames = 0;
c->has_audio = ast ? 0 : -1; c->has_audio = c->n_ast ? 0 : -1;
c->has_video = 0; c->has_video = 0;
c->start_time = (time_t)s->timestamp; c->start_time = (time_t)s->timestamp;
c->aspect = 0; /* 4:3 is the default */ c->aspect = 0; /* 4:3 is the default */
if ((int)(av_q2d(vst->codec->sample_aspect_ratio) * vst->codec->width / vst->codec->height * 10) == 17) /* 16:9 */ if ((int)(av_q2d(vst->codec->sample_aspect_ratio) * vst->codec->width / vst->codec->height * 10) == 17) /* 16:9 */
c->aspect = 0x07; c->aspect = 0x07;
if (ast && fifo_init(&c->audio_data, 100*AVCODEC_MAX_AUDIO_FRAME_SIZE) < 0) for (i=0; i<c->n_ast; i++) {
goto bail_out; if (c->ast[i] && fifo_init(&c->audio_data[i], 100*AVCODEC_MAX_AUDIO_FRAME_SIZE) < 0) {
while (i>0) {
i--;
fifo_free(&c->audio_data[i]);
}
goto bail_out;
}
}
dv_format_frame(c, &c->frame_buf[0]); dv_format_frame(c, &c->frame_buf[0]);
...@@ -730,7 +778,9 @@ bail_out: ...@@ -730,7 +778,9 @@ bail_out:
void dv_delete_mux(DVMuxContext *c) void dv_delete_mux(DVMuxContext *c)
{ {
fifo_free(&c->audio_data); int i;
for (i=0; i < c->n_ast; i++)
fifo_free(&c->audio_data[i]);
} }
DVDemuxContext* dv_init_demux(AVFormatContext *s) DVDemuxContext* dv_init_demux(AVFormatContext *s)
...@@ -747,6 +797,7 @@ DVDemuxContext* dv_init_demux(AVFormatContext *s) ...@@ -747,6 +797,7 @@ DVDemuxContext* dv_init_demux(AVFormatContext *s)
return NULL; return NULL;
} }
c->sys = NULL;
c->fctx = s; c->fctx = s;
c->ast[0] = c->ast[1] = NULL; c->ast[0] = c->ast[1] = NULL;
c->ach = 0; c->ach = 0;
...@@ -782,9 +833,8 @@ int dv_produce_packet(DVDemuxContext *c, AVPacket *pkt, ...@@ -782,9 +833,8 @@ int dv_produce_packet(DVDemuxContext *c, AVPacket *pkt,
uint8_t* buf, int buf_size) uint8_t* buf, int buf_size)
{ {
int size, i; int size, i;
const DVprofile* sys = dv_frame_profile(buf);
if (buf_size < 4 || buf_size < sys->frame_size) if (buf_size < 4 || buf_size < c->sys->frame_size)
return -1; /* Broken frame, or not enough data */ return -1; /* Broken frame, or not enough data */
/* Queueing audio packet */ /* Queueing audio packet */
...@@ -794,7 +844,7 @@ int dv_produce_packet(DVDemuxContext *c, AVPacket *pkt, ...@@ -794,7 +844,7 @@ int dv_produce_packet(DVDemuxContext *c, AVPacket *pkt,
c->audio_pkt[i].size = size; c->audio_pkt[i].size = size;
c->audio_pkt[i].pts = c->abytes * 30000*8 / c->ast[i]->codec->bit_rate; c->audio_pkt[i].pts = c->abytes * 30000*8 / c->ast[i]->codec->bit_rate;
} }
dv_extract_audio(buf, c->audio_buf[0], c->audio_buf[1]); dv_extract_audio(buf, c->audio_buf[0], c->audio_buf[1], c->sys);
c->abytes += size; c->abytes += size;
/* Now it's time to return video packet */ /* Now it's time to return video packet */
...@@ -838,24 +888,27 @@ void dv_flush_audio_packets(DVDemuxContext *c) ...@@ -838,24 +888,27 @@ void dv_flush_audio_packets(DVDemuxContext *c)
************************************************************/ ************************************************************/
typedef struct RawDVContext { typedef struct RawDVContext {
uint8_t buf[144000];
DVDemuxContext* dv_demux; DVDemuxContext* dv_demux;
uint8_t buf[DV_MAX_FRAME_SIZE];
} RawDVContext; } RawDVContext;
static int dv_read_header(AVFormatContext *s, static int dv_read_header(AVFormatContext *s,
AVFormatParameters *ap) AVFormatParameters *ap)
{ {
RawDVContext *c = s->priv_data; RawDVContext *c = s->priv_data;
const DVprofile* sys;
c->dv_demux = dv_init_demux(s); c->dv_demux = dv_init_demux(s);
if (!c->dv_demux) if (!c->dv_demux)
return -1; return -1;
if (get_buffer(&s->pb, c->buf, 4) <= 0 || url_fseek(&s->pb, -4, SEEK_CUR) < 0) if (get_buffer(&s->pb, c->buf, DV_PROFILE_BYTES) <= 0 ||
url_fseek(&s->pb, -DV_PROFILE_BYTES, SEEK_CUR) < 0)
return AVERROR_IO; return AVERROR_IO;
sys = dv_frame_profile(c->buf); c->dv_demux->sys = dv_frame_profile(c->buf);
s->bit_rate = av_rescale(sys->frame_size * 8, sys->frame_rate, sys->frame_rate_base); s->bit_rate = av_rescale(c->dv_demux->sys->frame_size * 8,
c->dv_demux->sys->frame_rate,
c->dv_demux->sys->frame_rate_base);
return 0; return 0;
} }
...@@ -869,11 +922,8 @@ static int dv_read_packet(AVFormatContext *s, AVPacket *pkt) ...@@ -869,11 +922,8 @@ static int dv_read_packet(AVFormatContext *s, AVPacket *pkt)
size = dv_get_packet(c->dv_demux, pkt); size = dv_get_packet(c->dv_demux, pkt);
if (size < 0) { if (size < 0) {
if (get_buffer(&s->pb, c->buf, 4) <= 0) size = c->dv_demux->sys->frame_size;
return AVERROR_IO; if (get_buffer(&s->pb, c->buf, size) <= 0)
size = dv_frame_profile(c->buf)->frame_size;
if (get_buffer(&s->pb, c->buf + 4, size - 4) <= 0)
return AVERROR_IO; return AVERROR_IO;
size = dv_produce_packet(c->dv_demux, pkt, c->buf, size); size = dv_produce_packet(c->dv_demux, pkt, c->buf, size);
...@@ -888,13 +938,12 @@ static int dv_read_seek(AVFormatContext *s, int stream_index, ...@@ -888,13 +938,12 @@ static int dv_read_seek(AVFormatContext *s, int stream_index,
RawDVContext *r = s->priv_data; RawDVContext *r = s->priv_data;
DVDemuxContext *c = r->dv_demux; DVDemuxContext *c = r->dv_demux;
int64_t offset= dv_frame_offset(s, c, timestamp, flags); int64_t offset= dv_frame_offset(s, c, timestamp, flags);
const DVprofile* sys = dv_codec_profile(c->vst->codec);
c->frames= offset / sys->frame_size; c->frames= offset / c->sys->frame_size;
if (c->ach) if (c->ach)
c->abytes= av_rescale(c->frames, c->abytes= av_rescale(c->frames,
c->ast[0]->codec->bit_rate * (int64_t)sys->frame_rate_base, c->ast[0]->codec->bit_rate * (int64_t)c->sys->frame_rate_base,
8*sys->frame_rate); 8*c->sys->frame_rate);
dv_flush_audio_packets(c); dv_flush_audio_packets(c);
return url_fseek(&s->pb, offset, SEEK_SET); return url_fseek(&s->pb, offset, SEEK_SET);
...@@ -914,7 +963,8 @@ static int dv_write_header(AVFormatContext *s) ...@@ -914,7 +963,8 @@ static int dv_write_header(AVFormatContext *s)
if (!s->priv_data) { if (!s->priv_data) {
av_log(s, AV_LOG_ERROR, "Can't initialize DV format!\n" av_log(s, AV_LOG_ERROR, "Can't initialize DV format!\n"
"Make sure that you supply exactly two streams:\n" "Make sure that you supply exactly two streams:\n"
" video: 25fps or 29.97fps, audio: 2ch/48Khz/PCM\n"); " video: 25fps or 29.97fps, audio: 2ch/48Khz/PCM\n"
" (50Mbps allows an optional second audio stream)\n");
return -1; return -1;
} }
return 0; return 0;
......
...@@ -137,6 +137,10 @@ stddev: 0.00 PSNR:99.99 bytes:7602176 ...@@ -137,6 +137,10 @@ stddev: 0.00 PSNR:99.99 bytes:7602176
7200000 ./data/a-dv.dv 7200000 ./data/a-dv.dv
c2082cd8adf417c4ebc32654e446cba1 *./data/out.yuv c2082cd8adf417c4ebc32654e446cba1 *./data/out.yuv
stddev: 8.86 PSNR:29.17 bytes:7602176 stddev: 8.86 PSNR:29.17 bytes:7602176
ff5eb084624f9a2846840a215b95a112 *./data/a-dv.dv
14400000 ./data/a-dv.dv
fc866b8879a34f5b440647e5135e4bfb *./data/out.yuv
stddev: 8.45 PSNR:29.58 bytes:7602176
979057a09f280acd2fba3b29de6125d1 *./data/a-svq1.mov 979057a09f280acd2fba3b29de6125d1 *./data/a-svq1.mov
1379847 ./data/a-svq1.mov 1379847 ./data/a-svq1.mov
bbff871d1475e1eee4231a08e075de2c *./data/out.yuv bbff871d1475e1eee4231a08e075de2c *./data/out.yuv
......
...@@ -83,6 +83,7 @@ else ...@@ -83,6 +83,7 @@ else
do_snowll=y do_snowll=y
do_adpcm_yam=y do_adpcm_yam=y
do_dv=y do_dv=y
do_dv50=y
fi fi
...@@ -497,6 +498,17 @@ do_ffmpeg $file -dct int -y -f pgmyuv -i $raw_src -s pal -an $file ...@@ -497,6 +498,17 @@ do_ffmpeg $file -dct int -y -f pgmyuv -i $raw_src -s pal -an $file
do_ffmpeg $raw_dst -y -i $file -f rawvideo -s cif $raw_dst do_ffmpeg $raw_dst -y -i $file -f rawvideo -s cif $raw_dst
fi fi
###################################
if [ -n "$do_dv50" ] ; then
# dv50 encoding
file=${outfile}dv.dv
do_ffmpeg $file -dct int -y -f pgmyuv -i $raw_src -s pal -pix_fmt yuv422p -an $file
# dv50 decoding
do_ffmpeg $raw_dst -y -i $file -f rawvideo -s cif -pix_fmt yuv420p $raw_dst
fi
################################### ###################################
if [ -n "$do_svq1" ] ; then if [ -n "$do_svq1" ] ; then
# svq1 encoding # svq1 encoding
......
...@@ -137,6 +137,10 @@ stddev: 0.00 PSNR:99.99 bytes:7602176 ...@@ -137,6 +137,10 @@ stddev: 0.00 PSNR:99.99 bytes:7602176
7200000 ./data/a-dv.dv 7200000 ./data/a-dv.dv
bb69dda7a84a5b166434e28e1243d3d1 *./data/out.yuv bb69dda7a84a5b166434e28e1243d3d1 *./data/out.yuv
stddev: 2.99 PSNR:38.59 bytes:7602176 stddev: 2.99 PSNR:38.59 bytes:7602176
177cbbbe50cbb67ae3bd6e7f10ff968b *./data/a-dv.dv
14400000 ./data/a-dv.dv
74b01209bb5e096d570dd4df112bb82d *./data/out.yuv
stddev: 2.98 PSNR:38.61 bytes:7602176
2905eb59262b093335b31df9f252c488 *./data/a-svq1.mov 2905eb59262b093335b31df9f252c488 *./data/a-svq1.mov
769547 ./data/a-svq1.mov 769547 ./data/a-svq1.mov
44777d1ddbccd0ef7f8d08394465670c *./data/out.yuv 44777d1ddbccd0ef7f8d08394465670c *./data/out.yuv
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment