X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavformat%2Fgsmdec.c;h=f9ecbafcda8cebc743fb2a8e4df22a1d7a29cb47;hb=54bc15d5ebfd07fd468743ba29f709ea19e840b9;hp=23608873c12b0ab7948cce0c87c3558e5254f3e5;hpb=c3f9ebf74371b63fba0e7491e61904bbd165cd0f;p=ffmpeg diff --git a/libavformat/gsmdec.c b/libavformat/gsmdec.c index 23608873c12..f9ecbafcda8 100644 --- a/libavformat/gsmdec.c +++ b/libavformat/gsmdec.c @@ -19,6 +19,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ +#include "libavutil/channel_layout.h" #include "libavutil/mathematics.h" #include "libavutil/opt.h" #include "avformat.h" @@ -37,7 +38,7 @@ static int gsm_read_packet(AVFormatContext *s, AVPacket *pkt) { int ret, size; - size = GSM_BLOCK_SIZE * 32; + size = GSM_BLOCK_SIZE; pkt->pos = avio_tell(s->pb); pkt->stream_index = 0; @@ -48,13 +49,13 @@ static int gsm_read_packet(AVFormatContext *s, AVPacket *pkt) return ret < 0 ? ret : AVERROR(EIO); } pkt->size = ret; - pkt->duration = ret / GSM_BLOCK_SIZE; + pkt->duration = 1; pkt->pts = pkt->pos / GSM_BLOCK_SIZE; return 0; } -static int gsm_read_header(AVFormatContext *s, AVFormatParameters *ap) +static int gsm_read_header(AVFormatContext *s) { GSMDemuxerContext *c = s->priv_data; AVStream *st = avformat_new_stream(s, NULL); @@ -62,10 +63,10 @@ static int gsm_read_header(AVFormatContext *s, AVFormatParameters *ap) return AVERROR(ENOMEM); st->codec->codec_type = AVMEDIA_TYPE_AUDIO; - st->codec->codec_id = s->iformat->value; + st->codec->codec_id = s->iformat->raw_codec_id; st->codec->channels = 1; + st->codec->channel_layout = AV_CH_LAYOUT_MONO; st->codec->sample_rate = c->sample_rate; - st->codec->block_align = GSM_BLOCK_SIZE; st->codec->bit_rate = GSM_BLOCK_SIZE * 8 * c->sample_rate / GSM_BLOCK_SAMPLES; avpriv_set_pts_info(st, 64, GSM_BLOCK_SAMPLES, GSM_SAMPLE_RATE); @@ -73,42 +74,9 @@ static int gsm_read_header(AVFormatContext *s, AVFormatParameters *ap) return 0; } -static int gsm_read_seek2(AVFormatContext *s, int stream_index, int64_t min_ts, - int64_t ts, int64_t max_ts, int flags) -{ - GSMDemuxerContext *c = s->priv_data; - - /* convert timestamps to file positions */ - if (!(flags & AVSEEK_FLAG_BYTE)) { - if (stream_index < 0) { - AVRational bitrate_q = { GSM_BLOCK_SAMPLES, c->sample_rate * GSM_BLOCK_SIZE }; - ts = av_rescale_q(ts, AV_TIME_BASE_Q, bitrate_q); - min_ts = av_rescale_q(min_ts, AV_TIME_BASE_Q, bitrate_q); - max_ts = av_rescale_q(max_ts, AV_TIME_BASE_Q, bitrate_q); - } else { - ts *= GSM_BLOCK_SIZE; - min_ts *= GSM_BLOCK_SIZE; - max_ts *= GSM_BLOCK_SIZE; - } - } - /* round to nearest block boundary */ - ts = (ts + GSM_BLOCK_SIZE / 2) / GSM_BLOCK_SIZE * GSM_BLOCK_SIZE; - ts = FFMAX(0, ts); - - /* handle min/max */ - while (ts < min_ts) - ts += GSM_BLOCK_SIZE; - while (ts > max_ts) - ts -= GSM_BLOCK_SIZE; - if (ts < min_ts || ts > max_ts) - return -1; - - return avio_seek(s->pb, ts, SEEK_SET); -} - static const AVOption options[] = { { "sample_rate", "", offsetof(GSMDemuxerContext, sample_rate), - AV_OPT_TYPE_INT, {.dbl = GSM_SAMPLE_RATE}, 1, INT_MAX / GSM_BLOCK_SIZE, + AV_OPT_TYPE_INT, {.i64 = GSM_SAMPLE_RATE}, 1, INT_MAX / GSM_BLOCK_SIZE, AV_OPT_FLAG_DECODING_PARAM }, { NULL }, }; @@ -126,8 +94,8 @@ AVInputFormat ff_gsm_demuxer = { .priv_data_size = sizeof(GSMDemuxerContext), .read_header = gsm_read_header, .read_packet = gsm_read_packet, - .read_seek2 = gsm_read_seek2, + .flags = AVFMT_GENERIC_INDEX, .extensions = "gsm", - .value = CODEC_ID_GSM, + .raw_codec_id = AV_CODEC_ID_GSM, .priv_class = &class, };