MCPcopy Create free account
hub / github.com/FFmpeg/FFmpeg / decode_packet

Function decode_packet

libavcodec/wmalosslessdec.c:1185–1303  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

1183}
1184
1185static 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)

Callers

nothing calls this directly

Calls 13

get_bits_countFunction · 0.85
init_get_bitsFunction · 0.85
skip_bitsFunction · 0.85
get_bits1Function · 0.85
avpriv_request_sampleFunction · 0.85
av_logFunction · 0.85
init_put_bitsFunction · 0.85
show_bitsFunction · 0.85
av_frame_move_refFunction · 0.85
decode_frameFunction · 0.70
get_bitsFunction · 0.70
save_bitsFunction · 0.70

Tested by

no test coverage detected