diff options
author | Federico Simoncelli <federico.simoncelli@gmail.com> | 2014-01-05 13:03:14 +0100 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2014-01-05 18:44:06 +0100 |
commit | b13d6c837fd70e494279a50f6bf7c40f43842f6a (patch) | |
tree | 528901a087e95f82883959ce2e4465f1953edc9c /libavdevice | |
parent | d04aceb7d03233ccdfb572802593961830e695a6 (diff) | |
download | ffmpeg-b13d6c837fd70e494279a50f6bf7c40f43842f6a.tar.gz |
pulse: set time_base as multiple of sample_rate
The stream time_base has been changed to be a multiple of the
device sample_rate. Now the frame_duration computation is simpler
and a message will warn about problematic frame_size values.
Signed-off-by: Federico Simoncelli <fsimonce@redhat.com>
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavdevice')
-rw-r--r-- | libavdevice/pulse_audio_dec.c | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/libavdevice/pulse_audio_dec.c b/libavdevice/pulse_audio_dec.c index 639b381c34..38f2ad0fd3 100644 --- a/libavdevice/pulse_audio_dec.c +++ b/libavdevice/pulse_audio_dec.c @@ -54,7 +54,7 @@ static av_cold int pulse_read_header(AVFormatContext *s) PulseData *pd = s->priv_data; AVStream *st; char *device = NULL; - int ret; + int ret, sample_bytes; enum AVCodecID codec_id = s->audio_codec_id == AV_CODEC_ID_NONE ? DEFAULT_CODEC_ID : s->audio_codec_id; const pa_sample_spec ss = { ff_codec_id_to_pulse_format(codec_id), @@ -90,11 +90,17 @@ static av_cold int pulse_read_header(AVFormatContext *s) st->codec->codec_id = codec_id; st->codec->sample_rate = pd->sample_rate; st->codec->channels = pd->channels; - avpriv_set_pts_info(st, 64, 1, 1000000); /* 64 bits pts in us */ + avpriv_set_pts_info(st, 64, 1, pd->sample_rate); /* 64 bits pts in us */ pd->pts = AV_NOPTS_VALUE; - pd->frame_duration = (pd->frame_size * 1000000LL * 8) / - (pd->sample_rate * pd->channels * av_get_bits_per_sample(codec_id)); + sample_bytes = (av_get_bits_per_sample(codec_id) >> 3) * pd->channels; + + if (pd->frame_size % sample_bytes) { + av_log(s, AV_LOG_WARNING, "frame_size %i is not divisible by %i " + "(channels * bytes_per_sample) \n", pd->frame_size, sample_bytes); + } + + pd->frame_duration = pd->frame_size / sample_bytes; return 0; } |