Commit c43222f4 authored by Carl Eugen Hoyos's avatar Carl Eugen Hoyos

Improve amr bitrate calculation for VBR files.

Fixes ticket #3541.
parent 8b122937
...@@ -30,6 +30,11 @@ Only mono files are supported. ...@@ -30,6 +30,11 @@ Only mono files are supported.
#include "avformat.h" #include "avformat.h"
#include "internal.h" #include "internal.h"
typedef struct {
uint64_t cumulated_size;
uint64_t block_count;
} AMRContext;
static const char AMR_header[] = "#!AMR\n"; static const char AMR_header[] = "#!AMR\n";
static const char AMRWB_header[] = "#!AMR-WB\n"; static const char AMRWB_header[] = "#!AMR-WB\n";
...@@ -110,6 +115,7 @@ static int amr_read_packet(AVFormatContext *s, AVPacket *pkt) ...@@ -110,6 +115,7 @@ static int amr_read_packet(AVFormatContext *s, AVPacket *pkt)
AVCodecContext *enc = s->streams[0]->codec; AVCodecContext *enc = s->streams[0]->codec;
int read, size = 0, toc, mode; int read, size = 0, toc, mode;
int64_t pos = avio_tell(s->pb); int64_t pos = avio_tell(s->pb);
AMRContext *amr = s->priv_data;
if (url_feof(s->pb)) { if (url_feof(s->pb)) {
return AVERROR(EIO); return AVERROR(EIO);
...@@ -136,8 +142,11 @@ static int amr_read_packet(AVFormatContext *s, AVPacket *pkt) ...@@ -136,8 +142,11 @@ static int amr_read_packet(AVFormatContext *s, AVPacket *pkt)
if (!size || av_new_packet(pkt, size)) if (!size || av_new_packet(pkt, size))
return AVERROR(EIO); return AVERROR(EIO);
/* Both AMR formats have 50 frames per second */ if (amr->cumulated_size < UINT64_MAX - size) {
s->streams[0]->codec->bit_rate = size*8*50; amr->cumulated_size += size;
/* Both AMR formats have 50 frames per second */
s->streams[0]->codec->bit_rate = amr->cumulated_size / ++amr->block_count * 8 * 50;
}
pkt->stream_index = 0; pkt->stream_index = 0;
pkt->pos = pos; pkt->pos = pos;
...@@ -157,6 +166,7 @@ static int amr_read_packet(AVFormatContext *s, AVPacket *pkt) ...@@ -157,6 +166,7 @@ static int amr_read_packet(AVFormatContext *s, AVPacket *pkt)
AVInputFormat ff_amr_demuxer = { AVInputFormat ff_amr_demuxer = {
.name = "amr", .name = "amr",
.long_name = NULL_IF_CONFIG_SMALL("3GPP AMR"), .long_name = NULL_IF_CONFIG_SMALL("3GPP AMR"),
.priv_data_size = sizeof(AMRContext),
.read_probe = amr_probe, .read_probe = amr_probe,
.read_header = amr_read_header, .read_header = amr_read_header,
.read_packet = amr_read_packet, .read_packet = amr_read_packet,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment