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
Nick Kurshev
Benjamin Larsson
Loïc Le Loarer
Daniel Maas
Mike Melanson
Loren Merritt
Jeff Muizelaar
......
......@@ -6,6 +6,9 @@
* DV encoder
* 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
* of DV technical info.
*
......@@ -51,8 +54,12 @@ typedef struct DVVideoContext {
void (*idct_put[2])(uint8_t *dest, int line_size, DCTELEM *block);
} DVVideoContext;
/* MultiThreading - applies to entire DV codec, not just the avcontext */
uint8_t** dv_anchor;
/* MultiThreading - dv_anchor applies to entire DV codec, not just the avcontext */
/* 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
......@@ -118,11 +125,7 @@ static int dvvideo_init(AVCodecContext *avctx)
return -ENOMEM;
/* dv_anchor lets each thread know its Id */
dv_anchor = av_malloc(12*27*sizeof(void*));
if (!dv_anchor) {
return -ENOMEM;
}
for (i=0; i<12*27; i++)
for (i=0; i<DV_ANCHOR_SIZE; i++)
dv_anchor[i] = (void*)(size_t)i;
/* it's faster to include sign bit in a generic VLC parsing scheme */
......@@ -239,8 +242,15 @@ static int dvvideo_init(AVCodecContext *avctx)
dv_build_unquantize_tables(s, dsp.idct_permutation);
/* FIXME: I really don't think this should be here */
if (dv_codec_profile(avctx))
avctx->pix_fmt = dv_codec_profile(avctx)->pix_fmt;
s->sys = dv_codec_profile(avctx);
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;
s->avctx= avctx;
......@@ -495,13 +505,30 @@ static inline void dv_decode_video_segment(DVVideoContext *s,
v = *mb_pos_ptr++;
mb_x = v & 0xff;
mb_y = v >> 8;
if (s->sys->pix_fmt == PIX_FMT_YUV422P) {
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);
} else { /* 4:1:1 or 4:2:0 */
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
else /* 4:2:0 */
c_offset = (((mb_y >> 1) * s->picture.linesize[1] + (mb_x >> 1))<<log2_blocksize);
}
for(j = 0;j < 6; j++) {
idct_put = s->idct_put[mb->dct_mode && log2_blocksize==3];
if (s->sys->pix_fmt == PIX_FMT_YUV422P) { /* 4:2:2 */
if (j == 0 || j == 2) {
/* Y0 Y1 */
idct_put(y_ptr + ((j >> 1)<<log2_blocksize),
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);
}
/* note: j=1 and j=3 are "dummy" blocks in 4:2:2 */
} else { /* 4:1:1 or 4:2:0 */
if (j < 4) {
if (s->sys->pix_fmt == PIX_FMT_YUV411P && mb_x < (704 / 8)) {
/* NOTE: at end of line, the macroblock is handled as 420 */
......@@ -536,6 +563,7 @@ static inline void dv_decode_video_segment(DVVideoContext *s,
s->picture.linesize[6 - j], block);
}
}
}
block += 64;
mb++;
}
......@@ -845,14 +873,37 @@ static inline void dv_encode_video_segment(DVVideoContext *s,
v = *mb_pos_ptr++;
mb_x = v & 0xff;
mb_y = v >> 8;
if (s->sys->pix_fmt == PIX_FMT_YUV422P) {
y_ptr = s->picture.data[0] + (mb_y * s->picture.linesize[0] * 8) + (mb_x * 4);
} else { /* 4:1:1 */
y_ptr = s->picture.data[0] + (mb_y * s->picture.linesize[0] * 8) + (mb_x * 8);
c_offset = (s->sys->pix_fmt == PIX_FMT_YUV411P) ?
((mb_y * s->picture.linesize[1] * 8) + ((mb_x >> 2) * 8)) :
(((mb_y >> 1) * s->picture.linesize[1] * 8) + ((mb_x >> 1) * 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;
qnos[mb_index] = 15; /* No quantization */
ptr = dif + mb_index*80 + 4;
for(j = 0;j < 6; j++) {
int dummy = 0;
if (s->sys->pix_fmt == PIX_FMT_YUV422P) { /* 4:2:2 */
if (j == 0 || j == 2) {
/* 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 {
/* 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)) {
......@@ -868,6 +919,7 @@ static inline void dv_encode_video_segment(DVVideoContext *s,
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 */
if (do_edge_wrap) { /* Edge wrap copy: 4x16 -> 8x8 */
......@@ -881,6 +933,7 @@ static inline void dv_encode_video_segment(DVVideoContext *s,
b += 8;
}
} else { /* Simple copy: 8x8 -> 8x8 */
if (!dummy)
s->get_pixels(block, data, linesize);
}
......@@ -893,7 +946,13 @@ static inline void dv_encode_video_segment(DVVideoContext *s,
enc_blk->partial_bit_buffer = 0;
enc_blk->cur_ac = 0;
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,
enc_blk->dct_mode ? ff_zigzag248_direct : ff_zigzag_direct,
......@@ -950,7 +1009,17 @@ static int dv_decode_mt(AVCodecContext *avctx, void* sl)
{
DVVideoContext *s = avctx->priv_data;
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]);
return 0;
}
......@@ -959,13 +1028,23 @@ static int dv_encode_mt(AVCodecContext *avctx, void* sl)
{
DVVideoContext *s = avctx->priv_data;
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]);
return 0;
}
/* 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,
void *data, int *data_size,
uint8_t *buf, int buf_size)
......@@ -993,7 +1072,7 @@ static int dvvideo_decode_frame(AVCodecContext *avctx,
s->buf = buf;
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();
......@@ -1022,9 +1101,23 @@ static int dvvideo_encode_frame(AVCodecContext *c, uint8_t *buf, int buf_size,
s->buf = buf;
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();
/* 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;
}
......
......@@ -31,7 +31,8 @@
typedef struct DVprofile {
int dsf; /* value of the dsf in the DV header */
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_base;
int ltc_divisor; /* FPS from the LTS standpoint */
......@@ -1256,6 +1257,1206 @@ static const uint16_t dv_place_411[1350] = {
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 */
/* created by dvtables.py */
static const int dv_weight_bits = 18;
......@@ -1339,6 +2540,7 @@ static const DVprofile dv_profiles[] = {
{ .dsf = 0,
.frame_size = 120000, /* IEC 61834, SMPTE-314M - 525/60 (NTSC) */
.difseg_size = 10,
.n_difchan = 1,
.frame_rate = 30000,
.ltc_divisor = 30,
.frame_rate_base = 1001,
......@@ -1349,12 +2551,13 @@ static const DVprofile dv_profiles[] = {
.pix_fmt = PIX_FMT_YUV411P,
.audio_stride = 90,
.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,
},
{ .dsf = 1,
.frame_size = 144000, /* IEC 61834 - 625/50 (PAL) */
.difseg_size = 12,
.n_difchan = 1,
.frame_rate = 25,
.frame_rate_base = 1,
.ltc_divisor = 25,
......@@ -1371,6 +2574,7 @@ static const DVprofile dv_profiles[] = {
{ .dsf = 1,
.frame_size = 144000, /* SMPTE-314M - 625/50 (PAL) */
.difseg_size = 12,
.n_difchan = 1,
.frame_rate = 25,
.frame_rate_base = 1,
.ltc_divisor = 25,
......@@ -1383,29 +2587,79 @@ static const DVprofile dv_profiles[] = {
.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,
},
{ .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)
{
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 if ((frame[5] & 0x07) == 0) { /* APT flag */
return &dv_profiles[1];
} 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
return &dv_profiles[2];
}
static inline const DVprofile* dv_codec_profile(AVCodecContext* codec)
{
if (codec->width != 720) {
int i;
if (codec->width != 720)
return NULL;
for (i=0; i<sizeof(dv_profiles)/sizeof(DVprofile); i++)
if (codec->height == dv_profiles[i].height && codec->pix_fmt == dv_profiles[i].pix_fmt)
return &dv_profiles[i];
return NULL;
}
else if (codec->height == 480) {
return &dv_profiles[0];
}
else
return &dv_profiles[1];
}
......@@ -8,6 +8,9 @@
* Raw DV format
* 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
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
......@@ -28,6 +31,7 @@
#include "dv.h"
struct DVDemuxContext {
const DVprofile* sys; /* Current DV profile. E.g.: 525/60, 625/50 */
AVFormatContext* fctx;
AVStream* vst;
AVStream* ast[2];
......@@ -40,13 +44,15 @@ struct DVDemuxContext {
struct DVMuxContext {
const DVprofile* sys; /* Current DV profile. E.g.: 525/60, 625/50 */
uint8_t frame_buf[144000]; /* frame under contruction */
FifoBuffer audio_data; /* Fifo for storing excessive amounts of PCM */
int n_ast; /* Number of stereo audio streams (up to 2) */
AVStream *ast[2]; /* Stereo audio streams */
FifoBuffer audio_data[2]; /* Fifo for storing excessive amounts of PCM */
int frames; /* Number of a current frame */
time_t start_time; /* Start time of recording */
uint8_t aspect; /* Aspect ID 0 - 4:3, 7 - 16:9 */
int has_audio; /* frame under contruction has audio */
int has_video; /* frame under contruction has video */
uint8_t frame_buf[DV_MAX_FRAME_SIZE]; /* frame under contruction */
};
enum dv_section_type {
......@@ -177,21 +183,25 @@ static int dv_write_pack(enum dv_pack_type pack_id, DVMuxContext *c, uint8_t* bu
time_t ct;
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;
switch (pack_id) {
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 */
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 */
(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 */
(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 */
(0x0f << 3) | /* reserved -- always 1 */
(0 & 0x07); /* AP3: Subcode application ID */
(apt & 0x07); /* AP3: Subcode application ID */
break;
case dv_timecode:
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
buf[3] = (1 << 7) | /* res */
(1 << 6) | /* multi-language flag */
(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 */
(0 << 6) | /* emphasis time constant: 0 -- reserved */
(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
0xf; /* reserved -- always 1 */
buf[3] = (3 << 6) | /* reserved -- always 1 */
(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 */
break;
case dv_video_control:
......@@ -312,12 +322,12 @@ static int dv_write_pack(enum dv_pack_type pack_id, DVMuxContext *c, uint8_t* bu
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)
{
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 */
(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 */
buf[2] = dif_num; /* DIF block number Video: 0-134, Audio: 0-8 */
return 3;
......@@ -347,19 +357,20 @@ 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)
{
int i, j, k;
int chan, i, j, k;
for (chan = 0; chan < c->sys->n_difchan; chan++) {
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);
buf += dv_write_dif_id(dv_sect_header, chan, i, 0, buf);
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++) {
buf += dv_write_dif_id( dv_sect_subcode, i, j, buf);
buf += dv_write_dif_id(dv_sect_subcode, chan, i, j, buf);
for (k = 0; k < 6; k++) {
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);
......@@ -369,7 +380,7 @@ static void dv_format_frame(DVMuxContext *c, uint8_t* buf)
/* DV VAUX: 3DIFs */
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++)
buf += dv_write_pack(dv_vaux_packs_dist[i][k], c, buf);
buf += 2; /* unused bytes */
......@@ -379,22 +390,24 @@ static void dv_format_frame(DVMuxContext *c, uint8_t* buf)
for (j = 0; j < 135; j++) {
if (j%15 == 0) {
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 += dv_write_dif_id(dv_sect_video, i, j, buf);
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 */
}
}
}
}
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;
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++) {
frame_ptr += 6 * 80; /* skip DIF segment header */
for (j = 0; j < 9; j++) {
......@@ -414,9 +427,10 @@ 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)
{
int i, j;
int chan, i, j;
int ptr = 0;
for (chan = 0; chan < c->sys->n_difchan; chan++) {
for (i = 0; i < c->sys->difseg_size; i++) {
ptr += 6 * 80; /* skip DIF segment header */
for (j = 0; j < 135; j++) {
......@@ -427,6 +441,7 @@ static void dv_inject_video(DVMuxContext *c, const uint8_t* video_data, uint8_t*
ptr += 77;
}
}
}
}
/*
......@@ -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
* 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;
const DVprofile* sys;
const uint8_t* as_pack;
as_pack = dv_extract_pack(frame, dv_audio_source);
if (!as_pack) /* No audio ? */
return 0;
sys = dv_frame_profile(frame);
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 */
quant = as_pack[4] & 0x07; /* 0 - 16bit linear, 1 - 12bit nonlinear */
......@@ -485,16 +499,20 @@ static int dv_extract_audio(uint8_t* frame, uint8_t* pcm, uint8_t* pcm2)
size = (sys->audio_min_samples[freq] + smpls) * 4; /* 2ch, 2bytes */
half_ch = sys->difseg_size/2;
/* for each DIF channel */
for (chan = 0; chan < sys->n_difchan; chan++) {
/* for each DIF segment */
for (i = 0; i < sys->difseg_size; i++) {
frame += 6 * 80; /* skip DIF segment header */
if (quant == 1 && i == half_ch) {
/* next stereo channel (12bit mode only) */
if (!pcm2)
break;
else
pcm = pcm2;
}
/* for each AV sequence */
for (j = 0; j < 9; j++) {
for (d = 8; d < 80; d += 2) {
if (quant == 0) { /* 16bit quantization */
......@@ -532,26 +550,33 @@ static int dv_extract_audio(uint8_t* frame, uint8_t* pcm, uint8_t* pcm2)
}
}
/* next stereo channel (50Mbps only) */
if(!pcm2)
break;
pcm = pcm2;
}
return size;
}
static int dv_extract_audio_info(DVDemuxContext* c, uint8_t* frame)
{
const uint8_t* as_pack;
const DVprofile* sys;
int freq, smpls, quant, i, ach;
int freq, stype, smpls, quant, i, ach;
sys = dv_frame_profile(frame);
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;
return 0;
}
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 */
stype = (as_pack[3] & 0x1f); /* 0 - 2CH, 2 - 4CH */
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 */
for (i=0; i<ach; i++) {
......@@ -576,37 +601,37 @@ static int dv_extract_audio_info(DVDemuxContext* c, uint8_t* frame)
}
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)
{
const DVprofile* sys;
const uint8_t* vsc_pack;
AVCodecContext* avctx;
int apt, is16_9;
int size = 0;
sys = dv_frame_profile(frame);
if (sys) {
if (c->sys) {
avctx = c->vst->codec;
av_set_pts_info(c->vst, 64, sys->frame_rate_base, sys->frame_rate);
avctx->time_base= (AVRational){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){c->sys->frame_rate_base, c->sys->frame_rate};
if(!avctx->width){
avctx->width = sys->width;
avctx->height = sys->height;
avctx->width = c->sys->width;
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 */
vsc_pack = dv_extract_pack(frame, dv_video_control);
apt = frame[4] & 0x07;
is16_9 = (vsc_pack && ((vsc_pack[2] & 0x07) == 0x02 ||
(!apt && (vsc_pack[2] & 0x07) == 0x07)));
avctx->sample_aspect_ratio = sys->sar[is16_9];
size = sys->frame_size;
avctx->sample_aspect_ratio = c->sys->sar[is16_9];
avctx->bit_rate = av_rescale(c->sys->frame_size * 8,
c->sys->frame_rate,
c->sys->frame_rate_base);
size = c->sys->frame_size;
}
return size;
}
......@@ -619,10 +644,12 @@ int dv_assemble_frame(DVMuxContext *c, AVStream* st,
const uint8_t* data, int data_size, uint8_t** frame)
{
uint8_t pcm[8192];
int fsize, reqasize;
int i;
*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);
c->frames++;
if (c->has_audio > 0)
......@@ -642,46 +669,53 @@ int dv_assemble_frame(DVMuxContext *c, AVStream* st,
goto out;
}
for (i = 0; i < c->n_ast; i++) {
int reqasize, fsize;
if (st != c->ast[i])
continue;
reqasize = 4 * dv_audio_frame_size(c->sys, c->frames);
fsize = fifo_size(&c->audio_data, c->audio_data.rptr);
if (st->codec->codec_type == CODEC_TYPE_AUDIO || (c->has_video && fsize >= reqasize)) {
if (fsize + data_size >= reqasize && !c->has_audio) {
fsize = fifo_size(&c->audio_data[i], c->audio_data[i].rptr);
if (st->codec->codec_type == CODEC_TYPE_AUDIO ||
(c->has_video && fsize >= reqasize)) {
if (fsize + data_size >= reqasize && (c->has_audio < c->n_ast)) {
if (fsize >= reqasize) {
fifo_read(&c->audio_data, &pcm[0], reqasize, &c->audio_data.rptr);
fifo_read(&c->audio_data[i], &pcm[0], reqasize, &c->audio_data[i].rptr);
} else {
fifo_read(&c->audio_data, &pcm[0], fsize, &c->audio_data.rptr);
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], *frame);
c->has_audio = 1;
dv_inject_audio(c, &pcm[0], i, *frame);
c->has_audio += 1;
}
/* 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)
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, (uint8_t *)data, data_size, &c->audio_data.wptr);
fifo_write(&c->audio_data[i], (uint8_t *)data, data_size, &c->audio_data[i].wptr);
}
}
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 *c;
AVStream *vst = NULL;
AVStream *ast = NULL;
int i;
if (s->nb_streams > 2)
/* we support at most 1 video and 2 audio streams */
if (s->nb_streams > 3)
return NULL;
c = av_mallocz(sizeof(DVMuxContext));
if (!c)
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 */
for (i=0; i<s->nb_streams; i++) {
switch (s->streams[i]->codec->codec_type) {
......@@ -689,7 +723,7 @@ DVMuxContext* dv_init_mux(AVFormatContext* s)
vst = s->streams[i];
break;
case CODEC_TYPE_AUDIO:
ast = s->streams[i];
c->ast[c->n_ast++] = s->streams[i];
break;
default:
goto bail_out;
......@@ -699,25 +733,39 @@ DVMuxContext* dv_init_mux(AVFormatContext* s)
/* Some checks -- DV format is very picky about its incoming streams */
if (!vst || vst->codec->codec_id != CODEC_ID_DVVIDEO)
goto bail_out;
if (ast && (ast->codec->codec_id != CODEC_ID_PCM_S16LE ||
ast->codec->sample_rate != 48000 ||
ast->codec->channels != 2))
for (i=0; i<c->n_ast; i++) {
if (c->ast[i] && (c->ast[i]->codec->codec_id != CODEC_ID_PCM_S16LE ||
c->ast[i]->codec->sample_rate != 48000 ||
c->ast[i]->codec->channels != 2))
goto bail_out;
}
c->sys = dv_codec_profile(vst->codec);
if (!c->sys)
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 */
c->frames = 0;
c->has_audio = ast ? 0 : -1;
c->has_audio = c->n_ast ? 0 : -1;
c->has_video = 0;
c->start_time = (time_t)s->timestamp;
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 */
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++) {
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]);
......@@ -730,7 +778,9 @@ bail_out:
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)
......@@ -747,6 +797,7 @@ DVDemuxContext* dv_init_demux(AVFormatContext *s)
return NULL;
}
c->sys = NULL;
c->fctx = s;
c->ast[0] = c->ast[1] = NULL;
c->ach = 0;
......@@ -782,9 +833,8 @@ int dv_produce_packet(DVDemuxContext *c, AVPacket *pkt,
uint8_t* buf, int buf_size)
{
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 */
/* Queueing audio packet */
......@@ -794,7 +844,7 @@ int dv_produce_packet(DVDemuxContext *c, AVPacket *pkt,
c->audio_pkt[i].size = size;
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;
/* Now it's time to return video packet */
......@@ -838,24 +888,27 @@ void dv_flush_audio_packets(DVDemuxContext *c)
************************************************************/
typedef struct RawDVContext {
uint8_t buf[144000];
DVDemuxContext* dv_demux;
uint8_t buf[DV_MAX_FRAME_SIZE];
} RawDVContext;
static int dv_read_header(AVFormatContext *s,
AVFormatParameters *ap)
{
RawDVContext *c = s->priv_data;
const DVprofile* sys;
c->dv_demux = dv_init_demux(s);
if (!c->dv_demux)
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;
sys = dv_frame_profile(c->buf);
s->bit_rate = av_rescale(sys->frame_size * 8, sys->frame_rate, sys->frame_rate_base);
c->dv_demux->sys = dv_frame_profile(c->buf);
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;
}
......@@ -869,11 +922,8 @@ static int dv_read_packet(AVFormatContext *s, AVPacket *pkt)
size = dv_get_packet(c->dv_demux, pkt);
if (size < 0) {
if (get_buffer(&s->pb, c->buf, 4) <= 0)
return AVERROR_IO;
size = dv_frame_profile(c->buf)->frame_size;
if (get_buffer(&s->pb, c->buf + 4, size - 4) <= 0)
size = c->dv_demux->sys->frame_size;
if (get_buffer(&s->pb, c->buf, size) <= 0)
return AVERROR_IO;
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,
RawDVContext *r = s->priv_data;
DVDemuxContext *c = r->dv_demux;
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)
c->abytes= av_rescale(c->frames,
c->ast[0]->codec->bit_rate * (int64_t)sys->frame_rate_base,
8*sys->frame_rate);
c->ast[0]->codec->bit_rate * (int64_t)c->sys->frame_rate_base,
8*c->sys->frame_rate);
dv_flush_audio_packets(c);
return url_fseek(&s->pb, offset, SEEK_SET);
......@@ -914,7 +963,8 @@ static int dv_write_header(AVFormatContext *s)
if (!s->priv_data) {
av_log(s, AV_LOG_ERROR, "Can't initialize DV format!\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 0;
......
......@@ -137,6 +137,10 @@ stddev: 0.00 PSNR:99.99 bytes:7602176
7200000 ./data/a-dv.dv
c2082cd8adf417c4ebc32654e446cba1 *./data/out.yuv
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
1379847 ./data/a-svq1.mov
bbff871d1475e1eee4231a08e075de2c *./data/out.yuv
......
......@@ -83,6 +83,7 @@ else
do_snowll=y
do_adpcm_yam=y
do_dv=y
do_dv50=y
fi
......@@ -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
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
# svq1 encoding
......
......@@ -137,6 +137,10 @@ stddev: 0.00 PSNR:99.99 bytes:7602176
7200000 ./data/a-dv.dv
bb69dda7a84a5b166434e28e1243d3d1 *./data/out.yuv
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
769547 ./data/a-svq1.mov
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