| 1183 | } |
| 1184 | |
| 1185 | static int decode_packet(AVCodecContext *avctx, AVFrame *rframe, |
| 1186 | int *got_frame_ptr, AVPacket* avpkt) |
| 1187 | { |
| 1188 | WmallDecodeCtx *s = avctx->priv_data; |
| 1189 | GetBitContext* gb = &s->pgb; |
| 1190 | const uint8_t* buf = avpkt->data; |
| 1191 | int buf_size = avpkt->size; |
| 1192 | int num_bits_prev_frame, packet_sequence_number, spliced_packet; |
| 1193 | |
| 1194 | s->frame->nb_samples = 0; |
| 1195 | |
| 1196 | if (!buf_size) { |
| 1197 | s->packet_done = 0; |
| 1198 | if (s->num_saved_bits <= get_bits_count(&s->gb)) |
| 1199 | return 0; |
| 1200 | if (!decode_frame(s)) |
| 1201 | s->num_saved_bits = 0; |
| 1202 | } else if (s->packet_done || s->packet_loss) { |
| 1203 | s->packet_done = 0; |
| 1204 | |
| 1205 | s->next_packet_start = buf_size - FFMIN(avctx->block_align, buf_size); |
| 1206 | buf_size = FFMIN(avctx->block_align, buf_size); |
| 1207 | s->buf_bit_size = buf_size << 3; |
| 1208 | |
| 1209 | /* parse packet header */ |
| 1210 | init_get_bits(gb, buf, s->buf_bit_size); |
| 1211 | packet_sequence_number = get_bits(gb, 4); |
| 1212 | skip_bits(gb, 1); // Skip seekable_frame_in_packet, currently unused |
| 1213 | spliced_packet = get_bits1(gb); |
| 1214 | if (spliced_packet) |
| 1215 | avpriv_request_sample(avctx, "Bitstream splicing"); |
| 1216 | |
| 1217 | /* get number of bits that need to be added to the previous frame */ |
| 1218 | num_bits_prev_frame = get_bits(gb, s->log2_frame_size); |
| 1219 | |
| 1220 | /* check for packet loss */ |
| 1221 | if (!s->packet_loss && |
| 1222 | ((s->packet_sequence_number + 1) & 0xF) != packet_sequence_number) { |
| 1223 | s->packet_loss = 1; |
| 1224 | av_log(avctx, AV_LOG_ERROR, |
| 1225 | "Packet loss detected! seq %"PRIx8" vs %x\n", |
| 1226 | s->packet_sequence_number, packet_sequence_number); |
| 1227 | } |
| 1228 | s->packet_sequence_number = packet_sequence_number; |
| 1229 | |
| 1230 | if (num_bits_prev_frame > 0) { |
| 1231 | int remaining_packet_bits = s->buf_bit_size - get_bits_count(gb); |
| 1232 | if (num_bits_prev_frame >= remaining_packet_bits) { |
| 1233 | num_bits_prev_frame = remaining_packet_bits; |
| 1234 | s->packet_done = 1; |
| 1235 | } |
| 1236 | |
| 1237 | /* Append the previous frame data to the remaining data from the |
| 1238 | * previous packet to create a full frame. */ |
| 1239 | save_bits(s, gb, num_bits_prev_frame, 1); |
| 1240 | |
| 1241 | /* decode the cross packet frame if it is valid */ |
| 1242 | if (num_bits_prev_frame < remaining_packet_bits && !s->packet_loss) |
nothing calls this directly
no test coverage detected