| 141 | } |
| 142 | |
| 143 | static int get_http_header_data(MMSHContext *mmsh) |
| 144 | { |
| 145 | MMSContext *mms = &mmsh->mms; |
| 146 | int res, len; |
| 147 | ChunkType chunk_type; |
| 148 | |
| 149 | for (;;) { |
| 150 | len = 0; |
| 151 | res = chunk_type = get_chunk_header(mmsh, &len); |
| 152 | if (res < 0) { |
| 153 | return res; |
| 154 | } else if (chunk_type == CHUNK_TYPE_ASF_HEADER){ |
| 155 | // get asf header and stored it |
| 156 | if (!mms->header_parsed) { |
| 157 | if (mms->asf_header) { |
| 158 | if (len != mms->asf_header_size) { |
| 159 | mms->asf_header_size = len; |
| 160 | av_log(NULL, AV_LOG_TRACE, "Header len changed from %d to %d\n", |
| 161 | mms->asf_header_size, len); |
| 162 | av_freep(&mms->asf_header); |
| 163 | } |
| 164 | } |
| 165 | mms->asf_header = av_mallocz(len); |
| 166 | if (!mms->asf_header) { |
| 167 | return AVERROR(ENOMEM); |
| 168 | } |
| 169 | mms->asf_header_size = len; |
| 170 | } |
| 171 | if (len > mms->asf_header_size) { |
| 172 | av_log(NULL, AV_LOG_ERROR, |
| 173 | "Asf header packet len = %d exceed the asf header buf size %d\n", |
| 174 | len, mms->asf_header_size); |
| 175 | return AVERROR(EIO); |
| 176 | } |
| 177 | res = ffurl_read_complete(mms->mms_hd, mms->asf_header, len); |
| 178 | if (res != len) { |
| 179 | av_log(NULL, AV_LOG_ERROR, |
| 180 | "Recv asf header data len %d != expected len %d\n", res, len); |
| 181 | return AVERROR(EIO); |
| 182 | } |
| 183 | mms->asf_header_size = len; |
| 184 | if (!mms->header_parsed) { |
| 185 | res = ff_mms_asf_header_parser(mms); |
| 186 | mms->header_parsed = 1; |
| 187 | return res; |
| 188 | } |
| 189 | } else if (chunk_type == CHUNK_TYPE_DATA) { |
| 190 | // read data packet and do padding |
| 191 | return read_data_packet(mmsh, len); |
| 192 | } else { |
| 193 | if (len) { |
| 194 | if (len > sizeof(mms->in_buffer)) { |
| 195 | av_log(NULL, AV_LOG_ERROR, |
| 196 | "Other packet len = %d exceed the in_buffer size %zu\n", |
| 197 | len, sizeof(mms->in_buffer)); |
| 198 | return AVERROR(EIO); |
| 199 | } |
| 200 | res = ffurl_read_complete(mms->mms_hd, mms->in_buffer, len); |
no test coverage detected