aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2013-10-30 23:56:52 +0100
committerCarl Eugen Hoyos <cehoyos@ag.or.at>2013-10-31 00:57:11 +0100
commitbeb28bc55dc73ae18e6a51e6f8f06ea0399da3e7 (patch)
tree77e76ba739a8db23a229cdb7658b612a237db61b
parent1fa7ad2e20dbaf4dffcc9441cb9558a3bf7ceea4 (diff)
downloadffmpeg-beb28bc55dc73ae18e6a51e6f8f06ea0399da3e7.tar.gz
avcodec/bink: fix seeking to frame 0
Fixes Ticket3088 Signed-off-by: Michael Niedermayer <michaelni@gmx.at> (cherry picked from commit cb52d6da0a9c88c584a38a9a7a94825565854b7e) Conflicts: libavcodec/bink.c
-rw-r--r--libavcodec/bink.c13
1 files changed, 12 insertions, 1 deletions
diff --git a/libavcodec/bink.c b/libavcodec/bink.c
index ce8dcb04c3..dd53a1d76b 100644
--- a/libavcodec/bink.c
+++ b/libavcodec/bink.c
@@ -120,6 +120,7 @@ typedef struct BinkContext {
int version; ///< internal Bink file version
int has_alpha;
int swap_planes;
+ unsigned frame_num;
Bundle bundle[BINKB_NB_SRC]; ///< bundles for decoding all data types
Tree col_high[16]; ///< trees for decoding high nibble in "colours" data type
@@ -1206,6 +1207,8 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *got_frame, AVPac
if (c->version >= 'i')
skip_bits_long(&gb, 32);
+ c->frame_num++;
+
for (plane = 0; plane < 3; plane++) {
plane_idx = (!plane || !c->swap_planes) ? plane : (plane ^ 3);
@@ -1214,7 +1217,7 @@ static int decode_frame(AVCodecContext *avctx, void *data, int *got_frame, AVPac
return ret;
} else {
if ((ret = binkb_decode_plane(c, frame, &gb, plane_idx,
- !avctx->frame_number, !!plane)) < 0)
+ c->frame_num == 1, !!plane)) < 0)
return ret;
}
if (get_bits_count(&gb) >= bits_count)
@@ -1332,6 +1335,13 @@ static av_cold int decode_end(AVCodecContext *avctx)
return 0;
}
+static void flush(AVCodecContext *avctx)
+{
+ BinkContext * const c = avctx->priv_data;
+
+ c->frame_num = 0;
+}
+
AVCodec ff_bink_decoder = {
.name = "binkvideo",
.type = AVMEDIA_TYPE_VIDEO,
@@ -1341,5 +1351,6 @@ AVCodec ff_bink_decoder = {
.close = decode_end,
.decode = decode_frame,
.long_name = NULL_IF_CONFIG_SMALL("Bink video"),
+ .flush = flush,
.capabilities = CODEC_CAP_DR1,
};