decode qcelp in aiff, implement #1524, patch by Vitor
Originally committed as revision 20674 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
parent
0a04566120
commit
cea65433e0
@ -46,6 +46,7 @@ static const AVCodecTag ff_codec_aiff_tags[] = {
|
|||||||
{ CODEC_ID_PCM_S16LE, MKTAG('s','o','w','t') },
|
{ CODEC_ID_PCM_S16LE, MKTAG('s','o','w','t') },
|
||||||
{ CODEC_ID_ADPCM_IMA_QT, MKTAG('i','m','a','4') },
|
{ CODEC_ID_ADPCM_IMA_QT, MKTAG('i','m','a','4') },
|
||||||
{ CODEC_ID_QDM2, MKTAG('Q','D','M','2') },
|
{ CODEC_ID_QDM2, MKTAG('Q','D','M','2') },
|
||||||
|
{ CODEC_ID_QCELP, MKTAG('Q','c','l','p') },
|
||||||
{ CODEC_ID_NONE, 0 },
|
{ CODEC_ID_NONE, 0 },
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -127,6 +127,10 @@ static unsigned int get_aiff_header(ByteIOContext *pb, AVCodecContext *codec,
|
|||||||
codec->block_align = 33;
|
codec->block_align = 33;
|
||||||
codec->frame_size = 160;
|
codec->frame_size = 160;
|
||||||
break;
|
break;
|
||||||
|
case CODEC_ID_QCELP:
|
||||||
|
codec->block_align = 35;
|
||||||
|
codec->frame_size= 160;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -284,7 +288,7 @@ static int aiff_read_packet(AVFormatContext *s,
|
|||||||
AVStream *st = s->streams[0];
|
AVStream *st = s->streams[0];
|
||||||
AIFFInputContext *aiff = s->priv_data;
|
AIFFInputContext *aiff = s->priv_data;
|
||||||
int64_t max_size;
|
int64_t max_size;
|
||||||
int res;
|
int res, size;
|
||||||
|
|
||||||
/* calculate size of remaining data */
|
/* calculate size of remaining data */
|
||||||
max_size = aiff->data_end - url_ftell(s->pb);
|
max_size = aiff->data_end - url_ftell(s->pb);
|
||||||
@ -292,8 +296,12 @@ static int aiff_read_packet(AVFormatContext *s,
|
|||||||
return AVERROR_EOF;
|
return AVERROR_EOF;
|
||||||
|
|
||||||
/* Now for that packet */
|
/* Now for that packet */
|
||||||
max_size = FFMIN(max_size, (MAX_SIZE / st->codec->block_align) * st->codec->block_align);
|
if (st->codec->block_align >= 33) // GSM, QCLP, IMA4
|
||||||
res = av_get_packet(s->pb, pkt, max_size);
|
size = st->codec->block_align;
|
||||||
|
else
|
||||||
|
size = (MAX_SIZE / st->codec->block_align) * st->codec->block_align;
|
||||||
|
size = FFMIN(max_size, size);
|
||||||
|
res = av_get_packet(s->pb, pkt, size);
|
||||||
if (res < 0)
|
if (res < 0)
|
||||||
return res;
|
return res;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user