Mercurial > libavcodec.hg
comparison cook.c @ 9558:4fa6581c6ee1 libavcodec
Support cook multichannel files.
author | banan |
---|---|
date | Sat, 25 Apr 2009 10:46:07 +0000 |
parents | c740baa765a4 |
children | eadccc009063 |
comparison
equal
deleted
inserted
replaced
9557:c740baa765a4 | 9558:4fa6581c6ee1 |
---|---|
1006 return buf_size; | 1006 return buf_size; |
1007 | 1007 |
1008 /* estimate subpacket sizes */ | 1008 /* estimate subpacket sizes */ |
1009 q->subpacket[0].size = avctx->block_align; | 1009 q->subpacket[0].size = avctx->block_align; |
1010 | 1010 |
1011 if(q->num_subpackets > 1){ | |
1012 for(i=1;i<q->num_subpackets;i++){ | |
1013 q->subpacket[i].size = 2 * buf[avctx->block_align - q->num_subpackets + i]; | |
1014 q->subpacket[0].size -= (q->subpacket[i].size + 1); | |
1015 } | |
1016 } | |
1017 | |
1011 /* decode supbackets */ | 1018 /* decode supbackets */ |
1012 *data_size = 0; | 1019 *data_size = 0; |
1013 for(i=0;i<q->num_subpackets;i++){ | 1020 for(i=0;i<q->num_subpackets;i++){ |
1014 q->subpacket[i].bits_per_subpacket = (q->subpacket[i].size*8)>>q->subpacket[i].bits_per_subpdiv; | 1021 q->subpacket[i].bits_per_subpacket = (q->subpacket[i].size*8)>>q->subpacket[i].bits_per_subpdiv; |
1015 q->subpacket[i].ch_idx = chidx; | 1022 q->subpacket[i].ch_idx = chidx; |
1074 COOKContext *q = avctx->priv_data; | 1081 COOKContext *q = avctx->priv_data; |
1075 const uint8_t *edata_ptr = avctx->extradata; | 1082 const uint8_t *edata_ptr = avctx->extradata; |
1076 const uint8_t *edata_ptr_end = edata_ptr + avctx->extradata_size; | 1083 const uint8_t *edata_ptr_end = edata_ptr + avctx->extradata_size; |
1077 int extradata_size = avctx->extradata_size; | 1084 int extradata_size = avctx->extradata_size; |
1078 int s = 0; | 1085 int s = 0; |
1086 unsigned int channel_mask = 0; | |
1079 q->avctx = avctx; | 1087 q->avctx = avctx; |
1080 | 1088 |
1081 /* Take care of the codec specific extradata. */ | 1089 /* Take care of the codec specific extradata. */ |
1082 if (extradata_size <= 0) { | 1090 if (extradata_size <= 0) { |
1083 av_log(avctx,AV_LOG_ERROR,"Necessary extradata missing!\n"); | 1091 av_log(avctx,AV_LOG_ERROR,"Necessary extradata missing!\n"); |
1153 if (q->subpacket[s].samples_per_channel > 512) { | 1161 if (q->subpacket[s].samples_per_channel > 512) { |
1154 q->subpacket[s].log2_numvector_size = 7; | 1162 q->subpacket[s].log2_numvector_size = 7; |
1155 } | 1163 } |
1156 break; | 1164 break; |
1157 case MC_COOK: | 1165 case MC_COOK: |
1158 av_log(avctx,AV_LOG_ERROR,"MC_COOK not supported!\n"); | 1166 av_log(avctx,AV_LOG_DEBUG,"MULTI_CHANNEL\n"); |
1159 return -1; | 1167 if(extradata_size >= 4) |
1168 channel_mask |= q->subpacket[s].channel_mask = bytestream_get_be32(&edata_ptr); | |
1169 | |
1170 if(cook_count_channels(q->subpacket[s].channel_mask) > 1){ | |
1171 q->subpacket[s].total_subbands = q->subpacket[s].subbands + q->subpacket[s].js_subband_start; | |
1172 q->subpacket[s].joint_stereo = 1; | |
1173 q->subpacket[s].num_channels = 2; | |
1174 q->subpacket[s].samples_per_channel = q->subpacket[s].samples_per_frame >> 1; | |
1175 | |
1176 if (q->subpacket[s].samples_per_channel > 256) { | |
1177 q->subpacket[s].log2_numvector_size = 6; | |
1178 } | |
1179 if (q->subpacket[s].samples_per_channel > 512) { | |
1180 q->subpacket[s].log2_numvector_size = 7; | |
1181 } | |
1182 }else | |
1183 q->subpacket[s].samples_per_channel = q->subpacket[s].samples_per_frame; | |
1184 | |
1160 break; | 1185 break; |
1161 default: | 1186 default: |
1162 av_log(avctx,AV_LOG_ERROR,"Unknown Cook version, report sample!\n"); | 1187 av_log(avctx,AV_LOG_ERROR,"Unknown Cook version, report sample!\n"); |
1163 return -1; | 1188 return -1; |
1164 break; | 1189 break; |
1238 av_log(avctx,AV_LOG_ERROR,"unknown amount of samples_per_channel = %d, report sample!\n",q->samples_per_channel); | 1263 av_log(avctx,AV_LOG_ERROR,"unknown amount of samples_per_channel = %d, report sample!\n",q->samples_per_channel); |
1239 return -1; | 1264 return -1; |
1240 } | 1265 } |
1241 | 1266 |
1242 avctx->sample_fmt = SAMPLE_FMT_S16; | 1267 avctx->sample_fmt = SAMPLE_FMT_S16; |
1243 avctx->channel_layout = (avctx->channels==2) ? CH_LAYOUT_STEREO : CH_LAYOUT_MONO; | 1268 if (channel_mask) |
1269 avctx->channel_layout = channel_mask; | |
1270 else | |
1271 avctx->channel_layout = (avctx->channels==2) ? CH_LAYOUT_STEREO : CH_LAYOUT_MONO; | |
1244 | 1272 |
1245 #ifdef COOKDEBUG | 1273 #ifdef COOKDEBUG |
1246 dump_cook_context(q); | 1274 dump_cook_context(q); |
1247 #endif | 1275 #endif |
1248 return 0; | 1276 return 0; |