- audio_length = get_le16(pb);
- ret_value = av_get_packet(pb, pkt, audio_length);
- pkt->stream_index = 1;
- return (ret_value != audio_length ? AVERROR_IO : ret_value);
-
- case VIDEO_DIFFERENCE_FRAME_BLOCK:
- case VIDEO_YOFFSET_DIFFERENCE_FRAME_BLOCK:
- case VIDEO_FULL_FRAME_BLOCK:
- return read_frame(vid, pb, pkt, block_type, s,
- s->streams[0]->codec->width * s->streams[0]->codec->height);
-
- case FINISHED_BLOCK:
+ if (vid->audio_index < 0) {
+ AVStream *st = avformat_new_stream(s, NULL);
+ if (!st)
+ return AVERROR(ENOMEM);
+ vid->audio_index = st->index;
+ st->codec->codec_type = AVMEDIA_TYPE_AUDIO;
+ st->codec->codec_id = AV_CODEC_ID_PCM_U8;
+ st->codec->channels = 1;
+ st->codec->channel_layout = AV_CH_LAYOUT_MONO;
+ st->codec->bits_per_coded_sample = 8;
+ st->codec->sample_rate = vid->sample_rate;
+ st->codec->bit_rate = 8 * st->codec->sample_rate;
+ st->start_time = 0;
+ avpriv_set_pts_info(st, 64, 1, vid->sample_rate);
+ }
+ audio_length = avio_rl16(pb);
+ if ((ret_value = av_get_packet(pb, pkt, audio_length)) != audio_length) {
+ if (ret_value < 0)
+ return ret_value;
+ av_log(s, AV_LOG_ERROR, "incomplete audio block\n");
+ return AVERROR(EIO);
+ }
+ pkt->stream_index = vid->audio_index;
+ pkt->duration = audio_length;
+ pkt->flags |= AV_PKT_FLAG_KEY;
+ return 0;
+
+ case VIDEO_P_FRAME:
+ case VIDEO_YOFF_P_FRAME:
+ case VIDEO_I_FRAME:
+ return read_frame(vid, pb, pkt, block_type, s);
+
+ case EOF_BLOCK: