dv: Move a table used only by the demuxer out of a shared header.
[ffmpeg.git] / libavcodec / dvdata.h
1 /*
2  * Constants for DV codec
3  * Copyright (c) 2002 Fabrice Bellard
4  *
5  * This file is part of Libav.
6  *
7  * Libav is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public
9  * License as published by the Free Software Foundation; either
10  * version 2.1 of the License, or (at your option) any later version.
11  *
12  * Libav is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with Libav; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20  */
21
22 /**
23  * @file
24  * Constants for DV codec.
25  */
26
27 #ifndef AVCODEC_DVDATA_H
28 #define AVCODEC_DVDATA_H
29
30 #include "libavutil/rational.h"
31 #include "avcodec.h"
32
33 typedef struct DVwork_chunk {
34     uint16_t  buf_offset;
35     uint16_t  mb_coordinates[5];
36 } DVwork_chunk;
37
38 /*
39  * DVprofile is used to express the differences between various
40  * DV flavors. For now it's primarily used for differentiating
41  * 525/60 and 625/50, but the plans are to use it for various
42  * DV specs as well (e.g. SMPTE314M vs. IEC 61834).
43  */
44 typedef struct DVprofile {
45     int              dsf;                   /* value of the dsf in the DV header */
46     int              video_stype;           /* stype for VAUX source pack */
47     int              frame_size;            /* total size of one frame in bytes */
48     int              difseg_size;           /* number of DIF segments per DIF channel */
49     int              n_difchan;             /* number of DIF channels per frame */
50     AVRational       time_base;             /* 1/framerate */
51     int              ltc_divisor;           /* FPS from the LTS standpoint */
52     int              height;                /* picture height in pixels */
53     int              width;                 /* picture width in pixels */
54     AVRational       sar[2];                /* sample aspect ratios for 4:3 and 16:9 */
55     DVwork_chunk    *work_chunks;           /* each thread gets its own chunk of frame to work on */
56     uint32_t        *idct_factor;           /* set of iDCT factor tables */
57     enum PixelFormat pix_fmt;               /* picture pixel format */
58     int              bpm;                   /* blocks per macroblock */
59     const uint8_t   *block_sizes;           /* AC block sizes, in bits */
60     int              audio_stride;          /* size of audio_shuffle table */
61     int              audio_min_samples[3];  /* min amount of audio samples */
62                                             /* for 48kHz, 44.1kHz and 32kHz */
63     int              audio_samples_dist[5]; /* how many samples are supposed to be */
64                                             /* in each frame in a 5 frames window */
65     const uint8_t  (*audio_shuffle)[9];     /* PCM shuffling table */
66 } DVprofile;
67
68 static const uint8_t dv_audio_shuffle525[10][9] = {
69   {  0, 30, 60, 20, 50, 80, 10, 40, 70 }, /* 1st channel */
70   {  6, 36, 66, 26, 56, 86, 16, 46, 76 },
71   { 12, 42, 72,  2, 32, 62, 22, 52, 82 },
72   { 18, 48, 78,  8, 38, 68, 28, 58, 88 },
73   { 24, 54, 84, 14, 44, 74,  4, 34, 64 },
74
75   {  1, 31, 61, 21, 51, 81, 11, 41, 71 }, /* 2nd channel */
76   {  7, 37, 67, 27, 57, 87, 17, 47, 77 },
77   { 13, 43, 73,  3, 33, 63, 23, 53, 83 },
78   { 19, 49, 79,  9, 39, 69, 29, 59, 89 },
79   { 25, 55, 85, 15, 45, 75,  5, 35, 65 },
80 };
81
82 static const uint8_t dv_audio_shuffle625[12][9] = {
83   {   0,  36,  72,  26,  62,  98,  16,  52,  88}, /* 1st channel */
84   {   6,  42,  78,  32,  68, 104,  22,  58,  94},
85   {  12,  48,  84,   2,  38,  74,  28,  64, 100},
86   {  18,  54,  90,   8,  44,  80,  34,  70, 106},
87   {  24,  60,  96,  14,  50,  86,   4,  40,  76},
88   {  30,  66, 102,  20,  56,  92,  10,  46,  82},
89
90   {   1,  37,  73,  27,  63,  99,  17,  53,  89}, /* 2nd channel */
91   {   7,  43,  79,  33,  69, 105,  23,  59,  95},
92   {  13,  49,  85,   3,  39,  75,  29,  65, 101},
93   {  19,  55,  91,   9,  45,  81,  35,  71, 107},
94   {  25,  61,  97,  15,  51,  87,   5,  41,  77},
95   {  31,  67, 103,  21,  57,  93,  11,  47,  83},
96 };
97
98 /* macroblock bit budgets */
99 static const uint8_t block_sizes_dv2550[8] = {
100     112, 112, 112, 112, 80, 80, 0, 0,
101 };
102
103 static const uint8_t block_sizes_dv100[8] = {
104     80, 80, 80, 80, 80, 80, 64, 64,
105 };
106
107 enum dv_section_type {
108      dv_sect_header  = 0x1f,
109      dv_sect_subcode = 0x3f,
110      dv_sect_vaux    = 0x56,
111      dv_sect_audio   = 0x76,
112      dv_sect_video   = 0x96,
113 };
114
115 enum dv_pack_type {
116      dv_header525     = 0x3f, /* see dv_write_pack for important details on */
117      dv_header625     = 0xbf, /* these two packs */
118      dv_timecode      = 0x13,
119      dv_audio_source  = 0x50,
120      dv_audio_control = 0x51,
121      dv_audio_recdate = 0x52,
122      dv_audio_rectime = 0x53,
123      dv_video_source  = 0x60,
124      dv_video_control = 0x61,
125      dv_video_recdate = 0x62,
126      dv_video_rectime = 0x63,
127      dv_unknown_pack  = 0xff,
128 };
129
130 #define DV_PROFILE_IS_HD(p) ((p)->video_stype & 0x10)
131 #define DV_PROFILE_IS_1080i50(p) (((p)->video_stype == 0x14) && ((p)->dsf == 1))
132 #define DV_PROFILE_IS_720p50(p)  (((p)->video_stype == 0x18) && ((p)->dsf == 1))
133
134 /* minimum number of bytes to read from a DV stream in order to
135    determine the profile */
136 #define DV_PROFILE_BYTES (6*80) /* 6 DIF blocks */
137
138 /**
139  * largest possible DV frame, in bytes (1080i50)
140  */
141 #define DV_MAX_FRAME_SIZE 576000
142
143 /**
144  * maximum number of blocks per macroblock in any DV format
145  */
146 #define DV_MAX_BPM 8
147
148 const DVprofile* avpriv_dv_frame_profile(const DVprofile *sys,
149                                          const uint8_t* frame, unsigned buf_size);
150 const DVprofile* avpriv_dv_codec_profile(AVCodecContext* codec);
151
152 #endif /* AVCODEC_DVDATA_H */