- 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
This commit is contained in:
parent
ec22603f79
commit
37fbfd0a91
@ -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];
|
||||
|
Loading…
x
Reference in New Issue
Block a user