summaryrefslogtreecommitdiff
path: root/libavformat/matroskadec.c
diff options
context:
space:
mode:
authorAurelien Jacobs <aurel@gnuage.org>2010-03-12 23:49:06 +0000
committerAurelien Jacobs <aurel@gnuage.org>2010-03-12 23:49:06 +0000
commit6b10228a5505fdb7f762b6ee9d80b83e8d025006 (patch)
tree1bcf155f967f3d18ada16c1124fd753eba541f01 /libavformat/matroskadec.c
parent1ab0406db1f338d72fbdda3a03bd9ddddb9c9d08 (diff)
matroskadec: add support for SIPR audio tracks
Originally committed as revision 22492 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavformat/matroskadec.c')
-rw-r--r--libavformat/matroskadec.c17
1 files changed, 15 insertions, 2 deletions
diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c
index 5ae1fde977..b4b6d5cf9f 100644
--- a/libavformat/matroskadec.c
+++ b/libavformat/matroskadec.c
@@ -33,6 +33,7 @@
/* For ff_codec_get_id(). */
#include "riff.h"
#include "isom.h"
+#include "rm.h"
#include "matroska.h"
#include "libavcodec/mpeg4audio.h"
#include "libavutil/intfloat_readwrite.h"
@@ -1312,10 +1313,12 @@ static int matroska_read_header(AVFormatContext *s, AVFormatParameters *ap)
track->audio.out_samplerate = 8000;
track->audio.channels = 1;
} else if (codec_id == CODEC_ID_RA_288 || codec_id == CODEC_ID_COOK ||
- codec_id == CODEC_ID_ATRAC3) {
+ codec_id == CODEC_ID_ATRAC3 || codec_id == CODEC_ID_SIPR) {
+ int flavor;
init_put_byte(&b, track->codec_priv.data,track->codec_priv.size,
0, NULL, NULL, NULL, NULL);
- url_fskip(&b, 24);
+ url_fskip(&b, 22);
+ flavor = get_be16(&b);
track->audio.coded_framesize = get_be32(&b);
url_fskip(&b, 12);
track->audio.sub_packet_h = get_be16(&b);
@@ -1326,6 +1329,11 @@ static int matroska_read_header(AVFormatContext *s, AVFormatParameters *ap)
st->codec->block_align = track->audio.coded_framesize;
track->codec_priv.size = 0;
} else {
+ if (codec_id == CODEC_ID_SIPR && flavor < 4) {
+ const int sipr_bit_rate[4] = { 6504, 8496, 5000, 16000 };
+ track->audio.sub_packet_size = ff_sipr_subpk_size[flavor];
+ st->codec->bit_rate = sipr_bit_rate[flavor];
+ }
st->codec->block_align = track->audio.sub_packet_size;
extradata_offset = 78;
}
@@ -1638,6 +1646,7 @@ static int matroska_parse_block(MatroskaDemuxContext *matroska, uint8_t *data,
for (n = 0; n < laces; n++) {
if ((st->codec->codec_id == CODEC_ID_RA_288 ||
st->codec->codec_id == CODEC_ID_COOK ||
+ st->codec->codec_id == CODEC_ID_SIPR ||
st->codec->codec_id == CODEC_ID_ATRAC3) &&
st->codec->block_align && track->audio.sub_packet_size) {
int a = st->codec->block_align;
@@ -1653,11 +1662,15 @@ static int matroska_parse_block(MatroskaDemuxContext *matroska, uint8_t *data,
for (x=0; x<h/2; x++)
memcpy(track->audio.buf+x*2*w+y*cfs,
data+x*cfs, cfs);
+ else if (st->codec->codec_id == CODEC_ID_SIPR)
+ memcpy(track->audio.buf + y*w, data, w);
else
for (x=0; x<w/sps; x++)
memcpy(track->audio.buf+sps*(h*x+((h+1)/2)*(y&1)+(y>>1)), data+x*sps, sps);
if (++track->audio.sub_packet_cnt >= h) {
+ if (st->codec->codec_id == CODEC_ID_SIPR)
+ ff_rm_reorder_sipr_data(track->audio.buf, h, w);
track->audio.sub_packet_cnt = 0;
track->audio.pkt_cnt = h*w / a;
}