Commit 35301a8e authored by glantau's avatar glantau

added draw_horiz_band test


git-svn-id: file:///var/local/repositories/ffmpeg/trunk@98 9553f0bf-9b14-0410-a0b8-cfaf0461ba5b
parent 599a3d29
...@@ -8,7 +8,7 @@ enum CodecID { ...@@ -8,7 +8,7 @@ enum CodecID {
CODEC_ID_MP2, CODEC_ID_MP2,
CODEC_ID_AC3, CODEC_ID_AC3,
CODEC_ID_MJPEG, CODEC_ID_MJPEG,
CODEC_ID_OPENDIVX, CODEC_ID_MPEG4,
CODEC_ID_PCM, CODEC_ID_PCM,
CODEC_ID_RAWVIDEO, CODEC_ID_RAWVIDEO,
CODEC_ID_MSMPEG4, CODEC_ID_MSMPEG4,
...@@ -45,6 +45,11 @@ extern int motion_estimation_method; ...@@ -45,6 +45,11 @@ extern int motion_estimation_method;
#define CODEC_FLAG_HQ 0x0001 /* high quality (non real time) encoding */ #define CODEC_FLAG_HQ 0x0001 /* high quality (non real time) encoding */
#define CODEC_FLAG_QSCALE 0x0002 /* use fixed qscale */ #define CODEC_FLAG_QSCALE 0x0002 /* use fixed qscale */
/* codec capabilities */
/* decoder can use draw_horiz_band callback */
#define CODEC_CAP_DRAW_HORIZ_BAND 0x0001
#define FRAME_RATE_BASE 10000 #define FRAME_RATE_BASE 10000
typedef struct AVCodecContext { typedef struct AVCodecContext {
...@@ -57,6 +62,15 @@ typedef struct AVCodecContext { ...@@ -57,6 +62,15 @@ typedef struct AVCodecContext {
int width, height; int width, height;
int gop_size; /* 0 = intra only */ int gop_size; /* 0 = intra only */
int pix_fmt; /* pixel format, see PIX_FMT_xxx */ int pix_fmt; /* pixel format, see PIX_FMT_xxx */
/* if non NULL, 'draw_horiz_band' is called by the libavcodec
decoder to draw an horizontal band. It improve cache usage. Not
all codecs can do that. You must check the codec capabilities
before */
void (*draw_horiz_band)(struct AVCodecContext *s,
UINT8 **src_ptr, int linesize,
int y, int width, int height);
/* audio only */ /* audio only */
int sample_rate; /* samples per sec */ int sample_rate; /* samples per sec */
int channels; int channels;
...@@ -72,6 +86,7 @@ typedef struct AVCodecContext { ...@@ -72,6 +86,7 @@ typedef struct AVCodecContext {
void *priv_data; void *priv_data;
/* the following fields are ignored */ /* the following fields are ignored */
void *opaque; /* can be used to carry app specific stuff */
char codec_name[32]; char codec_name[32];
int codec_type; /* see CODEC_TYPE_xxx */ int codec_type; /* see CODEC_TYPE_xxx */
int codec_id; /* see CODEC_ID_xxx */ int codec_id; /* see CODEC_ID_xxx */
...@@ -88,6 +103,7 @@ typedef struct AVCodec { ...@@ -88,6 +103,7 @@ typedef struct AVCodec {
int (*close)(AVCodecContext *); int (*close)(AVCodecContext *);
int (*decode)(AVCodecContext *, void *outdata, int *outdata_size, int (*decode)(AVCodecContext *, void *outdata, int *outdata_size,
UINT8 *buf, int buf_size); UINT8 *buf, int buf_size);
int capabilities;
struct AVCodec *next; struct AVCodec *next;
} AVCodec; } AVCodec;
...@@ -104,11 +120,11 @@ extern AVCodec h263_encoder; ...@@ -104,11 +120,11 @@ extern AVCodec h263_encoder;
extern AVCodec h263p_encoder; extern AVCodec h263p_encoder;
extern AVCodec rv10_encoder; extern AVCodec rv10_encoder;
extern AVCodec mjpeg_encoder; extern AVCodec mjpeg_encoder;
extern AVCodec opendivx_encoder; extern AVCodec mpeg4_encoder;
extern AVCodec msmpeg4_encoder; extern AVCodec msmpeg4_encoder;
extern AVCodec h263_decoder; extern AVCodec h263_decoder;
extern AVCodec opendivx_decoder; extern AVCodec mpeg4_decoder;
extern AVCodec msmpeg4_decoder; extern AVCodec msmpeg4_decoder;
extern AVCodec mpeg_decoder; extern AVCodec mpeg_decoder;
extern AVCodec h263i_decoder; extern AVCodec h263i_decoder;
......
...@@ -30,6 +30,7 @@ static int h263_decode_init(AVCodecContext *avctx) ...@@ -30,6 +30,7 @@ static int h263_decode_init(AVCodecContext *avctx)
MpegEncContext *s = avctx->priv_data; MpegEncContext *s = avctx->priv_data;
int i; int i;
s->avctx = avctx;
s->out_format = FMT_H263; s->out_format = FMT_H263;
s->width = avctx->width; s->width = avctx->width;
...@@ -39,7 +40,7 @@ static int h263_decode_init(AVCodecContext *avctx) ...@@ -39,7 +40,7 @@ static int h263_decode_init(AVCodecContext *avctx)
switch(avctx->codec->id) { switch(avctx->codec->id) {
case CODEC_ID_H263: case CODEC_ID_H263:
break; break;
case CODEC_ID_OPENDIVX: case CODEC_ID_MPEG4:
s->time_increment_bits = 4; /* default value for broken headers */ s->time_increment_bits = 4; /* default value for broken headers */
s->h263_pred = 1; s->h263_pred = 1;
break; break;
...@@ -148,6 +149,20 @@ static int h263_decode_frame(AVCodecContext *avctx, ...@@ -148,6 +149,20 @@ static int h263_decode_frame(AVCodecContext *avctx,
} }
MPV_decode_mb(s, s->block); MPV_decode_mb(s, s->block);
} }
if (avctx->draw_horiz_band) {
UINT8 *src_ptr[3];
int y, h, offset;
y = s->mb_y * 16;
h = s->height - y;
if (h > 16)
h = 16;
offset = y * s->linesize;
src_ptr[0] = s->current_picture[0] + offset;
src_ptr[1] = s->current_picture[1] + (offset >> 2);
src_ptr[2] = s->current_picture[2] + (offset >> 2);
avctx->draw_horiz_band(avctx, src_ptr, s->linesize,
y, s->width, h);
}
} }
MPV_frame_end(s); MPV_frame_end(s);
...@@ -164,15 +179,16 @@ static int h263_decode_frame(AVCodecContext *avctx, ...@@ -164,15 +179,16 @@ static int h263_decode_frame(AVCodecContext *avctx,
return buf_size; return buf_size;
} }
AVCodec opendivx_decoder = { AVCodec mpeg4_decoder = {
"opendivx", "mpeg4",
CODEC_TYPE_VIDEO, CODEC_TYPE_VIDEO,
CODEC_ID_OPENDIVX, CODEC_ID_MPEG4,
sizeof(MpegEncContext), sizeof(MpegEncContext),
h263_decode_init, h263_decode_init,
NULL, NULL,
h263_decode_end, h263_decode_end,
h263_decode_frame, h263_decode_frame,
CODEC_CAP_DRAW_HORIZ_BAND,
}; };
AVCodec h263_decoder = { AVCodec h263_decoder = {
...@@ -184,6 +200,7 @@ AVCodec h263_decoder = { ...@@ -184,6 +200,7 @@ AVCodec h263_decoder = {
NULL, NULL,
h263_decode_end, h263_decode_end,
h263_decode_frame, h263_decode_frame,
CODEC_CAP_DRAW_HORIZ_BAND,
}; };
AVCodec msmpeg4_decoder = { AVCodec msmpeg4_decoder = {
...@@ -195,6 +212,7 @@ AVCodec msmpeg4_decoder = { ...@@ -195,6 +212,7 @@ AVCodec msmpeg4_decoder = {
NULL, NULL,
h263_decode_end, h263_decode_end,
h263_decode_frame, h263_decode_frame,
CODEC_CAP_DRAW_HORIZ_BAND,
}; };
AVCodec h263i_decoder = { AVCodec h263i_decoder = {
...@@ -206,5 +224,6 @@ AVCodec h263i_decoder = { ...@@ -206,5 +224,6 @@ AVCodec h263i_decoder = {
NULL, NULL,
h263_decode_end, h263_decode_end,
h263_decode_frame, h263_decode_frame,
CODEC_CAP_DRAW_HORIZ_BAND,
}; };
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment