diff options
author | Aurelien Jacobs <aurel@gnuage.org> | 2010-08-31 01:17:34 +0400 |
---|---|---|
committer | Aurelien Jacobs <aurel@gnuage.org> | 2010-08-31 01:17:34 +0400 |
commit | e94204dfd88b80c21f8756ea354dc12e1c4b206e (patch) | |
tree | 65a2d898465227b31bb1ebc700312783e9564720 /libavformat/pcm.c | |
parent | 79ce0f002e3078ceb68375dd80805cafbd2fcf9e (diff) |
move pcm demuxers to their own file
Originally committed as revision 24993 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavformat/pcm.c')
-rw-r--r-- | libavformat/pcm.c | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/libavformat/pcm.c b/libavformat/pcm.c new file mode 100644 index 0000000000..5de23af1cb --- /dev/null +++ b/libavformat/pcm.c @@ -0,0 +1,55 @@ +/* + * PCM common functions + * Copyright (c) 2003 Fabrice Bellard + * + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include "avformat.h" +#include "pcm.h" + +int pcm_read_seek(AVFormatContext *s, + int stream_index, int64_t timestamp, int flags) +{ + AVStream *st; + int block_align, byte_rate; + int64_t pos, ret; + + st = s->streams[0]; + + block_align = st->codec->block_align ? st->codec->block_align : + (av_get_bits_per_sample(st->codec->codec_id) * st->codec->channels) >> 3; + byte_rate = st->codec->bit_rate ? st->codec->bit_rate >> 3 : + block_align * st->codec->sample_rate; + + if (block_align <= 0 || byte_rate <= 0) + return -1; + if (timestamp < 0) timestamp = 0; + + /* compute the position by aligning it to block_align */ + pos = av_rescale_rnd(timestamp * byte_rate, + st->time_base.num, + st->time_base.den * (int64_t)block_align, + (flags & AVSEEK_FLAG_BACKWARD) ? AV_ROUND_DOWN : AV_ROUND_UP); + pos *= block_align; + + /* recompute exact position */ + st->cur_dts = av_rescale(pos, st->time_base.den, byte_rate * (int64_t)st->time_base.num); + if ((ret = url_fseek(s->pb, pos + s->data_offset, SEEK_SET)) < 0) + return ret; + return 0; +} |