| 1080 | */ |
| 1081 | |
| 1082 | static av_cold int cook_decode_init(AVCodecContext *avctx) |
| 1083 | { |
| 1084 | COOKContext *q = avctx->priv_data; |
| 1085 | const uint8_t *edata_ptr = avctx->extradata; |
| 1086 | const uint8_t *edata_ptr_end = edata_ptr + avctx->extradata_size; |
| 1087 | int extradata_size = avctx->extradata_size; |
| 1088 | int s = 0; |
| 1089 | unsigned int channel_mask = 0; |
| 1090 | q->avctx = avctx; |
| 1091 | |
| 1092 | /* Take care of the codec specific extradata. */ |
| 1093 | if (extradata_size <= 0) { |
| 1094 | av_log(avctx,AV_LOG_ERROR,"Necessary extradata missing!\n"); |
| 1095 | return -1; |
| 1096 | } |
| 1097 | av_log(avctx,AV_LOG_DEBUG,"codecdata_length=%d\n",avctx->extradata_size); |
| 1098 | |
| 1099 | /* Take data from the AVCodecContext (RM container). */ |
| 1100 | q->sample_rate = avctx->sample_rate; |
| 1101 | q->nb_channels = avctx->channels; |
| 1102 | q->bit_rate = avctx->bit_rate; |
| 1103 | |
| 1104 | /* Initialize RNG. */ |
| 1105 | av_lfg_init(&q->random_state, 0); |
| 1106 | |
| 1107 | while(edata_ptr < edata_ptr_end){ |
| 1108 | /* 8 for mono, 16 for stereo, ? for multichannel |
| 1109 | Swap to right endianness so we don't need to care later on. */ |
| 1110 | if (extradata_size >= 8){ |
| 1111 | q->subpacket[s].cookversion = bytestream_get_be32(&edata_ptr); |
| 1112 | q->subpacket[s].samples_per_frame = bytestream_get_be16(&edata_ptr); |
| 1113 | q->subpacket[s].subbands = bytestream_get_be16(&edata_ptr); |
| 1114 | extradata_size -= 8; |
| 1115 | } |
| 1116 | if (avctx->extradata_size >= 8){ |
| 1117 | bytestream_get_be32(&edata_ptr); //Unknown unused |
| 1118 | q->subpacket[s].js_subband_start = bytestream_get_be16(&edata_ptr); |
| 1119 | q->subpacket[s].js_vlc_bits = bytestream_get_be16(&edata_ptr); |
| 1120 | extradata_size -= 8; |
| 1121 | } |
| 1122 | |
| 1123 | /* Initialize extradata related variables. */ |
| 1124 | q->subpacket[s].samples_per_channel = q->subpacket[s].samples_per_frame / q->nb_channels; |
| 1125 | q->subpacket[s].bits_per_subpacket = avctx->block_align * 8; |
| 1126 | |
| 1127 | /* Initialize default data states. */ |
| 1128 | q->subpacket[s].log2_numvector_size = 5; |
| 1129 | q->subpacket[s].total_subbands = q->subpacket[s].subbands; |
| 1130 | q->subpacket[s].num_channels = 1; |
| 1131 | |
| 1132 | /* Initialize version-dependent variables */ |
| 1133 | |
| 1134 | av_log(avctx,AV_LOG_DEBUG,"subpacket[%i].cookversion=%x\n",s,q->subpacket[s].cookversion); |
| 1135 | q->subpacket[s].joint_stereo = 0; |
| 1136 | switch (q->subpacket[s].cookversion) { |
| 1137 | case MONO: |
| 1138 | if (q->nb_channels != 1) { |
| 1139 | av_log(avctx,AV_LOG_ERROR,"Container channels != 1, report sample!\n"); |
nothing calls this directly
no test coverage detected