mirror of https://git.ffmpeg.org/ffmpeg.git
Merge commit '418693bdc5edad72b0d055f741931612d797eb05'
* commit '418693bdc5edad72b0d055f741931612d797eb05': lavc: rewrite and extend AVFrame doxy opt: avoid segfault in av_opt_next() if the class does not have an option list ttadec: fix last frame handling when seeking alacdec: do not be too strict about the extradata size Conflicts: libavcodec/alac.c libavcodec/avcodec.h libavcodec/tta.c libavutil/opt.c Merged-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
commit
2f9903f662
|
@ -573,10 +573,9 @@ static av_cold int alac_decode_init(AVCodecContext * avctx)
|
||||||
alac->avctx = avctx;
|
alac->avctx = avctx;
|
||||||
|
|
||||||
/* initialize from the extradata */
|
/* initialize from the extradata */
|
||||||
if (alac->avctx->extradata_size != ALAC_EXTRADATA_SIZE) {
|
if (alac->avctx->extradata_size < ALAC_EXTRADATA_SIZE) {
|
||||||
av_log(avctx, AV_LOG_ERROR, "expected %d extradata bytes\n",
|
av_log(avctx, AV_LOG_ERROR, "extradata is too small\n");
|
||||||
ALAC_EXTRADATA_SIZE);
|
return AVERROR_INVALIDDATA;
|
||||||
return -1;
|
|
||||||
}
|
}
|
||||||
if (alac_set_info(alac)) {
|
if (alac_set_info(alac)) {
|
||||||
av_log(avctx, AV_LOG_ERROR, "set_info failed\n");
|
av_log(avctx, AV_LOG_ERROR, "set_info failed\n");
|
||||||
|
|
|
@ -1074,14 +1074,22 @@ enum AVSideDataParamChangeFlags {
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Audio Video Frame.
|
* This structure describes decoded (raw) audio or video data.
|
||||||
* New fields can be added to the end of AVFRAME with minor version
|
*
|
||||||
* bumps. Similarly fields that are marked as to be only accessed by
|
* AVFrame must be allocated using avcodec_alloc_frame() and freed with
|
||||||
|
* avcodec_free_frame(). Note that this allocates only the AVFrame itself. The
|
||||||
|
* buffers for the data must be managed through other means.
|
||||||
|
*
|
||||||
|
* AVFrame is typically allocated once and then reused multiple times to hold
|
||||||
|
* different data (e.g. a single AVFrame to hold frames received from a
|
||||||
|
* decoder). In such a case, avcodec_get_frame_defaults() should be used to
|
||||||
|
* reset the frame to its original clean state before it is reused again.
|
||||||
|
*
|
||||||
|
* sizeof(AVFrame) is not a part of the public ABI, so new fields may be added
|
||||||
|
* to the end with a minor bump.
|
||||||
|
* Similarly fields that are marked as to be only accessed by
|
||||||
* av_opt_ptr() can be reordered. This allows 2 forks to add fields
|
* av_opt_ptr() can be reordered. This allows 2 forks to add fields
|
||||||
* without breaking compatibility with each other.
|
* without breaking compatibility with each other.
|
||||||
* Removal, reordering and changes in the remaining cases require
|
|
||||||
* a major version bump.
|
|
||||||
* sizeof(AVFrame) must not be used outside libavcodec.
|
|
||||||
*/
|
*/
|
||||||
typedef struct AVFrame {
|
typedef struct AVFrame {
|
||||||
#define AV_NUM_DATA_POINTERS 8
|
#define AV_NUM_DATA_POINTERS 8
|
||||||
|
|
|
@ -64,7 +64,7 @@ typedef struct TTAContext {
|
||||||
|
|
||||||
int format, channels, bps;
|
int format, channels, bps;
|
||||||
unsigned data_length;
|
unsigned data_length;
|
||||||
int frame_length, last_frame_length, total_frames;
|
int frame_length, last_frame_length;
|
||||||
|
|
||||||
int32_t *decode_buffer;
|
int32_t *decode_buffer;
|
||||||
|
|
||||||
|
@ -176,6 +176,7 @@ static int tta_check_crc(TTAContext *s, const uint8_t *buf, int buf_size)
|
||||||
static av_cold int tta_decode_init(AVCodecContext * avctx)
|
static av_cold int tta_decode_init(AVCodecContext * avctx)
|
||||||
{
|
{
|
||||||
TTAContext *s = avctx->priv_data;
|
TTAContext *s = avctx->priv_data;
|
||||||
|
int total_frames;
|
||||||
|
|
||||||
s->avctx = avctx;
|
s->avctx = avctx;
|
||||||
|
|
||||||
|
@ -242,27 +243,24 @@ static av_cold int tta_decode_init(AVCodecContext * avctx)
|
||||||
s->frame_length = 256 * avctx->sample_rate / 245;
|
s->frame_length = 256 * avctx->sample_rate / 245;
|
||||||
|
|
||||||
s->last_frame_length = s->data_length % s->frame_length;
|
s->last_frame_length = s->data_length % s->frame_length;
|
||||||
s->total_frames = s->data_length / s->frame_length +
|
total_frames = s->data_length / s->frame_length +
|
||||||
(s->last_frame_length ? 1 : 0);
|
(s->last_frame_length ? 1 : 0);
|
||||||
|
|
||||||
av_log(s->avctx, AV_LOG_DEBUG, "format: %d chans: %d bps: %d rate: %d block: %d\n",
|
av_log(s->avctx, AV_LOG_DEBUG, "format: %d chans: %d bps: %d rate: %d block: %d\n",
|
||||||
s->format, avctx->channels, avctx->bits_per_coded_sample, avctx->sample_rate,
|
s->format, avctx->channels, avctx->bits_per_coded_sample, avctx->sample_rate,
|
||||||
avctx->block_align);
|
avctx->block_align);
|
||||||
av_log(s->avctx, AV_LOG_DEBUG, "data_length: %d frame_length: %d last: %d total: %d\n",
|
av_log(s->avctx, AV_LOG_DEBUG, "data_length: %d frame_length: %d last: %d total: %d\n",
|
||||||
s->data_length, s->frame_length, s->last_frame_length, s->total_frames);
|
s->data_length, s->frame_length, s->last_frame_length, total_frames);
|
||||||
|
|
||||||
if (s->total_frames < 0)
|
|
||||||
return AVERROR_INVALIDDATA;
|
|
||||||
|
|
||||||
// FIXME: seek table
|
// FIXME: seek table
|
||||||
if (avctx->extradata_size <= 26 || s->total_frames > INT_MAX / 4 ||
|
if (avctx->extradata_size <= 26 || total_frames > INT_MAX / 4 ||
|
||||||
avctx->extradata_size - 26 < s->total_frames * 4)
|
avctx->extradata_size - 26 < total_frames * 4)
|
||||||
av_log(avctx, AV_LOG_WARNING, "Seek table missing or too small\n");
|
av_log(avctx, AV_LOG_WARNING, "Seek table missing or too small\n");
|
||||||
else if (avctx->err_recognition & AV_EF_CRCCHECK) {
|
else if (avctx->err_recognition & AV_EF_CRCCHECK) {
|
||||||
if (avctx->extradata_size < 26 + s->total_frames * 4 || tta_check_crc(s, avctx->extradata + 22, s->total_frames * 4))
|
if (tta_check_crc(s, avctx->extradata + 22, total_frames * 4))
|
||||||
return AVERROR_INVALIDDATA;
|
return AVERROR_INVALIDDATA;
|
||||||
}
|
}
|
||||||
skip_bits_long(&s->gb, 32 * s->total_frames);
|
skip_bits_long(&s->gb, 32 * total_frames);
|
||||||
skip_bits_long(&s->gb, 32); // CRC32 of seektable
|
skip_bits_long(&s->gb, 32); // CRC32 of seektable
|
||||||
|
|
||||||
if(s->frame_length >= UINT_MAX / (s->channels * sizeof(int32_t))){
|
if(s->frame_length >= UINT_MAX / (s->channels * sizeof(int32_t))){
|
||||||
|
@ -309,11 +307,6 @@ static int tta_decode_frame(AVCodecContext *avctx, void *data,
|
||||||
|
|
||||||
init_get_bits(&s->gb, buf, buf_size*8);
|
init_get_bits(&s->gb, buf, buf_size*8);
|
||||||
|
|
||||||
// FIXME: seeking
|
|
||||||
s->total_frames--;
|
|
||||||
if (!s->total_frames && s->last_frame_length)
|
|
||||||
framelen = s->last_frame_length;
|
|
||||||
|
|
||||||
/* get output buffer */
|
/* get output buffer */
|
||||||
s->frame.nb_samples = framelen;
|
s->frame.nb_samples = framelen;
|
||||||
if ((ret = ff_get_buffer(avctx, &s->frame)) < 0) {
|
if ((ret = ff_get_buffer(avctx, &s->frame)) < 0) {
|
||||||
|
@ -332,6 +325,7 @@ static int tta_decode_frame(AVCodecContext *avctx, void *data,
|
||||||
rice_init(&s->ch_ctx[i].rice, 10, 10);
|
rice_init(&s->ch_ctx[i].rice, 10, 10);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
i = 0;
|
||||||
for (p = s->decode_buffer; p < s->decode_buffer + (framelen * s->channels); p++) {
|
for (p = s->decode_buffer; p < s->decode_buffer + (framelen * s->channels); p++) {
|
||||||
int32_t *predictor = &s->ch_ctx[cur_chan].predictor;
|
int32_t *predictor = &s->ch_ctx[cur_chan].predictor;
|
||||||
TTAFilter *filter = &s->ch_ctx[cur_chan].filter;
|
TTAFilter *filter = &s->ch_ctx[cur_chan].filter;
|
||||||
|
@ -408,9 +402,16 @@ static int tta_decode_frame(AVCodecContext *avctx, void *data,
|
||||||
*r = *(r + 1) - *r;
|
*r = *(r + 1) - *r;
|
||||||
}
|
}
|
||||||
cur_chan = 0;
|
cur_chan = 0;
|
||||||
|
i++;
|
||||||
|
// check for last frame
|
||||||
|
if (i == s->last_frame_length && get_bits_left(&s->gb) / 8 == 4) {
|
||||||
|
s->frame.nb_samples = framelen = s->last_frame_length;
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
align_get_bits(&s->gb);
|
||||||
if (get_bits_left(&s->gb) < 32) {
|
if (get_bits_left(&s->gb) < 32) {
|
||||||
ret = AVERROR_INVALIDDATA;
|
ret = AVERROR_INVALIDDATA;
|
||||||
goto error;
|
goto error;
|
||||||
|
|
|
@ -65,7 +65,8 @@ const AVOption *av_opt_next(void *obj, const AVOption *last)
|
||||||
AVClass *class = *(AVClass**)obj;
|
AVClass *class = *(AVClass**)obj;
|
||||||
if (!last && class->option && class->option[0].name)
|
if (!last && class->option && class->option[0].name)
|
||||||
return class->option;
|
return class->option;
|
||||||
if (last && last[1].name) return ++last;
|
if (last && last[1].name)
|
||||||
|
return ++last;
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue