mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-01-08 13:22:53 +02:00
Merge remote-tracking branch 'qatar/master'
* qatar/master: vc1: use an enum for Frame Coding Mode doc: cleanup filter section indeo3: error out if no motion vector is set. x86inc: Flag shufps as an floating-point instruction for the AVX emulation code. mpegaudio: do not use init_static_data() for initializing tables. musepack: fix signed shift overflow in mpc_read_packet() mov: Make format string match variable type. wmavoice: Make format string match variable type. vc1: select interlaced scan table by FCM element Generalize RIFF INFO tag support; support reading INFO tag in wav pthread: track thread existence in a separate variable. Conflicts: doc/filters.texi libavcodec/pthread.c libavformat/avi.c libavformat/riff.c libavformat/riff.h libavformat/wav.c Merged-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
commit
1e19927f12
@ -1401,8 +1401,7 @@ gradfun=1.2
|
|||||||
|
|
||||||
Flip the input video horizontally.
|
Flip the input video horizontally.
|
||||||
|
|
||||||
For example to horizontally flip the video in input with
|
For example to horizontally flip the input video with @command{ffmpeg}:
|
||||||
@file{ffmpeg}:
|
|
||||||
@example
|
@example
|
||||||
ffmpeg -i in.avi -vf "hflip" out.avi
|
ffmpeg -i in.avi -vf "hflip" out.avi
|
||||||
@end example
|
@end example
|
||||||
|
@ -68,7 +68,7 @@ static void fill_picture_parameters(AVCodecContext *avctx,
|
|||||||
pp->bPicStructure |= 0x01;
|
pp->bPicStructure |= 0x01;
|
||||||
if (s->picture_structure & PICT_BOTTOM_FIELD)
|
if (s->picture_structure & PICT_BOTTOM_FIELD)
|
||||||
pp->bPicStructure |= 0x02;
|
pp->bPicStructure |= 0x02;
|
||||||
pp->bSecondField = v->interlace && v->fcm != 0x03 && !s->first_field;
|
pp->bSecondField = v->interlace && v->fcm != ILACE_FIELD && !s->first_field;
|
||||||
pp->bPicIntra = s->pict_type == AV_PICTURE_TYPE_I;
|
pp->bPicIntra = s->pict_type == AV_PICTURE_TYPE_I;
|
||||||
pp->bPicBackwardPrediction = s->pict_type == AV_PICTURE_TYPE_B;
|
pp->bPicBackwardPrediction = s->pict_type == AV_PICTURE_TYPE_B;
|
||||||
pp->bBidirectionalAveragingMode = (1 << 7) |
|
pp->bBidirectionalAveragingMode = (1 << 7) |
|
||||||
@ -100,7 +100,7 @@ static void fill_picture_parameters(AVCodecContext *avctx,
|
|||||||
(s->resync_marker << 4) |
|
(s->resync_marker << 4) |
|
||||||
(v->rangered << 3) |
|
(v->rangered << 3) |
|
||||||
(s->max_b_frames );
|
(s->max_b_frames );
|
||||||
pp->bPicExtrapolation = (!v->interlace || v->fcm == 0x00) ? 1 : 2;
|
pp->bPicExtrapolation = (!v->interlace || v->fcm == PROGRESSIVE) ? 1 : 2;
|
||||||
pp->bPicDeblocked = ((v->profile != PROFILE_ADVANCED && v->rangeredfrm) << 5) |
|
pp->bPicDeblocked = ((v->profile != PROFILE_ADVANCED && v->rangeredfrm) << 5) |
|
||||||
(s->loop_filter << 1);
|
(s->loop_filter << 1);
|
||||||
pp->bPicDeblockConfined = (v->postprocflag << 7) |
|
pp->bPicDeblockConfined = (v->postprocflag << 7) |
|
||||||
|
@ -759,6 +759,8 @@ static int parse_bintree(Indeo3DecodeContext *ctx, AVCodecContext *avctx,
|
|||||||
av_log(avctx, AV_LOG_ERROR, "SkipCell procedure not implemented yet!\n");
|
av_log(avctx, AV_LOG_ERROR, "SkipCell procedure not implemented yet!\n");
|
||||||
|
|
||||||
CHECK_CELL
|
CHECK_CELL
|
||||||
|
if(!curr_cell.mv_ptr)
|
||||||
|
return AVERROR_INVALIDDATA;
|
||||||
copy_cell(ctx, plane, &curr_cell);
|
copy_cell(ctx, plane, &curr_cell);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -269,7 +269,7 @@ static inline int l3_unscale(int value, int exponent)
|
|||||||
return m;
|
return m;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void decode_init_static(AVCodec *codec)
|
static av_cold void decode_init_static(void)
|
||||||
{
|
{
|
||||||
int i, j, k;
|
int i, j, k;
|
||||||
int offset;
|
int offset;
|
||||||
@ -462,8 +462,14 @@ static void decode_init_static(AVCodec *codec)
|
|||||||
|
|
||||||
static av_cold int decode_init(AVCodecContext * avctx)
|
static av_cold int decode_init(AVCodecContext * avctx)
|
||||||
{
|
{
|
||||||
|
static int initialized_tables = 0;
|
||||||
MPADecodeContext *s = avctx->priv_data;
|
MPADecodeContext *s = avctx->priv_data;
|
||||||
|
|
||||||
|
if (!initialized_tables) {
|
||||||
|
decode_init_static();
|
||||||
|
initialized_tables = 1;
|
||||||
|
}
|
||||||
|
|
||||||
s->avctx = avctx;
|
s->avctx = avctx;
|
||||||
|
|
||||||
ff_mpadsp_init(&s->mpadsp);
|
ff_mpadsp_init(&s->mpadsp);
|
||||||
@ -1996,7 +2002,6 @@ AVCodec ff_mp1_decoder = {
|
|||||||
.type = AVMEDIA_TYPE_AUDIO,
|
.type = AVMEDIA_TYPE_AUDIO,
|
||||||
.id = CODEC_ID_MP1,
|
.id = CODEC_ID_MP1,
|
||||||
.priv_data_size = sizeof(MPADecodeContext),
|
.priv_data_size = sizeof(MPADecodeContext),
|
||||||
.init_static_data = decode_init_static,
|
|
||||||
.init = decode_init,
|
.init = decode_init,
|
||||||
.decode = decode_frame,
|
.decode = decode_frame,
|
||||||
#if FF_API_PARSE_FRAME
|
#if FF_API_PARSE_FRAME
|
||||||
@ -2012,7 +2017,6 @@ AVCodec ff_mp2_decoder = {
|
|||||||
.type = AVMEDIA_TYPE_AUDIO,
|
.type = AVMEDIA_TYPE_AUDIO,
|
||||||
.id = CODEC_ID_MP2,
|
.id = CODEC_ID_MP2,
|
||||||
.priv_data_size = sizeof(MPADecodeContext),
|
.priv_data_size = sizeof(MPADecodeContext),
|
||||||
.init_static_data = decode_init_static,
|
|
||||||
.init = decode_init,
|
.init = decode_init,
|
||||||
.decode = decode_frame,
|
.decode = decode_frame,
|
||||||
#if FF_API_PARSE_FRAME
|
#if FF_API_PARSE_FRAME
|
||||||
@ -2028,7 +2032,6 @@ AVCodec ff_mp3_decoder = {
|
|||||||
.type = AVMEDIA_TYPE_AUDIO,
|
.type = AVMEDIA_TYPE_AUDIO,
|
||||||
.id = CODEC_ID_MP3,
|
.id = CODEC_ID_MP3,
|
||||||
.priv_data_size = sizeof(MPADecodeContext),
|
.priv_data_size = sizeof(MPADecodeContext),
|
||||||
.init_static_data = decode_init_static,
|
|
||||||
.init = decode_init,
|
.init = decode_init,
|
||||||
.decode = decode_frame,
|
.decode = decode_frame,
|
||||||
#if FF_API_PARSE_FRAME
|
#if FF_API_PARSE_FRAME
|
||||||
@ -2044,7 +2047,6 @@ AVCodec ff_mp3adu_decoder = {
|
|||||||
.type = AVMEDIA_TYPE_AUDIO,
|
.type = AVMEDIA_TYPE_AUDIO,
|
||||||
.id = CODEC_ID_MP3ADU,
|
.id = CODEC_ID_MP3ADU,
|
||||||
.priv_data_size = sizeof(MPADecodeContext),
|
.priv_data_size = sizeof(MPADecodeContext),
|
||||||
.init_static_data = decode_init_static,
|
|
||||||
.init = decode_init,
|
.init = decode_init,
|
||||||
.decode = decode_frame_adu,
|
.decode = decode_frame_adu,
|
||||||
#if FF_API_PARSE_FRAME
|
#if FF_API_PARSE_FRAME
|
||||||
@ -2060,7 +2062,6 @@ AVCodec ff_mp3on4_decoder = {
|
|||||||
.type = AVMEDIA_TYPE_AUDIO,
|
.type = AVMEDIA_TYPE_AUDIO,
|
||||||
.id = CODEC_ID_MP3ON4,
|
.id = CODEC_ID_MP3ON4,
|
||||||
.priv_data_size = sizeof(MP3On4DecodeContext),
|
.priv_data_size = sizeof(MP3On4DecodeContext),
|
||||||
.init_static_data = decode_init_static,
|
|
||||||
.init = decode_init_mp3on4,
|
.init = decode_init_mp3on4,
|
||||||
.close = decode_close_mp3on4,
|
.close = decode_close_mp3on4,
|
||||||
.decode = decode_frame_mp3on4,
|
.decode = decode_frame_mp3on4,
|
||||||
|
@ -28,7 +28,6 @@ AVCodec ff_mp1float_decoder = {
|
|||||||
.type = AVMEDIA_TYPE_AUDIO,
|
.type = AVMEDIA_TYPE_AUDIO,
|
||||||
.id = CODEC_ID_MP1,
|
.id = CODEC_ID_MP1,
|
||||||
.priv_data_size = sizeof(MPADecodeContext),
|
.priv_data_size = sizeof(MPADecodeContext),
|
||||||
.init_static_data = decode_init_static,
|
|
||||||
.init = decode_init,
|
.init = decode_init,
|
||||||
.decode = decode_frame,
|
.decode = decode_frame,
|
||||||
#if FF_API_PARSE_FRAME
|
#if FF_API_PARSE_FRAME
|
||||||
@ -44,7 +43,6 @@ AVCodec ff_mp2float_decoder = {
|
|||||||
.type = AVMEDIA_TYPE_AUDIO,
|
.type = AVMEDIA_TYPE_AUDIO,
|
||||||
.id = CODEC_ID_MP2,
|
.id = CODEC_ID_MP2,
|
||||||
.priv_data_size = sizeof(MPADecodeContext),
|
.priv_data_size = sizeof(MPADecodeContext),
|
||||||
.init_static_data = decode_init_static,
|
|
||||||
.init = decode_init,
|
.init = decode_init,
|
||||||
.decode = decode_frame,
|
.decode = decode_frame,
|
||||||
#if FF_API_PARSE_FRAME
|
#if FF_API_PARSE_FRAME
|
||||||
@ -60,7 +58,6 @@ AVCodec ff_mp3float_decoder = {
|
|||||||
.type = AVMEDIA_TYPE_AUDIO,
|
.type = AVMEDIA_TYPE_AUDIO,
|
||||||
.id = CODEC_ID_MP3,
|
.id = CODEC_ID_MP3,
|
||||||
.priv_data_size = sizeof(MPADecodeContext),
|
.priv_data_size = sizeof(MPADecodeContext),
|
||||||
.init_static_data = decode_init_static,
|
|
||||||
.init = decode_init,
|
.init = decode_init,
|
||||||
.decode = decode_frame,
|
.decode = decode_frame,
|
||||||
#if FF_API_PARSE_FRAME
|
#if FF_API_PARSE_FRAME
|
||||||
@ -76,7 +73,6 @@ AVCodec ff_mp3adufloat_decoder = {
|
|||||||
.type = AVMEDIA_TYPE_AUDIO,
|
.type = AVMEDIA_TYPE_AUDIO,
|
||||||
.id = CODEC_ID_MP3ADU,
|
.id = CODEC_ID_MP3ADU,
|
||||||
.priv_data_size = sizeof(MPADecodeContext),
|
.priv_data_size = sizeof(MPADecodeContext),
|
||||||
.init_static_data = decode_init_static,
|
|
||||||
.init = decode_init,
|
.init = decode_init,
|
||||||
.decode = decode_frame_adu,
|
.decode = decode_frame_adu,
|
||||||
#if FF_API_PARSE_FRAME
|
#if FF_API_PARSE_FRAME
|
||||||
@ -92,7 +88,6 @@ AVCodec ff_mp3on4float_decoder = {
|
|||||||
.type = AVMEDIA_TYPE_AUDIO,
|
.type = AVMEDIA_TYPE_AUDIO,
|
||||||
.id = CODEC_ID_MP3ON4,
|
.id = CODEC_ID_MP3ON4,
|
||||||
.priv_data_size = sizeof(MP3On4DecodeContext),
|
.priv_data_size = sizeof(MP3On4DecodeContext),
|
||||||
.init_static_data = decode_init_static,
|
|
||||||
.init = decode_init_mp3on4,
|
.init = decode_init_mp3on4,
|
||||||
.close = decode_close_mp3on4,
|
.close = decode_close_mp3on4,
|
||||||
.decode = decode_frame_mp3on4,
|
.decode = decode_frame_mp3on4,
|
||||||
|
@ -72,7 +72,7 @@ typedef struct PerThreadContext {
|
|||||||
struct FrameThreadContext *parent;
|
struct FrameThreadContext *parent;
|
||||||
|
|
||||||
pthread_t thread;
|
pthread_t thread;
|
||||||
int thread_created;
|
int thread_init;
|
||||||
pthread_cond_t input_cond; ///< Used to wait for a new packet from the main thread.
|
pthread_cond_t input_cond; ///< Used to wait for a new packet from the main thread.
|
||||||
pthread_cond_t progress_cond; ///< Used by child threads to wait for progress to change.
|
pthread_cond_t progress_cond; ///< Used by child threads to wait for progress to change.
|
||||||
pthread_cond_t output_cond; ///< Used by the main thread to wait for frames to finish.
|
pthread_cond_t output_cond; ///< Used by the main thread to wait for frames to finish.
|
||||||
@ -659,9 +659,9 @@ static void frame_thread_free(AVCodecContext *avctx, int thread_count)
|
|||||||
pthread_cond_signal(&p->input_cond);
|
pthread_cond_signal(&p->input_cond);
|
||||||
pthread_mutex_unlock(&p->mutex);
|
pthread_mutex_unlock(&p->mutex);
|
||||||
|
|
||||||
if (p->thread_created)
|
if (p->thread_init)
|
||||||
pthread_join(p->thread, NULL);
|
pthread_join(p->thread, NULL);
|
||||||
p->thread_created=0;
|
p->thread_init=0;
|
||||||
|
|
||||||
if (codec->close)
|
if (codec->close)
|
||||||
codec->close(p->avctx);
|
codec->close(p->avctx);
|
||||||
@ -765,8 +765,8 @@ static int frame_thread_init(AVCodecContext *avctx)
|
|||||||
|
|
||||||
if (err) goto error;
|
if (err) goto error;
|
||||||
|
|
||||||
p->thread_created= !pthread_create(&p->thread, NULL, frame_worker_thread, p);
|
p->thread_init= !pthread_create(&p->thread, NULL, frame_worker_thread, p);
|
||||||
if(!p->thread_created)
|
if(!p->thread_init)
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -841,14 +841,14 @@ int vc1_parse_frame_header_adv(VC1Context *v, GetBitContext* gb)
|
|||||||
if (v->interlace) {
|
if (v->interlace) {
|
||||||
v->fcm = decode012(gb);
|
v->fcm = decode012(gb);
|
||||||
if (v->fcm) {
|
if (v->fcm) {
|
||||||
if (v->fcm == 2)
|
if (v->fcm == ILACE_FIELD)
|
||||||
v->field_mode = 1;
|
v->field_mode = 1;
|
||||||
if (!v->warn_interlaced++)
|
if (!v->warn_interlaced++)
|
||||||
av_log(v->s.avctx, AV_LOG_ERROR,
|
av_log(v->s.avctx, AV_LOG_ERROR,
|
||||||
"Interlaced frames/fields support is incomplete\n");
|
"Interlaced frames/fields support is incomplete\n");
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
v->fcm = 0;
|
v->fcm = PROGRESSIVE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (v->field_mode) {
|
if (v->field_mode) {
|
||||||
@ -962,7 +962,7 @@ int vc1_parse_frame_header_adv(VC1Context *v, GetBitContext* gb)
|
|||||||
switch (v->s.pict_type) {
|
switch (v->s.pict_type) {
|
||||||
case AV_PICTURE_TYPE_I:
|
case AV_PICTURE_TYPE_I:
|
||||||
case AV_PICTURE_TYPE_BI:
|
case AV_PICTURE_TYPE_BI:
|
||||||
if (v->fcm == 1) { //interlace frame picture
|
if (v->fcm == ILACE_FRAME) { //interlace frame picture
|
||||||
status = bitplane_decoding(v->fieldtx_plane, &v->fieldtx_is_raw, v);
|
status = bitplane_decoding(v->fieldtx_plane, &v->fieldtx_is_raw, v);
|
||||||
if (status < 0)
|
if (status < 0)
|
||||||
return -1;
|
return -1;
|
||||||
@ -1003,7 +1003,7 @@ int vc1_parse_frame_header_adv(VC1Context *v, GetBitContext* gb)
|
|||||||
v->dmvrange = get_unary(gb, 0, 3);
|
v->dmvrange = get_unary(gb, 0, 3);
|
||||||
else
|
else
|
||||||
v->dmvrange = 0;
|
v->dmvrange = 0;
|
||||||
if (v->fcm == 1) { // interlaced frame picture
|
if (v->fcm == ILACE_FRAME) { // interlaced frame picture
|
||||||
v->fourmvswitch = get_bits1(gb);
|
v->fourmvswitch = get_bits1(gb);
|
||||||
v->intcomp = get_bits1(gb);
|
v->intcomp = get_bits1(gb);
|
||||||
if (v->intcomp) {
|
if (v->intcomp) {
|
||||||
@ -1043,7 +1043,7 @@ int vc1_parse_frame_header_adv(VC1Context *v, GetBitContext* gb)
|
|||||||
v->tt_index = 1;
|
v->tt_index = 1;
|
||||||
else
|
else
|
||||||
v->tt_index = 2;
|
v->tt_index = 2;
|
||||||
if (v->fcm != 1) {
|
if (v->fcm != ILACE_FRAME) {
|
||||||
int mvmode;
|
int mvmode;
|
||||||
mvmode = get_unary(gb, 1, 4);
|
mvmode = get_unary(gb, 1, 4);
|
||||||
lowquant = (v->pq > 12) ? 0 : 1;
|
lowquant = (v->pq > 12) ? 0 : 1;
|
||||||
@ -1078,7 +1078,7 @@ int vc1_parse_frame_header_adv(VC1Context *v, GetBitContext* gb)
|
|||||||
|| (v->mv_mode == MV_PMODE_INTENSITY_COMP
|
|| (v->mv_mode == MV_PMODE_INTENSITY_COMP
|
||||||
&& v->mv_mode2 == MV_PMODE_1MV_HPEL_BILIN));
|
&& v->mv_mode2 == MV_PMODE_1MV_HPEL_BILIN));
|
||||||
}
|
}
|
||||||
if (v->fcm == 0) { // progressive
|
if (v->fcm == PROGRESSIVE) { // progressive
|
||||||
if ((v->mv_mode == MV_PMODE_INTENSITY_COMP &&
|
if ((v->mv_mode == MV_PMODE_INTENSITY_COMP &&
|
||||||
v->mv_mode2 == MV_PMODE_MIXED_MV)
|
v->mv_mode2 == MV_PMODE_MIXED_MV)
|
||||||
|| v->mv_mode == MV_PMODE_MIXED_MV) {
|
|| v->mv_mode == MV_PMODE_MIXED_MV) {
|
||||||
@ -1100,7 +1100,7 @@ int vc1_parse_frame_header_adv(VC1Context *v, GetBitContext* gb)
|
|||||||
/* Hopefully this is correct for P frames */
|
/* Hopefully this is correct for P frames */
|
||||||
v->s.mv_table_index = get_bits(gb, 2); //but using ff_vc1_ tables
|
v->s.mv_table_index = get_bits(gb, 2); //but using ff_vc1_ tables
|
||||||
v->cbpcy_vlc = &ff_vc1_cbpcy_p_vlc[get_bits(gb, 2)];
|
v->cbpcy_vlc = &ff_vc1_cbpcy_p_vlc[get_bits(gb, 2)];
|
||||||
} else if (v->fcm == 1) { // frame interlaced
|
} else if (v->fcm == ILACE_FRAME) { // frame interlaced
|
||||||
v->qs_last = v->s.quarter_sample;
|
v->qs_last = v->s.quarter_sample;
|
||||||
v->s.quarter_sample = 1;
|
v->s.quarter_sample = 1;
|
||||||
v->s.mspel = 1;
|
v->s.mspel = 1;
|
||||||
@ -1140,7 +1140,7 @@ int vc1_parse_frame_header_adv(VC1Context *v, GetBitContext* gb)
|
|||||||
break;
|
break;
|
||||||
case AV_PICTURE_TYPE_B:
|
case AV_PICTURE_TYPE_B:
|
||||||
// TODO: implement interlaced frame B picture decoding
|
// TODO: implement interlaced frame B picture decoding
|
||||||
if (v->fcm == 1)
|
if (v->fcm == ILACE_FRAME)
|
||||||
return -1;
|
return -1;
|
||||||
if (v->extended_mv)
|
if (v->extended_mv)
|
||||||
v->mvrange = get_unary(gb, 0, 3);
|
v->mvrange = get_unary(gb, 0, 3);
|
||||||
|
@ -161,6 +161,16 @@ enum COTypes {
|
|||||||
};
|
};
|
||||||
//@}
|
//@}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* FCM Frame Coding Mode
|
||||||
|
* @note some content might be marked interlaced
|
||||||
|
* but have fcm set to 0 as well (e.g. HD-DVD)
|
||||||
|
*/
|
||||||
|
enum FrameCodingMode {
|
||||||
|
PROGRESSIVE = 0, ///< in the bitstream is reported as 00b
|
||||||
|
ILACE_FRAME, ///< in the bitstream is reported as 10b
|
||||||
|
ILACE_FIELD ///< in the bitstream is reported as 11b
|
||||||
|
};
|
||||||
|
|
||||||
/** The VC1 Context
|
/** The VC1 Context
|
||||||
* @todo Change size wherever another size is more efficient
|
* @todo Change size wherever another size is more efficient
|
||||||
@ -296,7 +306,7 @@ typedef struct VC1Context{
|
|||||||
|
|
||||||
/** Frame decoding info for Advanced profile */
|
/** Frame decoding info for Advanced profile */
|
||||||
//@{
|
//@{
|
||||||
uint8_t fcm; ///< 0->Progressive, 2->Frame-Interlace, 3->Field-Interlace
|
enum FrameCodingMode fcm;
|
||||||
uint8_t numpanscanwin;
|
uint8_t numpanscanwin;
|
||||||
uint8_t tfcntr;
|
uint8_t tfcntr;
|
||||||
uint8_t rptfrm, tff, rff;
|
uint8_t rptfrm, tff, rff;
|
||||||
|
@ -501,7 +501,8 @@ static void vc1_mc_1mv(VC1Context *v, int dir)
|
|||||||
uvmy = uvmy - 2 + 4 * v->cur_field_type;
|
uvmy = uvmy - 2 + 4 * v->cur_field_type;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (v->fastuvmc && (v->fcm != 1)) { // fastuvmc shall be ignored for interlaced frame picture
|
// fastuvmc shall be ignored for interlaced frame picture
|
||||||
|
if (v->fastuvmc && (v->fcm != ILACE_FRAME)) {
|
||||||
uvmx = uvmx + ((uvmx < 0) ? (uvmx & 1) : -(uvmx & 1));
|
uvmx = uvmx + ((uvmx < 0) ? (uvmx & 1) : -(uvmx & 1));
|
||||||
uvmy = uvmy + ((uvmy < 0) ? (uvmy & 1) : -(uvmy & 1));
|
uvmy = uvmy + ((uvmy < 0) ? (uvmy & 1) : -(uvmy & 1));
|
||||||
}
|
}
|
||||||
@ -685,7 +686,7 @@ static void vc1_mc_4mv_luma(VC1Context *v, int n, int dir)
|
|||||||
uint8_t *srcY;
|
uint8_t *srcY;
|
||||||
int dxy, mx, my, src_x, src_y;
|
int dxy, mx, my, src_x, src_y;
|
||||||
int off;
|
int off;
|
||||||
int fieldmv = (v->fcm == 1) ? v->blk_mv_type[s->block_index[n]] : 0;
|
int fieldmv = (v->fcm == ILACE_FRAME) ? v->blk_mv_type[s->block_index[n]] : 0;
|
||||||
int v_edge_pos = s->v_edge_pos >> v->field_mode;
|
int v_edge_pos = s->v_edge_pos >> v->field_mode;
|
||||||
|
|
||||||
if (!v->field_mode && !v->s.last_picture.f.data[0])
|
if (!v->field_mode && !v->s.last_picture.f.data[0])
|
||||||
@ -744,7 +745,7 @@ static void vc1_mc_4mv_luma(VC1Context *v, int n, int dir)
|
|||||||
v->mv_f[1][s->block_index[k] + v->blocks_off] = f;
|
v->mv_f[1][s->block_index[k] + v->blocks_off] = f;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (v->fcm == 1) { // not sure if needed for other types of picture
|
if (v->fcm == ILACE_FRAME) { // not sure if needed for other types of picture
|
||||||
int qx, qy;
|
int qx, qy;
|
||||||
int width = s->avctx->coded_width;
|
int width = s->avctx->coded_width;
|
||||||
int height = s->avctx->coded_height >> 1;
|
int height = s->avctx->coded_height >> 1;
|
||||||
@ -761,7 +762,7 @@ static void vc1_mc_4mv_luma(VC1Context *v, int n, int dir)
|
|||||||
my -= 8 * (qy - height - 1);
|
my -= 8 * (qy - height - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((v->fcm == 1) && fieldmv)
|
if ((v->fcm == ILACE_FRAME) && fieldmv)
|
||||||
off = ((n > 1) ? s->linesize : 0) + (n & 1) * 8;
|
off = ((n > 1) ? s->linesize : 0) + (n & 1) * 8;
|
||||||
else
|
else
|
||||||
off = s->linesize * 4 * (n & 2) + (n & 1) * 8;
|
off = s->linesize * 4 * (n & 2) + (n & 1) * 8;
|
||||||
@ -779,7 +780,7 @@ static void vc1_mc_4mv_luma(VC1Context *v, int n, int dir)
|
|||||||
src_y = av_clip(src_y, -16, s->mb_height * 16);
|
src_y = av_clip(src_y, -16, s->mb_height * 16);
|
||||||
} else {
|
} else {
|
||||||
src_x = av_clip(src_x, -17, s->avctx->coded_width);
|
src_x = av_clip(src_x, -17, s->avctx->coded_width);
|
||||||
if (v->fcm == 1) {
|
if (v->fcm == ILACE_FRAME) {
|
||||||
if (src_y & 1)
|
if (src_y & 1)
|
||||||
src_y = av_clip(src_y, -17, s->avctx->coded_height + 1);
|
src_y = av_clip(src_y, -17, s->avctx->coded_height + 1);
|
||||||
else
|
else
|
||||||
@ -2917,7 +2918,7 @@ static int vc1_decode_i_block_adv(VC1Context *v, DCTELEM block[64], int n,
|
|||||||
int k;
|
int k;
|
||||||
|
|
||||||
if (v->s.ac_pred) {
|
if (v->s.ac_pred) {
|
||||||
if (!use_pred && v->fcm == 1) {
|
if (!use_pred && v->fcm == ILACE_FRAME) {
|
||||||
zz_table = v->zzi_8x8;
|
zz_table = v->zzi_8x8;
|
||||||
} else {
|
} else {
|
||||||
if (!dc_pred_dir) // top
|
if (!dc_pred_dir) // top
|
||||||
@ -2926,7 +2927,7 @@ static int vc1_decode_i_block_adv(VC1Context *v, DCTELEM block[64], int n,
|
|||||||
zz_table = v->zz_8x8[3];
|
zz_table = v->zz_8x8[3];
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (v->fcm != 1)
|
if (v->fcm != ILACE_FRAME)
|
||||||
zz_table = v->zz_8x8[1];
|
zz_table = v->zz_8x8[1];
|
||||||
else
|
else
|
||||||
zz_table = v->zzi_8x8;
|
zz_table = v->zzi_8x8;
|
||||||
@ -3136,10 +3137,10 @@ static int vc1_decode_intra_block(VC1Context *v, DCTELEM block[64], int n,
|
|||||||
i += skip;
|
i += skip;
|
||||||
if (i > 63)
|
if (i > 63)
|
||||||
break;
|
break;
|
||||||
if (v->fcm == 0)
|
if (v->fcm == PROGRESSIVE)
|
||||||
block[v->zz_8x8[0][i++]] = value;
|
block[v->zz_8x8[0][i++]] = value;
|
||||||
else {
|
else {
|
||||||
if (use_pred && (v->fcm == 1)) {
|
if (use_pred && (v->fcm == ILACE_FRAME)) {
|
||||||
if (!dc_pred_dir) // top
|
if (!dc_pred_dir) // top
|
||||||
block[v->zz_8x8[2][i++]] = value;
|
block[v->zz_8x8[2][i++]] = value;
|
||||||
else // left
|
else // left
|
||||||
@ -4739,12 +4740,12 @@ static void vc1_decode_p_blocks(VC1Context *v)
|
|||||||
for (; s->mb_x < s->mb_width; s->mb_x++) {
|
for (; s->mb_x < s->mb_width; s->mb_x++) {
|
||||||
ff_update_block_index(s);
|
ff_update_block_index(s);
|
||||||
|
|
||||||
if (v->fcm == 2)
|
if (v->fcm == ILACE_FIELD)
|
||||||
vc1_decode_p_mb_intfi(v);
|
vc1_decode_p_mb_intfi(v);
|
||||||
else if (v->fcm == 1)
|
else if (v->fcm == ILACE_FRAME)
|
||||||
vc1_decode_p_mb_intfr(v);
|
vc1_decode_p_mb_intfr(v);
|
||||||
else vc1_decode_p_mb(v);
|
else vc1_decode_p_mb(v);
|
||||||
if (s->mb_y != s->start_mb_y && apply_loop_filter && v->fcm == 0)
|
if (s->mb_y != s->start_mb_y && apply_loop_filter && v->fcm == PROGRESSIVE)
|
||||||
vc1_apply_p_loop_filter(v);
|
vc1_apply_p_loop_filter(v);
|
||||||
if (get_bits_count(&s->gb) > v->bits || get_bits_count(&s->gb) < 0) {
|
if (get_bits_count(&s->gb) > v->bits || get_bits_count(&s->gb) < 0) {
|
||||||
// TODO: may need modification to handle slice coding
|
// TODO: may need modification to handle slice coding
|
||||||
@ -4811,7 +4812,7 @@ static void vc1_decode_b_blocks(VC1Context *v)
|
|||||||
for (; s->mb_x < s->mb_width; s->mb_x++) {
|
for (; s->mb_x < s->mb_width; s->mb_x++) {
|
||||||
ff_update_block_index(s);
|
ff_update_block_index(s);
|
||||||
|
|
||||||
if (v->fcm == 2)
|
if (v->fcm == ILACE_FIELD)
|
||||||
vc1_decode_b_mb_intfi(v);
|
vc1_decode_b_mb_intfi(v);
|
||||||
else
|
else
|
||||||
vc1_decode_b_mb(v);
|
vc1_decode_b_mb(v);
|
||||||
|
@ -1795,7 +1795,7 @@ static int synth_superframe(AVCodecContext *ctx,
|
|||||||
out_size = n_samples * av_get_bytes_per_sample(ctx->sample_fmt);
|
out_size = n_samples * av_get_bytes_per_sample(ctx->sample_fmt);
|
||||||
if (*data_size < out_size) {
|
if (*data_size < out_size) {
|
||||||
av_log(ctx, AV_LOG_ERROR,
|
av_log(ctx, AV_LOG_ERROR,
|
||||||
"Output buffer too small (%d given - %zu needed)\n",
|
"Output buffer too small (%d given - %d needed)\n",
|
||||||
*data_size, out_size);
|
*data_size, out_size);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -43,8 +43,8 @@ OBJS-$(CONFIG_ASS_DEMUXER) += assdec.o
|
|||||||
OBJS-$(CONFIG_ASS_MUXER) += assenc.o
|
OBJS-$(CONFIG_ASS_MUXER) += assenc.o
|
||||||
OBJS-$(CONFIG_AU_DEMUXER) += au.o pcm.o
|
OBJS-$(CONFIG_AU_DEMUXER) += au.o pcm.o
|
||||||
OBJS-$(CONFIG_AU_MUXER) += au.o
|
OBJS-$(CONFIG_AU_MUXER) += au.o
|
||||||
OBJS-$(CONFIG_AVI_DEMUXER) += avidec.o riff.o avi.o
|
OBJS-$(CONFIG_AVI_DEMUXER) += avidec.o riff.o
|
||||||
OBJS-$(CONFIG_AVI_MUXER) += avienc.o riff.o avi.o
|
OBJS-$(CONFIG_AVI_MUXER) += avienc.o riff.o
|
||||||
OBJS-$(CONFIG_AVISYNTH) += avisynth.o
|
OBJS-$(CONFIG_AVISYNTH) += avisynth.o
|
||||||
OBJS-$(CONFIG_AVM2_MUXER) += swfenc.o
|
OBJS-$(CONFIG_AVM2_MUXER) += swfenc.o
|
||||||
OBJS-$(CONFIG_AVS_DEMUXER) += avs.o vocdec.o voc.o
|
OBJS-$(CONFIG_AVS_DEMUXER) += avs.o vocdec.o voc.o
|
||||||
|
@ -1,45 +0,0 @@
|
|||||||
/*
|
|
||||||
* AVI common data
|
|
||||||
* Copyright (c) 2010 Anton Khirnov
|
|
||||||
*
|
|
||||||
* 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 "avi.h"
|
|
||||||
|
|
||||||
const AVMetadataConv ff_avi_metadata_conv[] = {
|
|
||||||
{ "IART", "artist" },
|
|
||||||
{ "ICMT", "comment" },
|
|
||||||
{ "ICOP", "copyright" },
|
|
||||||
{ "ICRD", "date" },
|
|
||||||
{ "IGNR", "genre" },
|
|
||||||
{ "ILNG", "language" },
|
|
||||||
{ "INAM", "title" },
|
|
||||||
{ "IPRD", "album" },
|
|
||||||
{ "IPRT", "track" },
|
|
||||||
{ "ISFT", "encoder" },
|
|
||||||
{ "ITCH", "encoded_by"},
|
|
||||||
{ "strn", "title" },
|
|
||||||
{ 0 },
|
|
||||||
};
|
|
||||||
|
|
||||||
const char ff_avi_tags[][5] = {
|
|
||||||
"IARL", "IART", "ICMS", "ICMT", "ICOP", "ICRD", "ICRP", "IDIM", "IDPI",
|
|
||||||
"IENG", "IGNR", "IKEY", "ILGT", "ILNG", "IMED", "INAM", "IPLT", "IPRD",
|
|
||||||
"IPRT", "ISBJ", "ISFT", "ISHP", "ISRC", "ISRF", "ITCH",
|
|
||||||
{0}
|
|
||||||
};
|
|
@ -21,8 +21,6 @@
|
|||||||
#ifndef AVFORMAT_AVI_H
|
#ifndef AVFORMAT_AVI_H
|
||||||
#define AVFORMAT_AVI_H
|
#define AVFORMAT_AVI_H
|
||||||
|
|
||||||
#include "metadata.h"
|
|
||||||
|
|
||||||
#define AVIF_HASINDEX 0x00000010 // Index at end of file?
|
#define AVIF_HASINDEX 0x00000010 // Index at end of file?
|
||||||
#define AVIF_MUSTUSEINDEX 0x00000020
|
#define AVIF_MUSTUSEINDEX 0x00000020
|
||||||
#define AVIF_ISINTERLEAVED 0x00000100
|
#define AVIF_ISINTERLEAVED 0x00000100
|
||||||
@ -37,11 +35,4 @@
|
|||||||
/* index flags */
|
/* index flags */
|
||||||
#define AVIIF_INDEX 0x10
|
#define AVIIF_INDEX 0x10
|
||||||
|
|
||||||
extern const AVMetadataConv ff_avi_metadata_conv[];
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A list of AVI info tags.
|
|
||||||
*/
|
|
||||||
extern const char ff_avi_tags[][5];
|
|
||||||
|
|
||||||
#endif /* AVFORMAT_AVI_H */
|
#endif /* AVFORMAT_AVI_H */
|
||||||
|
@ -99,6 +99,11 @@ static const char avi_headers[][8] = {
|
|||||||
{ 0 }
|
{ 0 }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static const AVMetadataConv avi_metadata_conv[] = {
|
||||||
|
{ "strn", "title" },
|
||||||
|
{ 0 },
|
||||||
|
};
|
||||||
|
|
||||||
static int avi_load_index(AVFormatContext *s);
|
static int avi_load_index(AVFormatContext *s);
|
||||||
static int guess_ni_flag(AVFormatContext *s);
|
static int guess_ni_flag(AVFormatContext *s);
|
||||||
|
|
||||||
@ -287,15 +292,6 @@ static int avi_read_tag(AVFormatContext *s, AVStream *st, uint32_t tag, uint32_t
|
|||||||
AV_DICT_DONT_STRDUP_VAL);
|
AV_DICT_DONT_STRDUP_VAL);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void avi_read_info(AVFormatContext *s, uint64_t end)
|
|
||||||
{
|
|
||||||
while (avio_tell(s->pb) < end) {
|
|
||||||
uint32_t tag = avio_rl32(s->pb);
|
|
||||||
uint32_t size = avio_rl32(s->pb);
|
|
||||||
avi_read_tag(s, NULL, tag, size);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static const char months[12][4] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun",
|
static const char months[12][4] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun",
|
||||||
"Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };
|
"Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };
|
||||||
|
|
||||||
@ -408,7 +404,7 @@ static int avi_read_header(AVFormatContext *s, AVFormatParameters *ap)
|
|||||||
goto end_of_header;
|
goto end_of_header;
|
||||||
}
|
}
|
||||||
else if (tag1 == MKTAG('I', 'N', 'F', 'O'))
|
else if (tag1 == MKTAG('I', 'N', 'F', 'O'))
|
||||||
avi_read_info(s, list_end);
|
ff_read_riff_info(s, size - 4);
|
||||||
else if (tag1 == MKTAG('n', 'c', 'd', 't'))
|
else if (tag1 == MKTAG('n', 'c', 'd', 't'))
|
||||||
avi_read_nikon(s, list_end);
|
avi_read_nikon(s, list_end);
|
||||||
|
|
||||||
@ -778,7 +774,8 @@ static int avi_read_header(AVFormatContext *s, AVFormatParameters *ap)
|
|||||||
clean_index(s);
|
clean_index(s);
|
||||||
}
|
}
|
||||||
|
|
||||||
ff_metadata_conv_ctx(s, NULL, ff_avi_metadata_conv);
|
ff_metadata_conv_ctx(s, NULL, avi_metadata_conv);
|
||||||
|
ff_metadata_conv_ctx(s, NULL, ff_riff_info_conv);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -378,9 +378,9 @@ static int avi_write_header(AVFormatContext *s)
|
|||||||
|
|
||||||
list2 = ff_start_tag(pb, "LIST");
|
list2 = ff_start_tag(pb, "LIST");
|
||||||
ffio_wfourcc(pb, "INFO");
|
ffio_wfourcc(pb, "INFO");
|
||||||
ff_metadata_conv(&s->metadata, ff_avi_metadata_conv, NULL);
|
ff_metadata_conv(&s->metadata, ff_riff_info_conv, NULL);
|
||||||
for (i = 0; *ff_avi_tags[i]; i++) {
|
for (i = 0; *ff_riff_tags[i]; i++) {
|
||||||
if ((t = av_dict_get(s->metadata, ff_avi_tags[i], NULL, AV_DICT_MATCH_CASE)))
|
if ((t = av_dict_get(s->metadata, ff_riff_tags[i], NULL, AV_DICT_MATCH_CASE)))
|
||||||
avi_write_info_tag(s->pb, t->key, t->value);
|
avi_write_info_tag(s->pb, t->key, t->value);
|
||||||
}
|
}
|
||||||
ff_end_tag(pb, list2);
|
ff_end_tag(pb, list2);
|
||||||
|
@ -90,7 +90,7 @@ static int mov_metadata_int8_bypass_padding(MOVContext *c, AVIOContext *pb,
|
|||||||
avio_r8(pb);
|
avio_r8(pb);
|
||||||
avio_r8(pb);
|
avio_r8(pb);
|
||||||
|
|
||||||
snprintf(buf, sizeof(buf), "%hu", avio_r8(pb));
|
snprintf(buf, sizeof(buf), "%d", avio_r8(pb));
|
||||||
av_dict_set(&c->fc->metadata, key, buf, 0);
|
av_dict_set(&c->fc->metadata, key, buf, 0);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@ -101,7 +101,7 @@ static int mov_metadata_int8_no_padding(MOVContext *c, AVIOContext *pb,
|
|||||||
{
|
{
|
||||||
char buf[16];
|
char buf[16];
|
||||||
|
|
||||||
snprintf(buf, sizeof(buf), "%hu", avio_r8(pb));
|
snprintf(buf, sizeof(buf), "%d", avio_r8(pb));
|
||||||
av_dict_set(&c->fc->metadata, key, buf, 0);
|
av_dict_set(&c->fc->metadata, key, buf, 0);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -117,7 +117,8 @@ static int mpc_read_packet(AVFormatContext *s, AVPacket *pkt)
|
|||||||
{
|
{
|
||||||
MPCContext *c = s->priv_data;
|
MPCContext *c = s->priv_data;
|
||||||
int ret, size, size2, curbits, cur = c->curframe;
|
int ret, size, size2, curbits, cur = c->curframe;
|
||||||
int64_t tmp, pos;
|
unsigned tmp;
|
||||||
|
int64_t pos;
|
||||||
|
|
||||||
if (c->curframe >= c->fcount && c->fcount)
|
if (c->curframe >= c->fcount && c->fcount)
|
||||||
return -1;
|
return -1;
|
||||||
@ -134,8 +135,7 @@ static int mpc_read_packet(AVFormatContext *s, AVPacket *pkt)
|
|||||||
if(curbits <= 12){
|
if(curbits <= 12){
|
||||||
size2 = (tmp >> (12 - curbits)) & 0xFFFFF;
|
size2 = (tmp >> (12 - curbits)) & 0xFFFFF;
|
||||||
}else{
|
}else{
|
||||||
tmp = (tmp << 32) | avio_rl32(s->pb);
|
size2 = (tmp << (curbits - 12) | avio_rl32(s->pb) >> (44 - curbits)) & 0xFFFFF;
|
||||||
size2 = (tmp >> (44 - curbits)) & 0xFFFFF;
|
|
||||||
}
|
}
|
||||||
curbits += 20;
|
curbits += 20;
|
||||||
avio_seek(s->pb, pos, SEEK_SET);
|
avio_seek(s->pb, pos, SEEK_SET);
|
||||||
|
@ -357,6 +357,28 @@ const AVCodecGuid ff_codec_wav_guids[] = {
|
|||||||
{CODEC_ID_NONE}
|
{CODEC_ID_NONE}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const AVMetadataConv ff_riff_info_conv[] = {
|
||||||
|
{ "IART", "artist" },
|
||||||
|
{ "ICMT", "comment" },
|
||||||
|
{ "ICOP", "copyright" },
|
||||||
|
{ "ICRD", "date" },
|
||||||
|
{ "IGNR", "genre" },
|
||||||
|
{ "ILNG", "language" },
|
||||||
|
{ "INAM", "title" },
|
||||||
|
{ "IPRD", "album" },
|
||||||
|
{ "IPRT", "track" },
|
||||||
|
{ "ISFT", "encoder" },
|
||||||
|
{ "ITCH", "encoded_by"},
|
||||||
|
{ 0 },
|
||||||
|
};
|
||||||
|
|
||||||
|
const char ff_riff_tags[][5] = {
|
||||||
|
"IARL", "IART", "ICMS", "ICMT", "ICOP", "ICRD", "ICRP", "IDIM", "IDPI",
|
||||||
|
"IENG", "IGNR", "IKEY", "ILGT", "ILNG", "IMED", "INAM", "IPLT", "IPRD",
|
||||||
|
"IPRT", "ISBJ", "ISFT", "ISHP", "ISRC", "ISRF", "ITCH",
|
||||||
|
{0}
|
||||||
|
};
|
||||||
|
|
||||||
#if CONFIG_MUXERS
|
#if CONFIG_MUXERS
|
||||||
int64_t ff_start_tag(AVIOContext *pb, const char *tag)
|
int64_t ff_start_tag(AVIOContext *pb, const char *tag)
|
||||||
{
|
{
|
||||||
@ -656,3 +678,49 @@ enum CodecID ff_codec_guid_get_id(const AVCodecGuid *guids, ff_asf_guid guid)
|
|||||||
}
|
}
|
||||||
return CODEC_ID_NONE;
|
return CODEC_ID_NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int ff_read_riff_info(AVFormatContext *s, int64_t size)
|
||||||
|
{
|
||||||
|
int64_t start, end, cur;
|
||||||
|
AVIOContext *pb = s->pb;
|
||||||
|
|
||||||
|
start = avio_tell(pb);
|
||||||
|
end = start + size;
|
||||||
|
|
||||||
|
while ((cur = avio_tell(pb)) >= 0 && cur <= end - 8 /* = tag + size */) {
|
||||||
|
uint32_t chunk_code;
|
||||||
|
int64_t chunk_size;
|
||||||
|
char key[5] = {0};
|
||||||
|
char *value;
|
||||||
|
|
||||||
|
chunk_code = avio_rl32(pb);
|
||||||
|
chunk_size = avio_rl32(pb);
|
||||||
|
if (chunk_size > end || end - chunk_size < cur || chunk_size == UINT_MAX) {
|
||||||
|
av_log(s, AV_LOG_ERROR, "too big INFO subchunk\n");
|
||||||
|
return AVERROR_INVALIDDATA;
|
||||||
|
}
|
||||||
|
|
||||||
|
chunk_size += (chunk_size & 1);
|
||||||
|
|
||||||
|
value = av_malloc(chunk_size + 1);
|
||||||
|
if (!value) {
|
||||||
|
av_log(s, AV_LOG_ERROR, "out of memory, unable to read INFO tag\n");
|
||||||
|
return AVERROR(ENOMEM);
|
||||||
|
}
|
||||||
|
|
||||||
|
AV_WL32(key, chunk_code);
|
||||||
|
|
||||||
|
if (avio_read(pb, value, chunk_size) != chunk_size) {
|
||||||
|
av_freep(key);
|
||||||
|
av_freep(value);
|
||||||
|
av_log(s, AV_LOG_ERROR, "premature end of file while reading INFO tag\n");
|
||||||
|
return AVERROR_INVALIDDATA;
|
||||||
|
}
|
||||||
|
|
||||||
|
value[chunk_size] = 0;
|
||||||
|
|
||||||
|
av_dict_set(&s->metadata, key, value, AV_DICT_DONT_STRDUP_VAL);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
@ -31,6 +31,10 @@
|
|||||||
#include "libavcodec/avcodec.h"
|
#include "libavcodec/avcodec.h"
|
||||||
#include "avio.h"
|
#include "avio.h"
|
||||||
#include "internal.h"
|
#include "internal.h"
|
||||||
|
#include "metadata.h"
|
||||||
|
|
||||||
|
extern const AVMetadataConv ff_riff_info_conv[];
|
||||||
|
extern const char ff_riff_tags[][5];
|
||||||
|
|
||||||
int64_t ff_start_tag(AVIOContext *pb, const char *tag);
|
int64_t ff_start_tag(AVIOContext *pb, const char *tag);
|
||||||
void ff_end_tag(AVIOContext *pb, int64_t start);
|
void ff_end_tag(AVIOContext *pb, int64_t start);
|
||||||
@ -56,6 +60,8 @@ void ff_parse_specific_params(AVCodecContext *stream, int *au_rate, int *au_ssiz
|
|||||||
|
|
||||||
typedef uint8_t ff_asf_guid[16];
|
typedef uint8_t ff_asf_guid[16];
|
||||||
|
|
||||||
|
int ff_read_riff_info(AVFormatContext *s, int64_t size);
|
||||||
|
|
||||||
#define FF_PRI_GUID \
|
#define FF_PRI_GUID \
|
||||||
"%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x"
|
"%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x"
|
||||||
#define FF_ARG_GUID(g) \
|
#define FF_ARG_GUID(g) \
|
||||||
|
@ -33,7 +33,6 @@
|
|||||||
#include "pcm.h"
|
#include "pcm.h"
|
||||||
#include "riff.h"
|
#include "riff.h"
|
||||||
#include "avio.h"
|
#include "avio.h"
|
||||||
#include "avio_internal.h"
|
|
||||||
#include "metadata.h"
|
#include "metadata.h"
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
@ -231,7 +230,7 @@ AVOutputFormat ff_wav_muxer = {
|
|||||||
|
|
||||||
#if CONFIG_WAV_DEMUXER
|
#if CONFIG_WAV_DEMUXER
|
||||||
|
|
||||||
static int64_t next_tag(AVIOContext *pb, unsigned int *tag)
|
static int64_t next_tag(AVIOContext *pb, uint32_t *tag)
|
||||||
{
|
{
|
||||||
*tag = avio_rl32(pb);
|
*tag = avio_rl32(pb);
|
||||||
return avio_rl32(pb);
|
return avio_rl32(pb);
|
||||||
@ -392,7 +391,7 @@ static int wav_read_header(AVFormatContext *s,
|
|||||||
int64_t size, av_uninit(data_size);
|
int64_t size, av_uninit(data_size);
|
||||||
int64_t sample_count=0;
|
int64_t sample_count=0;
|
||||||
int rf64;
|
int rf64;
|
||||||
unsigned int tag;
|
uint32_t tag, list_type;
|
||||||
AVIOContext *pb = s->pb;
|
AVIOContext *pb = s->pb;
|
||||||
AVStream *st = NULL;
|
AVStream *st = NULL;
|
||||||
WAVContext *wav = s->priv_data;
|
WAVContext *wav = s->priv_data;
|
||||||
@ -504,6 +503,18 @@ static int wav_read_header(AVFormatContext *s,
|
|||||||
avio_rl24(pb);
|
avio_rl24(pb);
|
||||||
wav->smv_frames_per_jpeg = avio_rl24(pb);
|
wav->smv_frames_per_jpeg = avio_rl24(pb);
|
||||||
goto break_loop;
|
goto break_loop;
|
||||||
|
case MKTAG('L', 'I', 'S', 'T'):
|
||||||
|
list_type = avio_rl32(pb);
|
||||||
|
if (size <= 4) {
|
||||||
|
av_log(s, AV_LOG_ERROR, "too short LIST");
|
||||||
|
return AVERROR_INVALIDDATA;
|
||||||
|
}
|
||||||
|
switch (list_type) {
|
||||||
|
case MKTAG('I', 'N', 'F', 'O'):
|
||||||
|
if ((ret = ff_read_riff_info(s, size - 4)) < 0)
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* seek to next tag unless we know that we'll run into EOF */
|
/* seek to next tag unless we know that we'll run into EOF */
|
||||||
@ -526,6 +537,7 @@ break_loop:
|
|||||||
st->duration = sample_count;
|
st->duration = sample_count;
|
||||||
|
|
||||||
ff_metadata_conv_ctx(s, NULL, wav_metadata_conv);
|
ff_metadata_conv_ctx(s, NULL, wav_metadata_conv);
|
||||||
|
ff_metadata_conv_ctx(s, NULL, ff_riff_info_conv);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user