summaryrefslogtreecommitdiffstats
path: root/audio
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2013-07-10 02:06:49 +0200
committerwm4 <wm4@nowhere>2013-07-10 02:06:49 +0200
commit052d4ddbbbc91e95e9e4b380423ddb2f67437888 (patch)
tree3b59363b28322cfb8a569b4c437af014ac6a4c74 /audio
parent89252631bd5cd6cdced8177d11bee0dc898a5314 (diff)
downloadmpv-052d4ddbbbc91e95e9e4b380423ddb2f67437888.tar.bz2
mpv-052d4ddbbbc91e95e9e4b380423ddb2f67437888.tar.xz
ad_lavc: simplify
We don't need to deal with partial packet reads, manually using an audio parser, or having to call the libavcodec decoder multiple times per packet. Actually, I'm not sure about the last point. ffplay still does this, but the ffmpeg demuxing.c example doesn't.
Diffstat (limited to 'audio')
-rw-r--r--audio/decode/ad_lavc.c35
1 files changed, 5 insertions, 30 deletions
diff --git a/audio/decode/ad_lavc.c b/audio/decode/ad_lavc.c
index 2495012e47..c311bc2cb8 100644
--- a/audio/decode/ad_lavc.c
+++ b/audio/decode/ad_lavc.c
@@ -50,7 +50,6 @@ struct priv {
uint8_t *output_packed; // used by deplanarize to store packed audio samples
int output_left;
int unitsize;
- int previous_data_left; // input demuxer packet data
bool force_channel_map;
};
@@ -344,7 +343,6 @@ static int control(sh_audio_t *sh, int cmd, void *arg)
switch (cmd) {
case ADCTRL_RESYNC_STREAM:
avcodec_flush_buffers(ctx->avctx);
- ctx->previous_data_left = 0;
ctx->output_left = 0;
return CONTROL_TRUE;
}
@@ -374,35 +372,15 @@ static int decode_new_packet(struct sh_audio *sh)
{
struct priv *priv = sh->context;
AVCodecContext *avctx = priv->avctx;
- double pts = MP_NOPTS_VALUE;
- int insize;
- bool packet_already_used = priv->previous_data_left;
- struct demux_packet *mpkt = ds_get_packet2(sh->ds,
- priv->previous_data_left);
- unsigned char *start;
- if (!mpkt) {
- assert(!priv->previous_data_left);
- start = NULL;
+ struct demux_packet *mpkt = ds_get_packet2(sh->ds, false);
+ if (!mpkt)
return -1; // error or EOF
- } else {
- assert(mpkt->len >= priv->previous_data_left);
- if (!priv->previous_data_left) {
- priv->previous_data_left = mpkt->len;
- pts = mpkt->pts;
- }
- insize = priv->previous_data_left;
- start = mpkt->buffer + mpkt->len - priv->previous_data_left;
- priv->previous_data_left -= insize;
- priv->previous_data_left = FFMAX(priv->previous_data_left, 0);
- }
AVPacket pkt;
mp_set_av_packet(&pkt, mpkt);
- pkt.data = start;
- pkt.size = insize;
- if (pts != MP_NOPTS_VALUE && !packet_already_used) {
- sh->pts = pts;
+ if (mpkt->pts != MP_NOPTS_VALUE) {
+ sh->pts = mpkt->pts;
sh->pts_bytes = 0;
}
int got_frame = 0;
@@ -414,9 +392,6 @@ static int decode_new_packet(struct sh_audio *sh)
mp_msg(MSGT_DECAUDIO, MSGL_V, "lavc_audio: error\n");
return -1;
}
- // The "insize >= ret" test is sanity check against decoder overreads
- if (insize >= ret)
- priv->previous_data_left = insize - ret;
if (!got_frame)
return 0;
uint64_t unitsize = (uint64_t)av_get_bytes_per_sample(avctx->sample_fmt) *
@@ -433,7 +408,7 @@ static int decode_new_packet(struct sh_audio *sh)
} else {
priv->output = priv->avframe->data[0];
}
- mp_dbg(MSGT_DECAUDIO, MSGL_DBG2, "Decoded %d -> %d \n", insize,
+ mp_dbg(MSGT_DECAUDIO, MSGL_DBG2, "Decoded %d -> %d \n", mpkt->len,
priv->output_left);
return 0;
}