aboutsummaryrefslogtreecommitdiffstats
path: root/libavcodec/mpegvideo.c
diff options
context:
space:
mode:
authorJuanjo <pulento@users.sourceforge.net>2002-02-10 01:56:50 +0000
committerJuanjo <pulento@users.sourceforge.net>2002-02-10 01:56:50 +0000
commit37fbfd0a91fddc5e4fc1e94f74c0470adee8011d (patch)
tree2f79ec011770ba68b54fbb96cf9ba0db95aa0e0a /libavcodec/mpegvideo.c
parentec22603f791d32247fd0ea2e70d95732edd39b4f (diff)
downloadffmpeg-37fbfd0a91fddc5e4fc1e94f74c0470adee8011d.tar.gz
- Now the ME is done for the entire picture when enconding, the
DCT/Quantization is done after we have calculated all the MV of the picture. - This is the preamble for a better bit rate control. Originally committed as revision 293 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavcodec/mpegvideo.c')
-rw-r--r--libavcodec/mpegvideo.c91
1 files changed, 74 insertions, 17 deletions
diff --git a/libavcodec/mpegvideo.c b/libavcodec/mpegvideo.c
index 4c86c52372..f41666bf0b 100644
--- a/libavcodec/mpegvideo.c
+++ b/libavcodec/mpegvideo.c
@@ -146,7 +146,25 @@ int MPV_common_init(MpegEncContext *s)
s->aux_picture[i] = pict + pict_start;
}
}
-
+
+ if (s->encoding) {
+ /* Allocate MB type table */
+ s->mb_type = malloc(s->mb_width * s->mb_height * sizeof(char));
+ if (s->mb_type == NULL) {
+ perror("malloc");
+ goto fail;
+ }
+
+ /* Allocate MV table */
+ /* By now we just have one MV per MB */
+ s->mv_table[0] = malloc(s->mb_width * s->mb_height * sizeof(INT16));
+ s->mv_table[1] = malloc(s->mb_width * s->mb_height * sizeof(INT16));
+ if (s->mv_table[1] == NULL || s->mv_table[0] == NULL) {
+ perror("malloc");
+ goto fail;
+ }
+ }
+
if (s->out_format == FMT_H263) {
int size;
/* MV prediction */
@@ -204,6 +222,12 @@ int MPV_common_init(MpegEncContext *s)
s->context_initialized = 1;
return 0;
fail:
+ if (s->mb_type)
+ free(s->mb_type);
+ if (s->mv_table[0])
+ free(s->mv_table[0]);
+ if (s->mv_table[1])
+ free(s->mv_table[1]);
if (s->motion_val)
free(s->motion_val);
if (s->dc_val[0])
@@ -232,6 +256,12 @@ void MPV_common_end(MpegEncContext *s)
{
int i;
+ if (s->mb_type)
+ free(s->mb_type);
+ if (s->mv_table[0])
+ free(s->mv_table[0]);
+ if (s->mv_table[1])
+ free(s->mv_table[1]);
if (s->motion_val)
free(s->motion_val);
if (s->h263_pred) {
@@ -277,7 +307,7 @@ int MPV_encode_init(AVCodecContext *avctx)
s->full_search = motion_estimation_method;
s->fixed_qscale = (avctx->flags & CODEC_FLAG_QSCALE);
-
+
switch(avctx->codec->id) {
case CODEC_ID_MPEG1VIDEO:
s->out_format = FMT_MPEG1;
@@ -285,21 +315,21 @@ int MPV_encode_init(AVCodecContext *avctx)
case CODEC_ID_MJPEG:
s->out_format = FMT_MJPEG;
s->intra_only = 1; /* force intra only for jpeg */
- s->mjpeg_write_tables = 1; /* write all tables */
- s->mjpeg_vsample[0] = 2; /* set up default sampling factors */
- s->mjpeg_vsample[1] = 1; /* the only currently supported values */
- s->mjpeg_vsample[2] = 1;
- s->mjpeg_hsample[0] = 2;
- s->mjpeg_hsample[1] = 1;
- s->mjpeg_hsample[2] = 1;
+ s->mjpeg_write_tables = 1; /* write all tables */
+ s->mjpeg_vsample[0] = 2; /* set up default sampling factors */
+ s->mjpeg_vsample[1] = 1; /* the only currently supported values */
+ s->mjpeg_vsample[2] = 1;
+ s->mjpeg_hsample[0] = 2;
+ s->mjpeg_hsample[1] = 1;
+ s->mjpeg_hsample[2] = 1;
if (mjpeg_init(s) < 0)
return -1;
break;
case CODEC_ID_H263:
- if (h263_get_picture_format(s->width, s->height) == 7){
- printf("Input picture size isn't suitable for h263 codec! try h263+\n");
+ if (h263_get_picture_format(s->width, s->height) == 7) {
+ printf("Input picture size isn't suitable for h263 codec! try h263+\n");
return -1;
- }
+ }
s->out_format = FMT_H263;
break;
case CODEC_ID_H263P:
@@ -368,6 +398,7 @@ int MPV_encode_end(AVCodecContext *avctx)
MPV_common_end(s);
if (s->out_format == FMT_MJPEG)
mjpeg_close(s);
+
return 0;
}
@@ -479,16 +510,16 @@ int MPV_encode_picture(AVCodecContext *avctx,
h >>= 1;
}
- if(dest_wrap==src_wrap){
- s->new_picture[i] = pict->data[i];
- }else {
+ if(dest_wrap==src_wrap){
+ s->new_picture[i] = pict->data[i];
+ } else {
for(j=0;j<h;j++) {
memcpy(dest, src, w);
dest += dest_wrap;
src += src_wrap;
}
s->new_picture[i] = s->current_picture[i];
- }
+ }
}
encode_picture(s, s->picture_number);
@@ -944,8 +975,8 @@ static void encode_picture(MpegEncContext *s, int picture_number)
}
}
}
+
for(mb_x=0; mb_x < s->mb_width; mb_x++) {
-
s->mb_x = mb_x;
s->mb_y = mb_y;
@@ -959,7 +990,33 @@ static void encode_picture(MpegEncContext *s, int picture_number)
} else {
s->mb_intra = 1;
}
+ /* Store MB type and MV */
+ s->mb_type[mb_y * s->mb_width + mb_x] = s->mb_intra;
+ s->mv_table[0][mb_y * s->mb_width + mb_x] = motion_x;
+ s->mv_table[1][mb_y * s->mb_width + mb_x] = motion_y;
+ }
+
+ for(mb_x=0; mb_x < s->mb_width; mb_x++) {
+
+ s->mb_x = mb_x;
+ s->mb_y = mb_y;
+#if 0
+ /* compute motion vector and macro block type (intra or non intra) */
+ motion_x = 0;
+ motion_y = 0;
+ if (s->pict_type == P_TYPE) {
+ s->mb_intra = estimate_motion(s, mb_x, mb_y,
+ &motion_x,
+ &motion_y);
+ } else {
+ s->mb_intra = 1;
+ }
+#endif
+ s->mb_intra = s->mb_type[mb_y * s->mb_width + mb_x];
+ motion_x = s->mv_table[0][mb_y * s->mb_width + mb_x];
+ motion_y = s->mv_table[1][mb_y * s->mb_width + mb_x];
+
/* get the pixels */
wrap = s->linesize;
ptr = s->new_picture[0] + (mb_y * 16 * wrap) + mb_x * 16;