[FFmpeg-soc] [soc]: r583 - in dirac: ffmpeg.diff libavcodec/dirac.c
marco
subversion at mplayerhq.hu
Wed Aug 1 13:55:55 CEST 2007
Author: marco
Date: Wed Aug 1 13:55:55 2007
New Revision: 583
Log:
fix a bug in decoding signed integers
Modified:
dirac/ffmpeg.diff
dirac/libavcodec/dirac.c
Modified: dirac/ffmpeg.diff
==============================================================================
--- dirac/ffmpeg.diff (original)
+++ dirac/ffmpeg.diff Wed Aug 1 13:55:55 2007
@@ -1,6 +1,6 @@
Index: libavcodec/golomb.c
===================================================================
---- libavcodec/golomb.c (revision 9779)
+--- libavcodec/golomb.c (revision 9833)
+++ libavcodec/golomb.c (working copy)
@@ -1,6 +1,7 @@
/*
@@ -61,7 +61,7 @@ Index: libavcodec/golomb.c
+0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,};
Index: libavcodec/golomb.h
===================================================================
---- libavcodec/golomb.h (revision 9779)
+--- libavcodec/golomb.h (revision 9833)
+++ libavcodec/golomb.h (working copy)
@@ -2,6 +2,7 @@
* exp golomb vlc stuff
@@ -89,7 +89,7 @@ Index: libavcodec/golomb.h
/**
-@@ -106,6 +109,59 @@
+@@ -106,6 +109,60 @@
}
}
@@ -134,6 +134,7 @@ Index: libavcodec/golomb.h
+ }
+ ret--;
+
++ UPDATE_CACHE(re, gb);
+ buf = GET_CACHE(re, gb);
+ if (ret) {
+ LAST_SKIP_BITS(re, gb, 1);
@@ -151,7 +152,7 @@ Index: libavcodec/golomb.h
*/
Index: libavcodec/Makefile
===================================================================
---- libavcodec/Makefile (revision 9779)
+--- libavcodec/Makefile (revision 9833)
+++ libavcodec/Makefile (working copy)
@@ -52,6 +52,7 @@
OBJS-$(CONFIG_CSCD_DECODER) += cscd.o
@@ -171,7 +172,7 @@ Index: libavcodec/Makefile
OBJS-$(CONFIG_H261_PARSER) += h261_parser.o
Index: libavcodec/allcodecs.c
===================================================================
---- libavcodec/allcodecs.c (revision 9779)
+--- libavcodec/allcodecs.c (revision 9833)
+++ libavcodec/allcodecs.c (working copy)
@@ -68,6 +68,7 @@
REGISTER_DECODER(CLJR, cljr);
@@ -181,7 +182,7 @@ Index: libavcodec/allcodecs.c
REGISTER_DECODER(DNXHD, dnxhd);
REGISTER_DECODER(DSICINVIDEO, dsicinvideo);
REGISTER_ENCDEC (DVVIDEO, dvvideo);
-@@ -262,6 +263,7 @@
+@@ -263,6 +264,7 @@
REGISTER_PARSER (AC3, ac3);
REGISTER_PARSER (CAVSVIDEO, cavsvideo);
REGISTER_PARSER (DCA, dca);
@@ -191,7 +192,7 @@ Index: libavcodec/allcodecs.c
REGISTER_PARSER (H261, h261);
Index: libavcodec/allcodecs.h
===================================================================
---- libavcodec/allcodecs.h (revision 9779)
+--- libavcodec/allcodecs.h (revision 9833)
+++ libavcodec/allcodecs.h (working copy)
@@ -92,6 +92,7 @@
extern AVCodec cscd_decoder;
@@ -203,7 +204,7 @@ Index: libavcodec/allcodecs.h
extern AVCodec dsicinvideo_decoder;
Index: libavcodec/avcodec.h
===================================================================
---- libavcodec/avcodec.h (revision 9779)
+--- libavcodec/avcodec.h (revision 9833)
+++ libavcodec/avcodec.h (working copy)
@@ -166,6 +166,7 @@
CODEC_ID_BETHSOFTVID,
@@ -213,7 +214,7 @@ Index: libavcodec/avcodec.h
/* various PCM "codecs" */
CODEC_ID_PCM_S16LE= 0x10000,
-@@ -2767,6 +2768,7 @@
+@@ -2769,6 +2770,7 @@
extern AVCodecParser ac3_parser;
extern AVCodecParser cavsvideo_parser;
extern AVCodecParser dca_parser;
@@ -223,7 +224,7 @@ Index: libavcodec/avcodec.h
extern AVCodecParser h261_parser;
Index: libavformat/Makefile
===================================================================
---- libavformat/Makefile (revision 9779)
+--- libavformat/Makefile (revision 9833)
+++ libavformat/Makefile (working copy)
@@ -36,6 +36,7 @@
OBJS-$(CONFIG_CRC_MUXER) += crc.o
@@ -235,7 +236,7 @@ Index: libavformat/Makefile
OBJS-$(CONFIG_DV_DEMUXER) += dv.o
Index: libavformat/raw.c
===================================================================
---- libavformat/raw.c (revision 9779)
+--- libavformat/raw.c (revision 9833)
+++ libavformat/raw.c (working copy)
@@ -316,6 +316,7 @@
av_set_pts_info(st, 64, ap->time_base.num, ap->time_base.den);
@@ -281,7 +282,7 @@ Index: libavformat/raw.c
"raw dts",
Index: libavformat/allformats.c
===================================================================
---- libavformat/allformats.c (revision 9779)
+--- libavformat/allformats.c (revision 9833)
+++ libavformat/allformats.c (working copy)
@@ -66,6 +66,7 @@
REGISTER_MUXER (CRC, crc);
@@ -293,7 +294,7 @@ Index: libavformat/allformats.c
REGISTER_MUXDEMUX(DV, dv);
Index: libavformat/allformats.h
===================================================================
---- libavformat/allformats.h (revision 9779)
+--- libavformat/allformats.h (revision 9833)
+++ libavformat/allformats.h (working copy)
@@ -39,6 +39,7 @@
extern AVInputFormat c93_demuxer;
Modified: dirac/libavcodec/dirac.c
==============================================================================
--- dirac/libavcodec/dirac.c (original)
+++ dirac/libavcodec/dirac.c Wed Aug 1 13:55:55 2007
@@ -224,6 +224,9 @@ struct dirac_blockmotion {
int dc[3];
};
+/* XXX */
+#define REFFRAME_CNT 20
+
typedef struct DiracContext {
int next_picture;
int access_unit;
@@ -234,6 +237,11 @@ typedef struct DiracContext {
AVFrame picture;
+ int picnum;
+ int ref_first;
+ int ref_last;
+ AVFrame refframes[REFFRAME_CNT]; /* XXX */
+
struct source_parameters source;
struct sequence_parameters sequence;
struct decoding_parameters decoding;
@@ -277,6 +285,11 @@ typedef struct DiracContext {
} DiracContext;
static int decode_init(AVCodecContext *avctx){
+ DiracContext *s = avctx->priv_data;
+
+/* s->ref_first = 0; */
+/* s->ref_last = 0; */
+
av_log_set_level(AV_LOG_DEBUG);
return 0;
}
@@ -1813,6 +1826,37 @@ static int dirac_idwt(AVCodecContext *av
return 0;
}
+static int dirac_motion_compensation(AVCodecContext *avctx, int *coeffs, int comp) {
+ DiracContext *s = avctx->priv_data;
+ int x, y;
+ int width, height;
+ int xblen, yblen;
+ int xbsep, ybsep;
+ int xoffset, yoffset;
+
+ if (comp == 0) {
+ width = s->sequence.luma_width;
+ height = s->sequence.luma_height;
+ xblen = s->frame_decoding.luma_yblen;
+ yblen = s->frame_decoding.luma_xblen;
+ } else {
+ width = s->sequence.chroma_width;
+ height = s->sequence.chroma_height;
+ xblen = s->frame_decoding.chroma_yblen;
+ yblen = s->frame_decoding.chroma_xblen;
+ }
+
+ xoffset = (xblen - ybsep) / 2;
+ yoffset = (yblen - ybsep) / 2;
+
+/* for (y = 0; y < height; y++) */
+/* for (x = 0; x < width; x++) { */
+/* coeffs[y * s->padded_width + x] += motion_comp(avctx, x, y, coeffs, */
+/* } */
+
+ return 0;
+}
+
/**
* Decode an intra frame.
*
@@ -1871,10 +1915,9 @@ static int dirac_decode_frame(AVCodecCon
*/
static int parse_frame(AVCodecContext *avctx) {
DiracContext *s = avctx->priv_data;
- int picnum;
int retire;
int filter;
- int i;
+ int i, j, k;
GetBitContext *gb = s->gb;
/* Setup decoding parameter defaults for this frame. */
@@ -1882,9 +1925,9 @@ static int parse_frame(AVCodecContext *a
s->picture.pict_type = FF_I_TYPE;
s->picture.key_frame = 1;
- s->picture.reference = 0;
- picnum = get_bits_long(gb, 32);
+ s->picnum = get_bits_long(gb, 32);
+ dprintf (avctx, "picnum = %d\n", s->picnum);
if (s->refs) {
s->ref1 = dirac_get_se_golomb(gb);
@@ -1892,10 +1935,52 @@ static int parse_frame(AVCodecContext *a
s->ref2 = dirac_get_se_golomb(gb);
}
+ dprintf(avctx, "Reference frames in the buffer:\n");
+ for (i = s->ref_first; i <= s->ref_last - 1; i = (i + 1) % REFFRAME_CNT) {
+ dprintf(avctx, "ref frame #%d\n", s->refframes[i].coded_picture_number);
+ }
+
retire = dirac_get_ue_golomb(gb);
- for (i = 0; i < retire; i++)
- dirac_get_se_golomb(gb); /* XXX */
+ dprintf(avctx, "retire count=%d\n", retire);
+ for (k = 0; k < retire; k++) {
+ int retire;
+ retire = dirac_get_se_golomb(gb);
+ dprintf(0, "retire %d\n", retire);
+
+ dprintf(0, "RETIRE %d+%d=%d\n", retire, s->picnum, retire + s->picnum);
+
+ retire += s->picnum;
+
+
+ for (i = s->ref_first; i <= s->ref_last; i = (i + 1) % REFFRAME_CNT) {
+ AVFrame *f = &s->refframes[i];
+ if (f->coded_picture_number == retire) {
+ int j;
+
+ dprintf(avctx, "Retire frame #%d (%d)\n", retire, i);
+ for (j = i; j < s->ref_last; j++) {
+ s->refframes[j] = s->refframes[j + 1];
+ }
+
+ dprintf(avctx, "Kill the buffer\n");
+ if (f->data[0] != NULL)
+ avctx->release_buffer(avctx, f);
+
+ s->ref_last--;
+ if (s->ref_last < 0)
+ s->ref_last = REFFRAME_CNT;
+
+ break;
+ }
+ if (i == s->ref_last-1)
+ dprintf(avctx, "Retire #%d not found\n", retire);
+ }
+ }
+
+ for (i = s->ref_first; i <= s->ref_last - 1; i = (i + 1) % REFFRAME_CNT) {
+ dprintf(avctx, ">ref frame #%d\n", s->refframes[i].coded_picture_number);
+ }
if (s->refs) {
align_get_bits(gb);
@@ -2040,8 +2125,16 @@ static int decode_frame(AVCodecContext *
avcodec_set_dimensions(avctx, s->sequence.luma_width,
s->sequence.luma_height);
- if (s->picture.data[0] != NULL)
- avctx->release_buffer(avctx, &s->picture);
+ if (s->picture.data[0] != NULL) {
+ if (s->picture.reference)
+ avcodec_get_frame_defaults(&s->picture);
+ else
+ avctx->release_buffer(avctx, &s->picture);
+ }
+
+ dprintf(avctx, "reference frame #%d\n", s->picnum);
+
+ s->picture.reference = (parse_code & 0x04) == 0x04;
if (avctx->get_buffer(avctx, &s->picture) < 0) {
av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
@@ -2051,6 +2144,13 @@ static int decode_frame(AVCodecContext *
if (dirac_decode_frame(avctx))
return -1;
+ s->picture.coded_picture_number = s->picnum;
+
+ if (s->picture.reference) {
+ s->refframes[s->ref_last++] = s->picture;
+ dprintf(avctx, "add reference frame #%d\n", s->picture.coded_picture_number);
+ }
+
*data_size = sizeof(AVFrame);
*picture = s->picture;
More information about the FFmpeg-soc
mailing list