Revision 6b10228a libavformat/matroskadec.c
libavformat/matroskadec.c | ||
---|---|---|
33 | 33 |
/* For ff_codec_get_id(). */ |
34 | 34 |
#include "riff.h" |
35 | 35 |
#include "isom.h" |
36 |
#include "rm.h" |
|
36 | 37 |
#include "matroska.h" |
37 | 38 |
#include "libavcodec/mpeg4audio.h" |
38 | 39 |
#include "libavutil/intfloat_readwrite.h" |
... | ... | |
1312 | 1313 |
track->audio.out_samplerate = 8000; |
1313 | 1314 |
track->audio.channels = 1; |
1314 | 1315 |
} else if (codec_id == CODEC_ID_RA_288 || codec_id == CODEC_ID_COOK || |
1315 |
codec_id == CODEC_ID_ATRAC3) { |
|
1316 |
codec_id == CODEC_ID_ATRAC3 || codec_id == CODEC_ID_SIPR) { |
|
1317 |
int flavor; |
|
1316 | 1318 |
init_put_byte(&b, track->codec_priv.data,track->codec_priv.size, |
1317 | 1319 |
0, NULL, NULL, NULL, NULL); |
1318 |
url_fskip(&b, 24); |
|
1320 |
url_fskip(&b, 22); |
|
1321 |
flavor = get_be16(&b); |
|
1319 | 1322 |
track->audio.coded_framesize = get_be32(&b); |
1320 | 1323 |
url_fskip(&b, 12); |
1321 | 1324 |
track->audio.sub_packet_h = get_be16(&b); |
... | ... | |
1326 | 1329 |
st->codec->block_align = track->audio.coded_framesize; |
1327 | 1330 |
track->codec_priv.size = 0; |
1328 | 1331 |
} else { |
1332 |
if (codec_id == CODEC_ID_SIPR && flavor < 4) { |
|
1333 |
const int sipr_bit_rate[4] = { 6504, 8496, 5000, 16000 }; |
|
1334 |
track->audio.sub_packet_size = ff_sipr_subpk_size[flavor]; |
|
1335 |
st->codec->bit_rate = sipr_bit_rate[flavor]; |
|
1336 |
} |
|
1329 | 1337 |
st->codec->block_align = track->audio.sub_packet_size; |
1330 | 1338 |
extradata_offset = 78; |
1331 | 1339 |
} |
... | ... | |
1638 | 1646 |
for (n = 0; n < laces; n++) { |
1639 | 1647 |
if ((st->codec->codec_id == CODEC_ID_RA_288 || |
1640 | 1648 |
st->codec->codec_id == CODEC_ID_COOK || |
1649 |
st->codec->codec_id == CODEC_ID_SIPR || |
|
1641 | 1650 |
st->codec->codec_id == CODEC_ID_ATRAC3) && |
1642 | 1651 |
st->codec->block_align && track->audio.sub_packet_size) { |
1643 | 1652 |
int a = st->codec->block_align; |
... | ... | |
1653 | 1662 |
for (x=0; x<h/2; x++) |
1654 | 1663 |
memcpy(track->audio.buf+x*2*w+y*cfs, |
1655 | 1664 |
data+x*cfs, cfs); |
1665 |
else if (st->codec->codec_id == CODEC_ID_SIPR) |
|
1666 |
memcpy(track->audio.buf + y*w, data, w); |
|
1656 | 1667 |
else |
1657 | 1668 |
for (x=0; x<w/sps; x++) |
1658 | 1669 |
memcpy(track->audio.buf+sps*(h*x+((h+1)/2)*(y&1)+(y>>1)), data+x*sps, sps); |
1659 | 1670 |
|
1660 | 1671 |
if (++track->audio.sub_packet_cnt >= h) { |
1672 |
if (st->codec->codec_id == CODEC_ID_SIPR) |
|
1673 |
ff_rm_reorder_sipr_data(track->audio.buf, h, w); |
|
1661 | 1674 |
track->audio.sub_packet_cnt = 0; |
1662 | 1675 |
track->audio.pkt_cnt = h*w / a; |
1663 | 1676 |
} |
Also available in: Unified diff