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;