Mercurial > libavcodec.hg
comparison dca.c @ 8100:8d08a75eac3d libavcodec
Add channel layouts for dca.
author | banan |
---|---|
date | Sat, 01 Nov 2008 20:27:05 +0000 |
parents | c23f2088d7c0 |
children | 38c1cbbb4245 |
comparison
equal
deleted
inserted
replaced
8099:bc786a34f6eb | 8100:8d08a75eac3d |
---|---|
56 DCA_3F1R, | 56 DCA_3F1R, |
57 DCA_2F2R, | 57 DCA_2F2R, |
58 DCA_3F2R, | 58 DCA_3F2R, |
59 DCA_4F2R | 59 DCA_4F2R |
60 }; | 60 }; |
61 | |
62 /* Tables for mapping dts channel configurations to libavcodec multichannel api. | |
63 * Some compromises have been made for special configurations. Most configurations | |
64 * are never used so complete accuracy is not needed. | |
65 * | |
66 * L = left, R = right, C = center, S = surround, F = front, R = rear, T = total, OV = overhead. | |
67 * S -> back, when both rear and back are configured move one of them to the side channel | |
68 * OV -> center back | |
69 * All 2 channel configurations -> CHANNEL_LAYOUT_STEREO | |
70 */ | |
71 | |
72 static const int64_t dca_core_channel_layout[] = { | |
73 CHANNEL_FRONT_CENTER, ///< 1, A | |
74 CHANNEL_LAYOUT_STEREO, ///< 2, A + B (dual mono) | |
75 CHANNEL_LAYOUT_STEREO, ///< 2, L + R (stereo) | |
76 CHANNEL_LAYOUT_STEREO, ///< 2, (L+R) + (L-R) (sum-difference) | |
77 CHANNEL_LAYOUT_STEREO, ///< 2, LT +RT (left and right total) | |
78 CHANNEL_LAYOUT_STEREO|CHANNEL_FRONT_CENTER, ///< 3, C+L+R | |
79 CHANNEL_LAYOUT_STEREO|CHANNEL_BACK_CENTER, ///< 3, L+R+S | |
80 CHANNEL_LAYOUT_STEREO|CHANNEL_FRONT_CENTER|CHANNEL_BACK_CENTER, ///< 4, C + L + R+ S | |
81 CHANNEL_LAYOUT_STEREO|CHANNEL_BACK_LEFT|CHANNEL_BACK_RIGHT, ///< 4, L + R+ SL+SR | |
82 CHANNEL_LAYOUT_STEREO|CHANNEL_FRONT_CENTER|CHANNEL_BACK_LEFT|CHANNEL_BACK_RIGHT, ///< 5, C + L + R+ SL+SR | |
83 CHANNEL_LAYOUT_STEREO|CHANNEL_BACK_LEFT|CHANNEL_BACK_RIGHT|CHANNEL_FRONT_LEFT_OF_CENTER|CHANNEL_FRONT_RIGHT_OF_CENTER, ///< 6, CL + CR + L + R + SL + SR | |
84 CHANNEL_LAYOUT_STEREO|CHANNEL_BACK_LEFT|CHANNEL_BACK_RIGHT|CHANNEL_FRONT_CENTER|CHANNEL_BACK_CENTER, ///< 6, C + L + R+ LR + RR + OV | |
85 CHANNEL_FRONT_CENTER|CHANNEL_FRONT_RIGHT_OF_CENTER|CHANNEL_FRONT_LEFT_OF_CENTER|CHANNEL_BACK_CENTER|CHANNEL_BACK_LEFT|CHANNEL_BACK_RIGHT, ///< 6, CF+ CR+LF+ RF+LR + RR | |
86 CHANNEL_FRONT_LEFT_OF_CENTER|CHANNEL_FRONT_CENTER|CHANNEL_FRONT_RIGHT_OF_CENTER|CHANNEL_LAYOUT_STEREO|CHANNEL_BACK_LEFT|CHANNEL_BACK_RIGHT, ///< 7, CL + C + CR + L + R + SL + SR | |
87 CHANNEL_FRONT_LEFT_OF_CENTER|CHANNEL_FRONT_RIGHT_OF_CENTER|CHANNEL_LAYOUT_STEREO|CHANNEL_SIDE_LEFT|CHANNEL_SIDE_RIGHT|CHANNEL_BACK_LEFT|CHANNEL_BACK_RIGHT, ///< 8, CL + CR + L + R + SL1 + SL2+ SR1 + SR2 | |
88 CHANNEL_FRONT_LEFT_OF_CENTER|CHANNEL_FRONT_CENTER|CHANNEL_FRONT_RIGHT_OF_CENTER|CHANNEL_LAYOUT_STEREO|CHANNEL_BACK_LEFT|CHANNEL_BACK_CENTER|CHANNEL_BACK_RIGHT, ///< 8, CL + C+ CR + L + R + SL + S+ SR | |
89 | |
90 /* The following entries adds the LFE layouts, this way we can reuse the table for the AVCodec channel_layouts member*/ | |
91 CHANNEL_FRONT_CENTER|CHANNEL_LOW_FREQUENCY, | |
92 CHANNEL_LAYOUT_STEREO|CHANNEL_LOW_FREQUENCY, | |
93 CHANNEL_LAYOUT_STEREO|CHANNEL_FRONT_CENTER|CHANNEL_LOW_FREQUENCY, | |
94 CHANNEL_LAYOUT_STEREO|CHANNEL_BACK_CENTER|CHANNEL_LOW_FREQUENCY, | |
95 CHANNEL_LAYOUT_STEREO|CHANNEL_FRONT_CENTER|CHANNEL_BACK_CENTER|CHANNEL_LOW_FREQUENCY, | |
96 CHANNEL_LAYOUT_STEREO|CHANNEL_BACK_LEFT|CHANNEL_BACK_RIGHT|CHANNEL_LOW_FREQUENCY, | |
97 CHANNEL_LAYOUT_STEREO|CHANNEL_FRONT_CENTER|CHANNEL_BACK_LEFT|CHANNEL_BACK_RIGHT|CHANNEL_LOW_FREQUENCY, | |
98 CHANNEL_LAYOUT_STEREO|CHANNEL_BACK_LEFT|CHANNEL_BACK_RIGHT|CHANNEL_FRONT_LEFT_OF_CENTER|CHANNEL_FRONT_RIGHT_OF_CENTER|CHANNEL_LOW_FREQUENCY, | |
99 CHANNEL_LAYOUT_STEREO|CHANNEL_BACK_LEFT|CHANNEL_BACK_RIGHT|CHANNEL_FRONT_CENTER|CHANNEL_BACK_CENTER|CHANNEL_LOW_FREQUENCY, | |
100 CHANNEL_FRONT_CENTER|CHANNEL_FRONT_RIGHT_OF_CENTER|CHANNEL_FRONT_LEFT_OF_CENTER|CHANNEL_BACK_CENTER|CHANNEL_BACK_LEFT|CHANNEL_BACK_RIGHT|CHANNEL_LOW_FREQUENCY, | |
101 CHANNEL_FRONT_LEFT_OF_CENTER|CHANNEL_FRONT_CENTER|CHANNEL_FRONT_RIGHT_OF_CENTER|CHANNEL_LAYOUT_STEREO|CHANNEL_BACK_LEFT|CHANNEL_BACK_RIGHT|CHANNEL_LOW_FREQUENCY, | |
102 CHANNEL_FRONT_LEFT_OF_CENTER|CHANNEL_FRONT_RIGHT_OF_CENTER|CHANNEL_LAYOUT_STEREO|CHANNEL_SIDE_LEFT|CHANNEL_SIDE_RIGHT|CHANNEL_BACK_LEFT|CHANNEL_BACK_RIGHT|CHANNEL_LOW_FREQUENCY, | |
103 CHANNEL_FRONT_LEFT_OF_CENTER|CHANNEL_FRONT_CENTER|CHANNEL_FRONT_RIGHT_OF_CENTER|CHANNEL_LAYOUT_STEREO|CHANNEL_BACK_LEFT|CHANNEL_BACK_CENTER|CHANNEL_BACK_RIGHT|CHANNEL_LOW_FREQUENCY, | |
104 0, | |
105 }; | |
106 | |
61 | 107 |
62 #define DCA_DOLBY 101 /* FIXME */ | 108 #define DCA_DOLBY 101 /* FIXME */ |
63 | 109 |
64 #define DCA_CHANNEL_BITS 6 | 110 #define DCA_CHANNEL_BITS 6 |
65 #define DCA_CHANNEL_MASK 0x3F | 111 #define DCA_CHANNEL_MASK 0x3F |
1163 | 1209 |
1164 channels = s->prim_channels + !!s->lfe; | 1210 channels = s->prim_channels + !!s->lfe; |
1165 if(avctx->request_channels == 2 && s->prim_channels > 2) { | 1211 if(avctx->request_channels == 2 && s->prim_channels > 2) { |
1166 channels = 2; | 1212 channels = 2; |
1167 s->output = DCA_STEREO; | 1213 s->output = DCA_STEREO; |
1168 } | 1214 avctx->channel_layout = CHANNEL_LAYOUT_STEREO; |
1215 } | |
1216 if (s->amode<16) | |
1217 avctx->channel_layout = dca_core_channel_layout[s->amode]; | |
1218 else { | |
1219 av_log(avctx, AV_LOG_ERROR, "Custom channel layouts not supported\n"); | |
1220 //Maybe just guess layout depending on the channel count | |
1221 return -1; | |
1222 } | |
1223 | |
1224 if (s->lfe) avctx->channel_layout |= CHANNEL_LOW_FREQUENCY; | |
1169 | 1225 |
1170 /* There is nothing that prevents a dts frame to change channel configuration | 1226 /* There is nothing that prevents a dts frame to change channel configuration |
1171 but FFmpeg doesn't support that so only set the channels if it is previously | 1227 but FFmpeg doesn't support that so only set the channels if it is previously |
1172 unset. Ideally during the first probe for channels the crc should be checked | 1228 unset. Ideally during the first probe for channels the crc should be checked |
1173 and only set avctx->channels when the crc is ok. Right now the decoder could | 1229 and only set avctx->channels when the crc is ok. Right now the decoder could |
1242 .priv_data_size = sizeof(DCAContext), | 1298 .priv_data_size = sizeof(DCAContext), |
1243 .init = dca_decode_init, | 1299 .init = dca_decode_init, |
1244 .decode = dca_decode_frame, | 1300 .decode = dca_decode_frame, |
1245 .close = dca_decode_end, | 1301 .close = dca_decode_end, |
1246 .long_name = NULL_IF_CONFIG_SMALL("DCA (DTS Coherent Acoustics)"), | 1302 .long_name = NULL_IF_CONFIG_SMALL("DCA (DTS Coherent Acoustics)"), |
1303 .channel_layouts = dca_core_channel_layout, | |
1247 }; | 1304 }; |