Mercurial > libavcodec.hg
changeset 232:b640ec5948b0 libavcodec
- 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.
author | pulento |
---|---|
date | Sun, 10 Feb 2002 01:56:50 +0000 |
parents | 840cd25bf259 |
children | 3f5b72726118 |
files | motion_est.c mpegvideo.c mpegvideo.h |
diffstat | 3 files changed, 78 insertions(+), 18 deletions(-) [+] |
line wrap: on
line diff
--- a/motion_est.c Sat Feb 09 16:59:56 2002 +0000 +++ b/motion_est.c Sun Feb 10 01:56:50 2002 +0000 @@ -417,7 +417,7 @@ (cuz the drawn edge isnt large enough))*/ xmax = s->width; ymax = s->height; - } + } } else { xmin = 0; ymin = 0;
--- a/mpegvideo.c Sat Feb 09 16:59:56 2002 +0000 +++ b/mpegvideo.c Sun Feb 10 01:56:50 2002 +0000 @@ -146,7 +146,25 @@ 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 @@ 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 @@ { 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 @@ 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 @@ 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 @@ MPV_common_end(s); if (s->out_format == FMT_MJPEG) mjpeg_close(s); + return 0; } @@ -479,16 +510,16 @@ 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 @@ } } } + 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 @@ } 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;
--- a/mpegvideo.h Sat Feb 09 16:59:56 2002 +0000 +++ b/mpegvideo.h Sun Feb 10 01:56:50 2002 +0000 @@ -88,6 +88,7 @@ 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 @@ 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];