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 };