- av_random_init(&q->random_state, 1);
-
- /* Initialize extradata related variables. */
- q->samples_per_channel = q->samples_per_frame / q->nb_channels;
- q->bits_per_subpacket = avctx->block_align * 8;
-
- /* Initialize default data states. */
- q->log2_numvector_size = 5;
- q->total_subbands = q->subbands;
-
- /* Initialize version-dependent variables */
- av_log(NULL,AV_LOG_DEBUG,"q->cookversion=%x\n",q->cookversion);
- q->joint_stereo = 0;
- switch (q->cookversion) {
- case MONO:
- if (q->nb_channels != 1) {
- av_log(avctx,AV_LOG_ERROR,"Container channels != 1, report sample!\n");
- return -1;
- }
- av_log(avctx,AV_LOG_DEBUG,"MONO\n");
- break;
- case STEREO:
- if (q->nb_channels != 1) {
- q->bits_per_subpacket = q->bits_per_subpacket/2;
- }
- av_log(avctx,AV_LOG_DEBUG,"STEREO\n");
- break;
- case JOINT_STEREO:
- if (q->nb_channels != 2) {
- av_log(avctx,AV_LOG_ERROR,"Container channels != 2, report sample!\n");
+ av_lfg_init(&q->random_state, 0);
+
+ while(edata_ptr < edata_ptr_end){
+ /* 8 for mono, 16 for stereo, ? for multichannel
+ Swap to right endianness so we don't need to care later on. */
+ if (extradata_size >= 8){
+ q->subpacket[s].cookversion = bytestream_get_be32(&edata_ptr);
+ q->subpacket[s].samples_per_frame = bytestream_get_be16(&edata_ptr);
+ q->subpacket[s].subbands = bytestream_get_be16(&edata_ptr);
+ extradata_size -= 8;
+ }
+ if (avctx->extradata_size >= 8){
+ bytestream_get_be32(&edata_ptr); //Unknown unused
+ q->subpacket[s].js_subband_start = bytestream_get_be16(&edata_ptr);
+ q->subpacket[s].js_vlc_bits = bytestream_get_be16(&edata_ptr);
+ extradata_size -= 8;
+ }
+
+ /* Initialize extradata related variables. */
+ q->subpacket[s].samples_per_channel = q->subpacket[s].samples_per_frame / q->nb_channels;
+ q->subpacket[s].bits_per_subpacket = avctx->block_align * 8;
+
+ /* Initialize default data states. */
+ q->subpacket[s].log2_numvector_size = 5;
+ q->subpacket[s].total_subbands = q->subpacket[s].subbands;
+ q->subpacket[s].num_channels = 1;
+
+ /* Initialize version-dependent variables */
+
+ av_log(avctx,AV_LOG_DEBUG,"subpacket[%i].cookversion=%x\n",s,q->subpacket[s].cookversion);
+ q->subpacket[s].joint_stereo = 0;
+ switch (q->subpacket[s].cookversion) {
+ case MONO:
+ if (q->nb_channels != 1) {
+ av_log_ask_for_sample(avctx, "Container channels != 1.\n");
+ return -1;
+ }
+ av_log(avctx,AV_LOG_DEBUG,"MONO\n");
+ break;
+ case STEREO:
+ if (q->nb_channels != 1) {
+ q->subpacket[s].bits_per_subpdiv = 1;
+ q->subpacket[s].num_channels = 2;
+ }
+ av_log(avctx,AV_LOG_DEBUG,"STEREO\n");
+ break;
+ case JOINT_STEREO:
+ if (q->nb_channels != 2) {
+ av_log_ask_for_sample(avctx, "Container channels != 2.\n");
+ return -1;
+ }
+ av_log(avctx,AV_LOG_DEBUG,"JOINT_STEREO\n");
+ if (avctx->extradata_size >= 16){
+ q->subpacket[s].total_subbands = q->subpacket[s].subbands + q->subpacket[s].js_subband_start;
+ q->subpacket[s].joint_stereo = 1;
+ q->subpacket[s].num_channels = 2;
+ }
+ if (q->subpacket[s].samples_per_channel > 256) {
+ q->subpacket[s].log2_numvector_size = 6;
+ }
+ if (q->subpacket[s].samples_per_channel > 512) {
+ q->subpacket[s].log2_numvector_size = 7;
+ }
+ break;
+ case MC_COOK:
+ av_log(avctx,AV_LOG_DEBUG,"MULTI_CHANNEL\n");
+ if(extradata_size >= 4)
+ channel_mask |= q->subpacket[s].channel_mask = bytestream_get_be32(&edata_ptr);
+
+ if(cook_count_channels(q->subpacket[s].channel_mask) > 1){
+ q->subpacket[s].total_subbands = q->subpacket[s].subbands + q->subpacket[s].js_subband_start;
+ q->subpacket[s].joint_stereo = 1;
+ q->subpacket[s].num_channels = 2;
+ q->subpacket[s].samples_per_channel = q->subpacket[s].samples_per_frame >> 1;
+
+ if (q->subpacket[s].samples_per_channel > 256) {
+ q->subpacket[s].log2_numvector_size = 6;
+ }
+ if (q->subpacket[s].samples_per_channel > 512) {
+ q->subpacket[s].log2_numvector_size = 7;
+ }
+ }else
+ q->subpacket[s].samples_per_channel = q->subpacket[s].samples_per_frame;
+
+ break;
+ default:
+ av_log_ask_for_sample(avctx, "Unknown Cook version.\n");