diff options
author | wm4 <wm4@nowhere> | 2013-07-14 17:59:26 +0200 |
---|---|---|
committer | wm4 <wm4@nowhere> | 2013-07-14 17:59:26 +0200 |
commit | e18ffd6b998858ca0797cb0ce4aabd4a509655dd (patch) | |
tree | 199bddd30923db1175a1331191eb86ba684e9e41 /audio | |
parent | 3e7d483ac89289f613138002be2043ec5f479bb0 (diff) | |
parent | 5ead20bdb3328d199dad693039d18e7a05eb2465 (diff) | |
download | mpv-e18ffd6b998858ca0797cb0ce4aabd4a509655dd.tar.bz2 mpv-e18ffd6b998858ca0797cb0ce4aabd4a509655dd.tar.xz |
Merge branch 'remove_old_demuxers'
The merged branch doesn't actually just remove old demuxers, but also
includes a branch of cleanups and some refactoring.
Conflicts:
stream/stream.c
Diffstat (limited to 'audio')
-rw-r--r-- | audio/decode/ad.h | 4 | ||||
-rw-r--r-- | audio/decode/ad_lavc.c | 62 | ||||
-rw-r--r-- | audio/decode/ad_mpg123.c | 16 | ||||
-rw-r--r-- | audio/decode/ad_spdif.c | 79 | ||||
-rw-r--r-- | audio/decode/dec_audio.c | 34 |
5 files changed, 51 insertions, 144 deletions
diff --git a/audio/decode/ad.h b/audio/decode/ad.h index ff51ecbe35..1c8a211f5b 100644 --- a/audio/decode/ad.h +++ b/audio/decode/ad.h @@ -42,10 +42,6 @@ typedef struct ad_functions // NULL terminated array of all drivers extern const ad_functions_t * const mpcodecs_ad_drivers[]; -// fallback if ADCTRL_RESYNC not implemented: sh_audio->a_in_buffer_len=0; #define ADCTRL_RESYNC_STREAM 1 // resync, called after seeking -// fallback if ADCTRL_SKIP not implemented: ds_fill_buffer(sh_audio->ds); -#define ADCTRL_SKIP_FRAME 2 // skip block/frame, called while seeking - #endif /* MPLAYER_AD_H */ diff --git a/audio/decode/ad_lavc.c b/audio/decode/ad_lavc.c index b5a4ee1ef8..e78e26f208 100644 --- a/audio/decode/ad_lavc.c +++ b/audio/decode/ad_lavc.c @@ -24,6 +24,7 @@ #include <libavcodec/avcodec.h> #include <libavutil/opt.h> +#include <libavutil/common.h> #include "talloc.h" @@ -50,8 +51,8 @@ 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; + struct demux_packet *packet; }; #define OPT_BASE_STRUCT struct MPOpts @@ -344,9 +345,9 @@ static int control(sh_audio_t *sh, int cmd, void *arg) switch (cmd) { case ADCTRL_RESYNC_STREAM: avcodec_flush_buffers(ctx->avctx); - ds_clear_parser(sh->ds); - ctx->previous_data_left = 0; ctx->output_left = 0; + talloc_free(ctx->packet); + ctx->packet = NULL; return CONTROL_TRUE; } return CONTROL_UNKNOWN; @@ -375,43 +376,35 @@ 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; - insize = 0; - ds_parse(sh->ds, &start, &insize, pts, 0); - if (insize <= 0) - 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; - int consumed = ds_parse(sh->ds, &start, &insize, pts, 0); - priv->previous_data_left -= consumed; - priv->previous_data_left = FFMAX(priv->previous_data_left, 0); - } + struct demux_packet *mpkt = priv->packet; + if (!mpkt) + mpkt = demux_read_packet(sh->gsh); + if (!mpkt) + return -1; // error or EOF + + priv->packet = talloc_steal(priv, mpkt); + + int in_len = mpkt->len; 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; int ret = avcodec_decode_audio4(avctx, priv->avframe, &got_frame, &pkt); + if (ret > 0) { + ret = FFMIN(ret, mpkt->len); // sanity check against decoder overreads + mpkt->buffer += ret; + mpkt->len -= ret; + mpkt->pts = MP_NOPTS_VALUE; // don't reset PTS next time + } + if (mpkt->len == 0 || ret <= 0) { + talloc_free(mpkt); + priv->packet = NULL; + } // LATM may need many packets to find mux info if (ret == AVERROR(EAGAIN)) return 0; @@ -419,9 +412,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 (!sh->parser && 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) * @@ -438,7 +428,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", in_len, priv->output_left); return 0; } diff --git a/audio/decode/ad_mpg123.c b/audio/decode/ad_mpg123.c index 08739b7f4b..8d97468e06 100644 --- a/audio/decode/ad_mpg123.c +++ b/audio/decode/ad_mpg123.c @@ -217,27 +217,25 @@ static int decode_a_bit(sh_audio_t *sh, unsigned char *buf, int count) /* Feed the decoder. This will only fire from the second round on. */ if (ret == MPG123_NEED_MORE) { - int incount; - double pts; - unsigned char *inbuf; /* Feed more input data. */ - incount = ds_get_packet_pts(sh->ds, &inbuf, &pts); - if (incount <= 0) + struct demux_packet *pkt = demux_read_packet(sh->gsh); + if (!pkt) break; /* Apparently that's it. EOF. */ /* Next bytes from that presentation time. */ - if (pts != MP_NOPTS_VALUE) { - sh->pts = pts; + if (pkt->pts != MP_NOPTS_VALUE) { + sh->pts = pkt->pts; sh->pts_bytes = 0; } #ifdef AD_MPG123_FRAMEWISE /* Have to use mpg123_feed() to avoid decoding here. */ - ret = mpg123_feed(con->handle, inbuf, incount); + ret = mpg123_feed(con->handle, pkt->buffer, pkt->len); #else /* Do not use mpg123_feed(), added in later libmpg123 versions. */ - ret = mpg123_decode(con->handle, inbuf, incount, NULL, 0, NULL); + ret = mpg123_decode(con->handle, pkt->buffer, pkt->len, NULL, 0, NULL); #endif + talloc_free(pkt); if (ret == MPG123_ERR) break; } diff --git a/audio/decode/ad_spdif.c b/audio/decode/ad_spdif.c index 1314110062..d0fa43aa25 100644 --- a/audio/decode/ad_spdif.c +++ b/audio/decode/ad_spdif.c @@ -84,9 +84,7 @@ static int codecs[] = { static int init(sh_audio_t *sh, const char *decoder) { - int x, in_size, srate, bps, *dtshd_rate; - unsigned char *start; - double pts; + int srate, bps, *dtshd_rate; AVFormatContext *lavf_ctx = NULL; AVStream *stream = NULL; const AVOption *opt = NULL; @@ -125,28 +123,8 @@ static int init(sh_audio_t *sh, const char *decoder) goto fail; } - // get sample_rate & bitrate from parser - x = ds_get_packet_pts(sh->ds, &start, &pts); - in_size = x; - if (x <= 0) { - pts = MP_NOPTS_VALUE; - x = 0; - } - ds_parse(sh->ds, &start, &x, pts, 0); srate = 48000; //fake value bps = 768000/8; //fake value - if (x && sh->avctx) { // we have parser and large enough buffer - if (sh->avctx->sample_rate < 44100) { - mp_msg(MSGT_DECAUDIO,MSGL_INFO, - "This stream sample_rate[%d Hz] may be broken. " - "Force reset 48000Hz.\n", - sh->avctx->sample_rate); - srate = 48000; //fake value - } else - srate = sh->avctx->sample_rate; - bps = sh->avctx->bit_rate/8; - } - sh->ds->buffer_pos -= in_size; int num_channels = 0; switch (lavf_ctx->streams[0]->codec->codec_id) { @@ -226,64 +204,35 @@ static int decode_audio(sh_audio_t *sh, unsigned char *buf, struct spdifContext *spdif_ctx = sh->context; AVFormatContext *lavf_ctx = spdif_ctx->lavf_ctx; AVPacket pkt; - double pts; - int ret, in_size, consumed, x; - unsigned char *start = NULL; - consumed = spdif_ctx->out_buffer_len = 0; + spdif_ctx->out_buffer_len = 0; spdif_ctx->out_buffer_size = maxlen; spdif_ctx->out_buffer = buf; while (spdif_ctx->out_buffer_len + spdif_ctx->iec61937_packet_size < maxlen && spdif_ctx->out_buffer_len < minlen) { - if (sh->ds->eof) + struct demux_packet *mpkt = demux_read_packet(sh->gsh); + if (!mpkt) break; - x = ds_get_packet_pts(sh->ds, &start, &pts); - if (x <= 0) { - x = 0; - ds_parse(sh->ds, &start, &x, MP_NOPTS_VALUE, 0); - if (x == 0) - continue; // END_NOT_FOUND - in_size = x; - } else { - in_size = x; - consumed = ds_parse(sh->ds, &start, &x, pts, 0); - if (x == 0) { - mp_msg(MSGT_DECAUDIO,MSGL_V, - "start[%p] in_size[%d] consumed[%d] x[%d].\n", - start, in_size, consumed, x); - continue; // END_NOT_FOUND - } - sh->ds->buffer_pos -= in_size - consumed; - } - av_init_packet(&pkt); - pkt.data = start; - pkt.size = x; - mp_msg(MSGT_DECAUDIO,MSGL_V, - "start[%p] pkt.size[%d] in_size[%d] consumed[%d] x[%d].\n", - start, pkt.size, in_size, consumed, x); - if (pts != MP_NOPTS_VALUE) { - sh->pts = pts; + mp_set_av_packet(&pkt, mpkt); + mp_msg(MSGT_DECAUDIO,MSGL_V, "pkt.data[%p] pkt.size[%d]\n", + pkt.data, pkt.size); + if (mpkt->pts != MP_NOPTS_VALUE) { + sh->pts = mpkt->pts; sh->pts_bytes = 0; } - ret = lavf_ctx->oformat->write_packet(lavf_ctx, &pkt); + int out_len = spdif_ctx->out_buffer_len; + int ret = lavf_ctx->oformat->write_packet(lavf_ctx, &pkt); + avio_flush(lavf_ctx->pb); + sh->pts_bytes += spdif_ctx->out_buffer_len - out_len; + talloc_free(mpkt); if (ret < 0) break; } - sh->pts_bytes += spdif_ctx->out_buffer_len; return spdif_ctx->out_buffer_len; } static int control(sh_audio_t *sh, int cmd, void *arg) { - unsigned char *start; - double pts; - - switch (cmd) { - case ADCTRL_RESYNC_STREAM: - case ADCTRL_SKIP_FRAME: - ds_get_packet_pts(sh->ds, &start, &pts); - return CONTROL_TRUE; - } return CONTROL_UNKNOWN; } diff --git a/audio/decode/dec_audio.c b/audio/decode/dec_audio.c index 4f2f462b92..d6b57dd2b5 100644 --- a/audio/decode/dec_audio.c +++ b/audio/decode/dec_audio.c @@ -21,6 +21,8 @@ #include <unistd.h> #include <assert.h> +#include <libavutil/mem.h> + #include "demux/codec_tags.h" #include "config.h" @@ -53,15 +55,6 @@ static int init_audio_codec(sh_audio_t *sh_audio, const char *decoder) return 0; } - /* allocate audio in buffer: */ - if (sh_audio->audio_in_minsize > 0) { - sh_audio->a_in_buffer_size = sh_audio->audio_in_minsize; - mp_tmsg(MSGT_DECAUDIO, MSGL_V, - "dec_audio: Allocating %d bytes for input buffer.\n", - sh_audio->a_in_buffer_size); - sh_audio->a_in_buffer = av_mallocz(sh_audio->a_in_buffer_size); - } - const int base_size = 65536; // At least 64 KiB plus rounding up to next decodable unit size sh_audio->a_buffer_size = base_size + sh_audio->audio_out_minsize; @@ -91,9 +84,6 @@ static int init_audio_codec(sh_audio_t *sh_audio, const char *decoder) return 0; } - if (!sh_audio->o_bps) - sh_audio->o_bps = sh_audio->channels.num * sh_audio->samplerate - * sh_audio->samplesize; return 1; } @@ -157,12 +147,9 @@ int init_best_audio_codec(sh_audio_t *sh_audio, char *audio_decoders) mp_msg(MSGT_DECAUDIO, MSGL_INFO, "Selected audio codec: %s\n", sh_audio->gsh->decoder_desc); mp_msg(MSGT_DECAUDIO, MSGL_V, - "AUDIO: %d Hz, %d ch, %s, %3.1f kbit/%3.2f%% (ratio: %d->%d)\n", + "AUDIO: %d Hz, %d ch, %s\n", sh_audio->samplerate, sh_audio->channels.num, - af_fmt2str_short(sh_audio->sample_format), - sh_audio->i_bps * 8 * 0.001, - ((float) sh_audio->i_bps / sh_audio->o_bps) * 100.0, - sh_audio->i_bps, sh_audio->o_bps); + af_fmt2str_short(sh_audio->sample_format)); mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_AUDIO_BITRATE=%d\nID_AUDIO_RATE=%d\n" "ID_AUDIO_NCH=%d\n", sh_audio->i_bps * 8, sh_audio->samplerate, sh_audio->channels.num); @@ -192,7 +179,6 @@ void uninit_audio(sh_audio_t *sh_audio) talloc_free(sh_audio->gsh->decoder_desc); sh_audio->gsh->decoder_desc = NULL; av_freep(&sh_audio->a_buffer); - av_freep(&sh_audio->a_in_buffer); } @@ -368,20 +354,8 @@ void decode_audio_prepend_bytes(struct bstr *outbuf, int count, int byte) void resync_audio_stream(sh_audio_t *sh_audio) { - sh_audio->a_in_buffer_len = 0; // clear audio input buffer sh_audio->pts = MP_NOPTS_VALUE; if (!sh_audio->initialized) return; sh_audio->ad_driver->control(sh_audio, ADCTRL_RESYNC_STREAM, NULL); } - -void skip_audio_frame(sh_audio_t *sh_audio) -{ - if (!sh_audio->initialized) - return; - if (sh_audio->ad_driver->control(sh_audio, ADCTRL_SKIP_FRAME, NULL) - == CONTROL_TRUE) - return; - // default skip code: - ds_fill_buffer(sh_audio->ds); // skip block -} |