Commit e1667c47 authored by pulento's avatar pulento

- 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.


git-svn-id: file:///var/local/repositories/ffmpeg/trunk@293 9553f0bf-9b14-0410-a0b8-cfaf0461ba5b
parent b491494c
......@@ -147,6 +147,24 @@ int MPV_common_init(MpegEncContext *s)
}
}
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) {
......@@ -296,7 +326,7 @@ int MPV_encode_init(AVCodecContext *avctx)
return -1;
break;
case CODEC_ID_H263:
if (h263_get_picture_format(s->width, s->height) == 7){
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;
}
......@@ -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;
}
......@@ -481,7 +512,7 @@ int MPV_encode_picture(AVCodecContext *avctx,
if(dest_wrap==src_wrap){
s->new_picture[i] = pict->data[i];
}else {
} else {
for(j=0;j<h;j++) {
memcpy(dest, src, w);
dest += dest_wrap;
......@@ -944,8 +975,8 @@ static void encode_picture(MpegEncContext *s, int picture_number)
}
}
}
for(mb_x=0; mb_x < s->mb_width; mb_x++) {
for(mb_x=0; mb_x < s->mb_width; mb_x++) {
s->mb_x = mb_x;
s->mb_y = mb_y;
......@@ -959,6 +990,32 @@ 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;
......
......@@ -88,6 +88,7 @@ typedef struct MpegEncContext {
int h263_long_vectors; /* use horrible h263v1 long vector mode */
int f_code; /* resolution */
INT16 *mv_table[2]; /* MV table */
INT16 (*motion_val)[2]; /* used for MV prediction */
int full_search;
int mv_dir;
......@@ -115,6 +116,8 @@ typedef struct MpegEncContext {
int mb_x, mb_y;
int mb_incr;
int mb_intra;
char *mb_type; /* Table for MB type */
/* matrix transmitted in the bitstream */
UINT16 intra_matrix[64];
UINT16 chroma_intra_matrix[64];
......
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