[SCM] libav/experimental: Imported Upstream version 9.6
siretart at users.alioth.debian.org
siretart at users.alioth.debian.org
Mon May 27 20:38:49 UTC 2013
The following commit has been merged in the experimental branch:
commit b952f2c9e63888f96299cdb878fdc7efb588c297
Author: Reinhard Tartler <siretart at tauware.de>
Date: Mon May 20 10:53:37 2013 +0200
Imported Upstream version 9.6
diff --git a/Changelog b/Changelog
index ca9db5a..3ceb469 100644
--- a/Changelog
+++ b/Changelog
@@ -1,6 +1,20 @@
Entries are sorted chronologically from oldest to youngest within each release,
releases are sorted from youngest to oldest.
+version 9.6:
+- aac: check the maximum number of channels to avoid invalid writes
+- indeo3: fix off by one in MV validity check
+- id3v2: check for end of file while unescaping tags to avoid invalid
+ writes, reported by Google Security Team
+- afifo: fix request_samples on the last frame in certain cases
+- hls, segment: fix splitting for audio-only streams
+- wav: Always seek to an even offset, Bug #500, LP: #1174737
+- swscale: Use alpha from the right row in yuva2rgba_c, Bug #504
+- indeo3: use unaligned reads on reference blocks, Bug #503
+- oma: properly forward errors in oma_read_packet
+- af_asyncts: fix offset calculation
+- proresdec: support mixed interlaced/non-interlaced content
+
version 9.5:
Most of the following fixes resulted from test samples that the Google
diff --git a/RELEASE b/RELEASE
index 592f36e..c026ac8 100644
--- a/RELEASE
+++ b/RELEASE
@@ -1 +1 @@
-9.5
+9.6
diff --git a/VERSION b/VERSION
index 592f36e..c026ac8 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-9.5
+9.6
diff --git a/libavcodec/aacdec.c b/libavcodec/aacdec.c
index d10a482..dec6d01 100644
--- a/libavcodec/aacdec.c
+++ b/libavcodec/aacdec.c
@@ -142,6 +142,8 @@ static av_cold int che_configure(AACContext *ac,
enum ChannelPosition che_pos,
int type, int id, int *channels)
{
+ if (*channels >= MAX_CHANNELS)
+ return AVERROR_INVALIDDATA;
if (che_pos) {
if (!ac->che[type][id]) {
if (!(ac->che[type][id] = av_mallocz(sizeof(ChannelElement))))
diff --git a/libavcodec/aacenc.c b/libavcodec/aacenc.c
index 5558e39..6f582ca 100644
--- a/libavcodec/aacenc.c
+++ b/libavcodec/aacenc.c
@@ -518,7 +518,7 @@ static int aac_encode_frame(AVCodecContext *avctx, AVPacket *avpkt,
/* add current frame to queue */
if (frame) {
- if ((ret = ff_af_queue_add(&s->afq, frame) < 0))
+ if ((ret = ff_af_queue_add(&s->afq, frame)) < 0)
return ret;
}
diff --git a/libavcodec/indeo3.c b/libavcodec/indeo3.c
index eacd150..81bf0a9 100644
--- a/libavcodec/indeo3.c
+++ b/libavcodec/indeo3.c
@@ -236,8 +236,8 @@ static int copy_cell(Indeo3DecodeContext *ctx, Plane *plane, Cell *cell)
/* -1 because there is an extra line on top for prediction */
if ((cell->ypos << 2) + mv_y < -1 || (cell->xpos << 2) + mv_x < 0 ||
- ((cell->ypos + cell->height) << 2) + mv_y >= plane->height ||
- ((cell->xpos + cell->width) << 2) + mv_x >= plane->width) {
+ ((cell->ypos + cell->height) << 2) + mv_y > plane->height ||
+ ((cell->xpos + cell->width) << 2) + mv_x > plane->width) {
av_log(ctx->avctx, AV_LOG_ERROR,
"Motion vectors point out of the frame.\n");
return AVERROR_INVALIDDATA;
@@ -277,10 +277,10 @@ static int copy_cell(Indeo3DecodeContext *ctx, Plane *plane, Cell *cell)
/* Average 4/8 pixels at once without rounding using SWAR */
#define AVG_32(dst, src, ref) \
- AV_WN32A(dst, ((AV_RN32A(src) + AV_RN32A(ref)) >> 1) & 0x7F7F7F7FUL)
+ AV_WN32A(dst, ((AV_RN32(src) + AV_RN32(ref)) >> 1) & 0x7F7F7F7FUL)
#define AVG_64(dst, src, ref) \
- AV_WN64A(dst, ((AV_RN64A(src) + AV_RN64A(ref)) >> 1) & 0x7F7F7F7F7F7F7F7FULL)
+ AV_WN64A(dst, ((AV_RN64(src) + AV_RN64(ref)) >> 1) & 0x7F7F7F7F7F7F7F7FULL)
/*
@@ -339,7 +339,7 @@ if (*data_ptr >= last_ptr) \
copy_block4(dst, ref, row_offset, row_offset, 4 << v_zoom)
#define RLE_BLOCK_COPY_8 \
- pix64 = AV_RN64A(ref);\
+ pix64 = AV_RN64(ref);\
if (is_first_row) {/* special prediction case: top line of a cell */\
pix64 = replicate64(pix64);\
fill_64(dst + row_offset, pix64, 7, row_offset);\
@@ -351,7 +351,7 @@ if (*data_ptr >= last_ptr) \
copy_block4(dst, ref, row_offset, row_offset, num_lines << v_zoom)
#define RLE_LINES_COPY_M10 \
- pix64 = AV_RN64A(ref);\
+ pix64 = AV_RN64(ref);\
if (is_top_of_cell) {\
pix64 = replicate64(pix64);\
fill_64(dst + row_offset, pix64, (num_lines << 1) - 1, row_offset);\
@@ -361,12 +361,12 @@ if (*data_ptr >= last_ptr) \
#define APPLY_DELTA_4 \
AV_WN16A(dst + line_offset ,\
- (AV_RN16A(ref ) + delta_tab->deltas[dyad1]) & 0x7F7F);\
+ (AV_RN16(ref ) + delta_tab->deltas[dyad1]) & 0x7F7F);\
AV_WN16A(dst + line_offset + 2,\
- (AV_RN16A(ref + 2) + delta_tab->deltas[dyad2]) & 0x7F7F);\
+ (AV_RN16(ref + 2) + delta_tab->deltas[dyad2]) & 0x7F7F);\
if (mode >= 3) {\
if (is_top_of_cell && !cell->ypos) {\
- AV_COPY32(dst, dst + row_offset);\
+ AV_COPY32U(dst, dst + row_offset);\
} else {\
AVG_32(dst, ref, dst + row_offset);\
}\
@@ -376,20 +376,20 @@ if (*data_ptr >= last_ptr) \
/* apply two 32-bit VQ deltas to next even line */\
if (is_top_of_cell) { \
AV_WN32A(dst + row_offset , \
- (replicate32(AV_RN32A(ref )) + delta_tab->deltas_m10[dyad1]) & 0x7F7F7F7F);\
+ (replicate32(AV_RN32(ref )) + delta_tab->deltas_m10[dyad1]) & 0x7F7F7F7F);\
AV_WN32A(dst + row_offset + 4, \
- (replicate32(AV_RN32A(ref + 4)) + delta_tab->deltas_m10[dyad2]) & 0x7F7F7F7F);\
+ (replicate32(AV_RN32(ref + 4)) + delta_tab->deltas_m10[dyad2]) & 0x7F7F7F7F);\
} else { \
AV_WN32A(dst + row_offset , \
- (AV_RN32A(ref ) + delta_tab->deltas_m10[dyad1]) & 0x7F7F7F7F);\
+ (AV_RN32(ref ) + delta_tab->deltas_m10[dyad1]) & 0x7F7F7F7F);\
AV_WN32A(dst + row_offset + 4, \
- (AV_RN32A(ref + 4) + delta_tab->deltas_m10[dyad2]) & 0x7F7F7F7F);\
+ (AV_RN32(ref + 4) + delta_tab->deltas_m10[dyad2]) & 0x7F7F7F7F);\
} \
/* odd lines are not coded but rather interpolated/replicated */\
/* first line of the cell on the top of image? - replicate */\
/* otherwise - interpolate */\
if (is_top_of_cell && !cell->ypos) {\
- AV_COPY64(dst, dst + row_offset);\
+ AV_COPY64U(dst, dst + row_offset);\
} else \
AVG_64(dst, ref, dst + row_offset);
@@ -397,22 +397,22 @@ if (*data_ptr >= last_ptr) \
#define APPLY_DELTA_1011_INTER \
if (mode == 10) { \
AV_WN32A(dst , \
- (AV_RN32A(dst ) + delta_tab->deltas_m10[dyad1]) & 0x7F7F7F7F);\
+ (AV_RN32(dst ) + delta_tab->deltas_m10[dyad1]) & 0x7F7F7F7F);\
AV_WN32A(dst + 4 , \
- (AV_RN32A(dst + 4 ) + delta_tab->deltas_m10[dyad2]) & 0x7F7F7F7F);\
+ (AV_RN32(dst + 4 ) + delta_tab->deltas_m10[dyad2]) & 0x7F7F7F7F);\
AV_WN32A(dst + row_offset , \
- (AV_RN32A(dst + row_offset ) + delta_tab->deltas_m10[dyad1]) & 0x7F7F7F7F);\
+ (AV_RN32(dst + row_offset ) + delta_tab->deltas_m10[dyad1]) & 0x7F7F7F7F);\
AV_WN32A(dst + row_offset + 4, \
- (AV_RN32A(dst + row_offset + 4) + delta_tab->deltas_m10[dyad2]) & 0x7F7F7F7F);\
+ (AV_RN32(dst + row_offset + 4) + delta_tab->deltas_m10[dyad2]) & 0x7F7F7F7F);\
} else { \
AV_WN16A(dst , \
- (AV_RN16A(dst ) + delta_tab->deltas[dyad1]) & 0x7F7F);\
+ (AV_RN16(dst ) + delta_tab->deltas[dyad1]) & 0x7F7F);\
AV_WN16A(dst + 2 , \
- (AV_RN16A(dst + 2 ) + delta_tab->deltas[dyad2]) & 0x7F7F);\
+ (AV_RN16(dst + 2 ) + delta_tab->deltas[dyad2]) & 0x7F7F);\
AV_WN16A(dst + row_offset , \
- (AV_RN16A(dst + row_offset ) + delta_tab->deltas[dyad1]) & 0x7F7F);\
+ (AV_RN16(dst + row_offset ) + delta_tab->deltas[dyad1]) & 0x7F7F);\
AV_WN16A(dst + row_offset + 2, \
- (AV_RN16A(dst + row_offset + 2) + delta_tab->deltas[dyad2]) & 0x7F7F);\
+ (AV_RN16(dst + row_offset + 2) + delta_tab->deltas[dyad2]) & 0x7F7F);\
}
@@ -607,8 +607,8 @@ static int decode_cell(Indeo3DecodeContext *ctx, AVCodecContext *avctx,
/* -1 because there is an extra line on top for prediction */
if ((cell->ypos << 2) + mv_y < -1 || (cell->xpos << 2) + mv_x < 0 ||
- ((cell->ypos + cell->height) << 2) + mv_y >= plane->height ||
- ((cell->xpos + cell->width) << 2) + mv_x >= plane->width) {
+ ((cell->ypos + cell->height) << 2) + mv_y > plane->height ||
+ ((cell->xpos + cell->width) << 2) + mv_x > plane->width) {
av_log(ctx->avctx, AV_LOG_ERROR,
"Motion vectors point out of the frame.\n");
return AVERROR_INVALIDDATA;
diff --git a/libavcodec/libfaac.c b/libavcodec/libfaac.c
index 745fee2..d32e776 100644
--- a/libavcodec/libfaac.c
+++ b/libavcodec/libfaac.c
@@ -200,7 +200,7 @@ static int Faac_encode_frame(AVCodecContext *avctx, AVPacket *avpkt,
/* add current frame to the queue */
if (frame) {
- if ((ret = ff_af_queue_add(&s->afq, frame) < 0))
+ if ((ret = ff_af_queue_add(&s->afq, frame)) < 0)
return ret;
}
diff --git a/libavcodec/libfdk-aacenc.c b/libavcodec/libfdk-aacenc.c
index 00397d5..c40bced 100644
--- a/libavcodec/libfdk-aacenc.c
+++ b/libavcodec/libfdk-aacenc.c
@@ -334,7 +334,7 @@ static int aac_encode_frame(AVCodecContext *avctx, AVPacket *avpkt,
in_buf.bufElSizes = &in_buffer_element_size;
/* add current frame to the queue */
- if ((ret = ff_af_queue_add(&s->afq, frame) < 0))
+ if ((ret = ff_af_queue_add(&s->afq, frame)) < 0)
return ret;
}
diff --git a/libavcodec/libmp3lame.c b/libavcodec/libmp3lame.c
index 8746573..2e501ca 100644
--- a/libavcodec/libmp3lame.c
+++ b/libavcodec/libmp3lame.c
@@ -236,7 +236,7 @@ static int mp3lame_encode_frame(AVCodecContext *avctx, AVPacket *avpkt,
/* add current frame to the queue */
if (frame) {
- if ((ret = ff_af_queue_add(&s->afq, frame) < 0))
+ if ((ret = ff_af_queue_add(&s->afq, frame)) < 0)
return ret;
}
diff --git a/libavcodec/libopencore-amr.c b/libavcodec/libopencore-amr.c
index fdd7de9..be98b1f 100644
--- a/libavcodec/libopencore-amr.c
+++ b/libavcodec/libopencore-amr.c
@@ -265,7 +265,7 @@ static int amr_nb_encode_frame(AVCodecContext *avctx, AVPacket *avpkt,
if (frame->nb_samples < avctx->frame_size - avctx->delay)
s->enc_last_frame = -1;
}
- if ((ret = ff_af_queue_add(&s->afq, frame) < 0)) {
+ if ((ret = ff_af_queue_add(&s->afq, frame)) < 0) {
av_freep(&flush_buf);
return ret;
}
diff --git a/libavcodec/libspeexenc.c b/libavcodec/libspeexenc.c
index e30185a..4277e62 100644
--- a/libavcodec/libspeexenc.c
+++ b/libavcodec/libspeexenc.c
@@ -287,7 +287,7 @@ static int encode_frame(AVCodecContext *avctx, AVPacket *avpkt,
speex_encode_stereo_int(samples, s->header.frame_size, &s->bits);
speex_encode_int(s->enc_state, samples, &s->bits);
s->pkt_frame_count++;
- if ((ret = ff_af_queue_add(&s->afq, frame) < 0))
+ if ((ret = ff_af_queue_add(&s->afq, frame)) < 0)
return ret;
} else {
/* handle end-of-stream */
diff --git a/libavcodec/libvo-aacenc.c b/libavcodec/libvo-aacenc.c
index d09f1ed..31822b5 100644
--- a/libavcodec/libvo-aacenc.c
+++ b/libavcodec/libvo-aacenc.c
@@ -157,7 +157,7 @@ static int aac_encode_frame(AVCodecContext *avctx, AVPacket *avpkt,
samples = (VO_PBYTE)frame->data[0];
}
/* add current frame to the queue */
- if ((ret = ff_af_queue_add(&s->afq, frame) < 0))
+ if ((ret = ff_af_queue_add(&s->afq, frame)) < 0)
return ret;
}
diff --git a/libavcodec/libvorbis.c b/libavcodec/libvorbis.c
index a31d476..092cbbc 100644
--- a/libavcodec/libvorbis.c
+++ b/libavcodec/libvorbis.c
@@ -279,7 +279,7 @@ static int oggvorbis_encode_frame(AVCodecContext *avctx, AVPacket *avpkt,
av_log(avctx, AV_LOG_ERROR, "error in vorbis_analysis_wrote()\n");
return vorbis_error_to_averror(ret);
}
- if ((ret = ff_af_queue_add(&s->afq, frame) < 0))
+ if ((ret = ff_af_queue_add(&s->afq, frame)) < 0)
return ret;
} else {
if (!s->eof)
diff --git a/libavcodec/nellymoserenc.c b/libavcodec/nellymoserenc.c
index 487cffd..1222826 100644
--- a/libavcodec/nellymoserenc.c
+++ b/libavcodec/nellymoserenc.c
@@ -397,7 +397,7 @@ static int encode_frame(AVCodecContext *avctx, AVPacket *avpkt,
if (frame->nb_samples >= NELLY_BUF_LEN)
s->last_frame = 1;
}
- if ((ret = ff_af_queue_add(&s->afq, frame) < 0))
+ if ((ret = ff_af_queue_add(&s->afq, frame)) < 0)
return ret;
} else {
memset(s->buf + NELLY_BUF_LEN, 0, NELLY_SAMPLES * sizeof(*s->buf));
diff --git a/libavcodec/proresdec.c b/libavcodec/proresdec.c
index f7e32c9..4b196f6 100644
--- a/libavcodec/proresdec.c
+++ b/libavcodec/proresdec.c
@@ -164,6 +164,8 @@ static int decode_frame_header(ProresContext *ctx, const uint8_t *buf,
if (ctx->frame_type) { /* if interlaced */
ctx->picture.interlaced_frame = 1;
ctx->picture.top_field_first = ctx->frame_type & 1;
+ } else {
+ ctx->picture.interlaced_frame = 0;
}
avctx->color_primaries = buf[14];
diff --git a/libavcodec/ra144enc.c b/libavcodec/ra144enc.c
index 5b5de76..b9473ac 100644
--- a/libavcodec/ra144enc.c
+++ b/libavcodec/ra144enc.c
@@ -537,7 +537,7 @@ static int ra144_encode_frame(AVCodecContext *avctx, AVPacket *avpkt,
for (; i < frame->nb_samples; i++)
ractx->curr_block[i] = samples[i] >> 2;
- if ((ret = ff_af_queue_add(&ractx->afq, frame) < 0))
+ if ((ret = ff_af_queue_add(&ractx->afq, frame)) < 0)
return ret;
} else
ractx->last_frame = 1;
diff --git a/libavfilter/af_asyncts.c b/libavfilter/af_asyncts.c
index 40680c8..3ebe3b5 100644
--- a/libavfilter/af_asyncts.c
+++ b/libavfilter/af_asyncts.c
@@ -237,18 +237,23 @@ static int filter_frame(AVFilterLink *inlink, AVFilterBufferRef *buf)
}
if (s->first_frame && delta > 0) {
+ int planar = av_sample_fmt_is_planar(buf_out->format);
+ int planes = planar ? nb_channels : 1;
+ int block_size = av_get_bytes_per_sample(buf_out->format) *
+ (planar ? 1 : nb_channels);
+
int ch;
av_samples_set_silence(buf_out->extended_data, 0, delta,
nb_channels, buf->format);
- for (ch = 0; ch < nb_channels; ch++)
- buf_out->extended_data[ch] += delta;
+ for (ch = 0; ch < planes; ch++)
+ buf_out->extended_data[ch] += delta * block_size;
avresample_read(s->avr, buf_out->extended_data, out_size);
- for (ch = 0; ch < nb_channels; ch++)
- buf_out->extended_data[ch] -= delta;
+ for (ch = 0; ch < planes; ch++)
+ buf_out->extended_data[ch] -= delta * block_size;
} else {
avresample_read(s->avr, buf_out->extended_data, out_size);
diff --git a/libavfilter/fifo.c b/libavfilter/fifo.c
index 88c44fe..3faa84f 100644
--- a/libavfilter/fifo.c
+++ b/libavfilter/fifo.c
@@ -184,8 +184,25 @@ static int return_audio_frame(AVFilterContext *ctx)
}
while (s->buf_out->audio->nb_samples < s->allocated_samples) {
- int len = FFMIN(s->allocated_samples - s->buf_out->audio->nb_samples,
- head->audio->nb_samples);
+ int len;
+
+ if (!s->root.next &&
+ (ret = ff_request_frame(ctx->inputs[0])) < 0) {
+ if (ret == AVERROR_EOF) {
+ av_samples_set_silence(s->buf_out->extended_data,
+ s->buf_out->audio->nb_samples,
+ s->allocated_samples -
+ s->buf_out->audio->nb_samples,
+ nb_channels, link->format);
+ s->buf_out->audio->nb_samples = s->allocated_samples;
+ break;
+ }
+ return ret;
+ }
+ head = s->root.next->buf;
+
+ len = FFMIN(s->allocated_samples - s->buf_out->audio->nb_samples,
+ head->audio->nb_samples);
av_samples_copy(s->buf_out->extended_data, head->extended_data,
s->buf_out->audio->nb_samples, 0, len, nb_channels,
@@ -195,21 +212,6 @@ static int return_audio_frame(AVFilterContext *ctx)
if (len == head->audio->nb_samples) {
avfilter_unref_buffer(head);
queue_pop(s);
-
- if (!s->root.next &&
- (ret = ff_request_frame(ctx->inputs[0])) < 0) {
- if (ret == AVERROR_EOF) {
- av_samples_set_silence(s->buf_out->extended_data,
- s->buf_out->audio->nb_samples,
- s->allocated_samples -
- s->buf_out->audio->nb_samples,
- nb_channels, link->format);
- s->buf_out->audio->nb_samples = s->allocated_samples;
- break;
- }
- return ret;
- }
- head = s->root.next->buf;
} else {
buffer_offset(link, head, len);
}
diff --git a/libavformat/hlsenc.c b/libavformat/hlsenc.c
index 4f74b5f..c4c0217 100644
--- a/libavformat/hlsenc.c
+++ b/libavformat/hlsenc.c
@@ -250,18 +250,20 @@ static int hls_write_packet(AVFormatContext *s, AVPacket *pkt)
AVFormatContext *oc = hls->avf;
AVStream *st = s->streams[pkt->stream_index];
int64_t end_pts = hls->recording_time * hls->number;
- int ret;
+ int ret, can_split = 1;
if (hls->start_pts == AV_NOPTS_VALUE) {
hls->start_pts = pkt->pts;
hls->end_pts = pkt->pts;
}
- if ((hls->has_video && st->codec->codec_type == AVMEDIA_TYPE_VIDEO) &&
- av_compare_ts(pkt->pts - hls->start_pts, st->time_base,
- end_pts, AV_TIME_BASE_Q) >= 0 &&
- pkt->flags & AV_PKT_FLAG_KEY) {
+ if (hls->has_video) {
+ can_split = st->codec->codec_type == AVMEDIA_TYPE_VIDEO &&
+ pkt->flags & AV_PKT_FLAG_KEY;
+ }
+ if (can_split && av_compare_ts(pkt->pts - hls->start_pts, st->time_base,
+ end_pts, AV_TIME_BASE_Q) >= 0) {
ret = append_entry(hls, av_rescale(pkt->pts - hls->end_pts,
st->time_base.num,
st->time_base.den));
diff --git a/libavformat/id3v2.c b/libavformat/id3v2.c
index 7f39a47..5cc17c4 100644
--- a/libavformat/id3v2.c
+++ b/libavformat/id3v2.c
@@ -626,9 +626,10 @@ static void ff_id3v2_parse(AVFormatContext *s, int len, uint8_t version, uint8_t
goto seek;
}
b = buffer;
- while (avio_tell(s->pb) < end) {
+ while (avio_tell(s->pb) < end && !s->pb->eof_reached) {
*b++ = avio_r8(s->pb);
- if (*(b - 1) == 0xff && avio_tell(s->pb) < end - 1) {
+ if (*(b - 1) == 0xff && avio_tell(s->pb) < end - 1 &&
+ !s->pb->eof_reached ) {
uint8_t val = avio_r8(s->pb);
*b++ = val ? val : avio_r8(s->pb);
}
diff --git a/libavformat/omadec.c b/libavformat/omadec.c
index f6b6f13..cd255c1 100644
--- a/libavformat/omadec.c
+++ b/libavformat/omadec.c
@@ -381,8 +381,10 @@ static int oma_read_packet(AVFormatContext *s, AVPacket *pkt)
int packet_size = s->streams[0]->codec->block_align;
int ret = av_get_packet(s->pb, pkt, packet_size);
- if (ret <= 0)
- return AVERROR(EIO);
+ if (ret < 0)
+ return ret;
+ if (!ret)
+ return AVERROR_EOF;
pkt->stream_index = 0;
diff --git a/libavformat/segment.c b/libavformat/segment.c
index 8afb41f..d79a327 100644
--- a/libavformat/segment.c
+++ b/libavformat/segment.c
@@ -272,13 +272,15 @@ static int seg_write_packet(AVFormatContext *s, AVPacket *pkt)
AVFormatContext *oc = seg->avf;
AVStream *st = s->streams[pkt->stream_index];
int64_t end_pts = seg->recording_time * seg->number;
- int ret;
+ int ret, can_split = 1;
- if ((seg->has_video && st->codec->codec_type == AVMEDIA_TYPE_VIDEO) &&
- av_compare_ts(pkt->pts, st->time_base,
- end_pts, AV_TIME_BASE_Q) >= 0 &&
- pkt->flags & AV_PKT_FLAG_KEY) {
+ if (seg->has_video) {
+ can_split = st->codec->codec_type == AVMEDIA_TYPE_VIDEO &&
+ pkt->flags & AV_PKT_FLAG_KEY;
+ }
+ if (can_split && av_compare_ts(pkt->pts, st->time_base, end_pts,
+ AV_TIME_BASE_Q) >= 0) {
av_log(s, AV_LOG_DEBUG, "Next segment starts at %d %"PRId64"\n",
pkt->stream_index, pkt->pts);
diff --git a/libavformat/wavdec.c b/libavformat/wavdec.c
index c9f7abb..e9dda92 100644
--- a/libavformat/wavdec.c
+++ b/libavformat/wavdec.c
@@ -50,6 +50,12 @@ static int64_t next_tag(AVIOContext *pb, uint32_t *tag)
return avio_rl32(pb);
}
+/* RIFF chunks are always on a even offset. */
+static int64_t wav_seek_tag(AVIOContext *s, int64_t offset, int whence)
+{
+ return avio_seek(s, offset + (offset & 1), whence);
+}
+
/* return the size of the found tag */
static int64_t find_tag(AVIOContext *pb, uint32_t tag1)
{
@@ -62,7 +68,7 @@ static int64_t find_tag(AVIOContext *pb, uint32_t tag1)
size = next_tag(pb, &tag);
if (tag == tag1)
break;
- avio_skip(pb, size);
+ wav_seek_tag(pb, size, SEEK_CUR);
}
return size;
}
@@ -301,7 +307,7 @@ static int wav_read_header(AVFormatContext *s)
/* seek to next tag unless we know that we'll run into EOF */
if ((avio_size(pb) > 0 && next_tag_ofs >= avio_size(pb)) ||
- avio_seek(pb, next_tag_ofs, SEEK_SET) < 0) {
+ wav_seek_tag(pb, next_tag_ofs, SEEK_SET) < 0) {
break;
}
}
diff --git a/libswscale/yuv2rgb.c b/libswscale/yuv2rgb.c
index 1dbd0d8..2ffbf5b 100644
--- a/libswscale/yuv2rgb.c
+++ b/libswscale/yuv2rgb.c
@@ -264,16 +264,16 @@ YUV2RGBFUNC(yuva2rgba_c, uint32_t, 1)
PUTRGBA(dst_2, py_2, pa_2, 0, 24);
LOADCHROMA(1);
- PUTRGBA(dst_2, py_2, pa_1, 1, 24);
- PUTRGBA(dst_1, py_1, pa_2, 1, 24);
+ PUTRGBA(dst_2, py_2, pa_2, 1, 24);
+ PUTRGBA(dst_1, py_1, pa_1, 1, 24);
LOADCHROMA(2);
PUTRGBA(dst_1, py_1, pa_1, 2, 24);
PUTRGBA(dst_2, py_2, pa_2, 2, 24);
LOADCHROMA(3);
- PUTRGBA(dst_2, py_2, pa_1, 3, 24);
- PUTRGBA(dst_1, py_1, pa_2, 3, 24);
+ PUTRGBA(dst_2, py_2, pa_2, 3, 24);
+ PUTRGBA(dst_1, py_1, pa_1, 3, 24);
pa_1 += 8; \
pa_2 += 8; \
ENDYUV2RGBLINE(8, 0)
@@ -282,8 +282,8 @@ ENDYUV2RGBLINE(8, 0)
PUTRGBA(dst_2, py_2, pa_2, 0, 24);
LOADCHROMA(1);
- PUTRGBA(dst_2, py_2, pa_1, 1, 24);
- PUTRGBA(dst_1, py_1, pa_2, 1, 24);
+ PUTRGBA(dst_2, py_2, pa_2, 1, 24);
+ PUTRGBA(dst_1, py_1, pa_1, 1, 24);
pa_1 += 4; \
pa_2 += 4; \
ENDYUV2RGBLINE(8, 1)
--
Libav/FFmpeg packaging
More information about the pkg-multimedia-commits
mailing list