Originally committed as revision 2164 to svn://svn.ffmpeg.org/ffmpeg/trunktags/v0.5
@@ -52,6 +52,7 @@ void avcodec_register_all(void) | |||
register_avcodec(&mpeg1video_encoder); | |||
// register_avcodec(&h264_encoder); | |||
#ifdef CONFIG_RISKY | |||
register_avcodec(&mpeg2video_encoder); | |||
register_avcodec(&h263_encoder); | |||
register_avcodec(&h263p_encoder); | |||
register_avcodec(&flv_encoder); | |||
@@ -15,14 +15,15 @@ extern "C" { | |||
#define LIBAVCODEC_VERSION_INT 0x000406 | |||
#define LIBAVCODEC_VERSION "0.4.6" | |||
#define LIBAVCODEC_BUILD 4675 | |||
#define LIBAVCODEC_BUILD_STR "4675" | |||
#define LIBAVCODEC_BUILD 4676 | |||
#define LIBAVCODEC_BUILD_STR "4676" | |||
#define LIBAVCODEC_IDENT "FFmpeg" LIBAVCODEC_VERSION "b" LIBAVCODEC_BUILD_STR | |||
enum CodecID { | |||
CODEC_ID_NONE, | |||
CODEC_ID_MPEG1VIDEO, | |||
CODEC_ID_MPEG2VIDEO, | |||
CODEC_ID_MPEG2VIDEO_XVMC, | |||
CODEC_ID_H263, | |||
CODEC_ID_RV10, | |||
@@ -219,6 +220,7 @@ static const int Motion_Est_QTab[] = { ME_ZERO, ME_PHODS, ME_LOG, | |||
#define CODEC_CAP_PARSE_ONLY 0x0004 | |||
#define CODEC_CAP_TRUNCATED 0x0008 | |||
#define FF_COMMON_FRAME \ | |||
/**\ | |||
* pointer to the picture planes.\ | |||
@@ -462,7 +464,7 @@ typedef struct AVCodecContext { | |||
* do something for a generic case as well. | |||
* - decoding: set by lavc. | |||
*/ | |||
enum PixelFormat pix_fmt; | |||
enum PixelFormat pix_fmt; //FIXME move to AVFrme | |||
/** | |||
* Frame rate emulation. If not zero lower layer (i.e. format handler) | |||
@@ -710,7 +712,7 @@ typedef struct AVCodecContext { | |||
data is returned. Only MPEG codecs support this now. */ | |||
/** | |||
* 0-> h263 quant 1-> mpeg quant. | |||
* 0-> default, 1-> mpeg quant. | |||
* - encoding: set by user. | |||
* - decoding: unused | |||
*/ | |||
@@ -1281,6 +1283,7 @@ extern AVCodec mp2_encoder; | |||
extern AVCodec mp3lame_encoder; | |||
extern AVCodec oggvorbis_encoder; | |||
extern AVCodec mpeg1video_encoder; | |||
extern AVCodec mpeg2video_encoder; | |||
extern AVCodec h263_encoder; | |||
extern AVCodec h263p_encoder; | |||
extern AVCodec flv_encoder; | |||
@@ -1587,7 +1590,7 @@ typedef enum { | |||
int avcodec(void* handle, avc_cmd_t cmd, void* pin, void* pout); | |||
/* memory */ | |||
void *av_malloc(unsigned int size); | |||
void *av_malloc(unsigned int size); //FIXME unsigned could be bad, dunno, need thinking | |||
void *av_mallocz(unsigned int size); | |||
void *av_realloc(void *ptr, unsigned int size); | |||
void av_free(void *ptr); | |||
@@ -32,8 +32,8 @@ | |||
#include "dsputil.h" | |||
#include "mpegvideo.h" | |||
//#undef NDEBUG | |||
//#include <assert.h> | |||
#undef NDEBUG | |||
#include <assert.h> | |||
#define SQ(a) ((a)*(a)) | |||
@@ -1507,7 +1507,7 @@ void ff_estimate_b_frame_motion(MpegEncContext * s, | |||
type = MB_TYPE_FORWARD; | |||
// RAL: No MB_TYPE_DIRECT in MPEG-1 video (only MPEG-4) | |||
if (s->codec_id != CODEC_ID_MPEG1VIDEO && dmin <= score){ | |||
if (s->codec_id == CODEC_ID_MPEG4 && dmin <= score){ | |||
score = dmin; | |||
type = MB_TYPE_DIRECT; | |||
} | |||
@@ -1586,8 +1586,9 @@ void ff_fix_long_p_mvs(MpegEncContext * s) | |||
{ | |||
const int f_code= s->f_code; | |||
int y, range; | |||
assert(s->pict_type==P_TYPE); | |||
range = (((s->codec_id == CODEC_ID_MPEG1VIDEO) ? 8 : 16) << f_code); | |||
range = (((s->out_format == FMT_MPEG1) ? 8 : 16) << f_code); | |||
if(s->msmpeg4_version) range= 16; | |||
@@ -1647,7 +1648,7 @@ void ff_fix_long_b_mvs(MpegEncContext * s, int16_t (*mv_table)[2], int f_code, i | |||
int y; | |||
// RAL: 8 in MPEG-1, 16 in MPEG-4 | |||
int range = (((s->codec_id == CODEC_ID_MPEG1VIDEO) ? 8 : 16) << f_code); | |||
int range = (((s->out_format == FMT_MPEG1) ? 8 : 16) << f_code); | |||
if(s->avctx->me_range && range > s->avctx->me_range) range= s->avctx->me_range; | |||
@@ -1673,3 +1674,53 @@ void ff_fix_long_b_mvs(MpegEncContext * s, int16_t (*mv_table)[2], int f_code, i | |||
} | |||
} | |||
} | |||
#if 0 | |||
/** | |||
* estimates global motion and inits sprite_ref | |||
*/ | |||
void ff_estimate_global_motion(MpegEncContext *s, int sprite_ref[3][2]){ | |||
int y; | |||
int num= 16<<s->f_code; | |||
int score[2][num]; | |||
int best_i[2]={0,0}; | |||
int best_score[2]={0,0}; | |||
memset(score, 0, 2*num*sizeof(int)); | |||
for(y=0; y<s->mb_height; y++){ | |||
int x; | |||
int xy= (y+1)* (s->mb_width+2)+1; | |||
int i= y*s->mb_width; | |||
for(x=0; x<s->mb_width; x++){ | |||
int mv[2]; | |||
if(!(s->mb_type[i]&MB_TYPE_INTER)) | |||
continue; | |||
mv[0]= s->p_mv_table[xy][0]; | |||
mv[1]= s->p_mv_table[xy][1]; | |||
if(mv[0]==0 && mv[1]==0) continue; | |||
score[0][mv[0] + num/2]++; | |||
score[1][mv[1] + num/2]++; | |||
} | |||
} | |||
for(n=0; n<2; n++){ | |||
for(i=1; i<num-1; i++){ | |||
int s= score[n][i-1] + score[n][i]*2 + score[n][i+1]; | |||
if(s > best_score[n]){ | |||
best_score[n]= s; | |||
best_i[n]= i; | |||
} | |||
} | |||
} | |||
sprite_ref[0][0]= best_i[0] - num/2; | |||
sprite_ref[0][1]= best_i[1] - num/2; | |||
// decide block type | |||
} | |||
#endif |
@@ -19,7 +19,7 @@ | |||
/** | |||
* @file mpeg12.c | |||
* MPEG1 codec / MPEG2 decoder. | |||
* MPEG1/2 codec | |||
*/ | |||
//#define DEBUG | |||
@@ -228,9 +228,9 @@ static void mpeg1_encode_sequence_header(MpegEncContext *s) | |||
put_bits(&s->pb, 4, s->aspect_ratio_info); | |||
put_bits(&s->pb, 4, s->frame_rate_index); | |||
v = (s->bit_rate + 399) / 400; | |||
if (v > 0x3ffff) | |||
if (v > 0x3ffff && s->codec_id == CODEC_ID_MPEG1VIDEO) | |||
v = 0x3ffff; | |||
put_bits(&s->pb, 18, v); | |||
put_bits(&s->pb, 18, v & 0x3FFFF); | |||
put_bits(&s->pb, 1, 1); /* marker */ | |||
if(s->avctx->rc_buffer_size) | |||
@@ -238,12 +238,30 @@ static void mpeg1_encode_sequence_header(MpegEncContext *s) | |||
else | |||
/* VBV calculation: Scaled so that a VCD has the proper VBV size of 40 kilobytes */ | |||
vbv_buffer_size = (( 20 * s->bit_rate) / (1151929 / 2)) * 8 * 1024; | |||
put_bits(&s->pb, 10, (vbv_buffer_size + 16383) / 16384); | |||
put_bits(&s->pb, 10, ((vbv_buffer_size + 16383) / 16384) & 0x3FF); | |||
put_bits(&s->pb, 1, 1); /* constrained parameter flag */ | |||
ff_write_quant_matrix(&s->pb, s->avctx->intra_matrix); | |||
ff_write_quant_matrix(&s->pb, s->avctx->inter_matrix); | |||
if(s->codec_id == CODEC_ID_MPEG2VIDEO){ | |||
put_header(s, EXT_START_CODE); | |||
put_bits(&s->pb, 4, 1); //seq ext | |||
put_bits(&s->pb, 1, 0); //esc | |||
put_bits(&s->pb, 3, 4); //profile | |||
put_bits(&s->pb, 4, 8); //level | |||
put_bits(&s->pb, 1, s->progressive_sequence=1); | |||
put_bits(&s->pb, 2, 1); //chroma format 4:2:0 | |||
put_bits(&s->pb, 2, 0); //horizontal size ext | |||
put_bits(&s->pb, 2, 0); //vertical size ext | |||
put_bits(&s->pb, 12, v>>18); //bitrate ext | |||
put_bits(&s->pb, 1, 1); //marker | |||
put_bits(&s->pb, 8, vbv_buffer_size >>10); //vbv buffer ext | |||
put_bits(&s->pb, 1, s->low_delay); | |||
put_bits(&s->pb, 2, 0); // frame_rate_ext_n | |||
put_bits(&s->pb, 5, 0); // frame_rate_ext_d | |||
} | |||
put_header(s, GOP_START_CODE); | |||
put_bits(&s->pb, 1, 0); /* do drop frame */ | |||
/* time code : we must convert from the real frame rate to a | |||
@@ -286,6 +304,8 @@ static inline void encode_mb_skip_run(MpegEncContext *s, int run){ | |||
/* insert a fake P picture */ | |||
static void mpeg1_skip_picture(MpegEncContext *s, int pict_num) | |||
{ | |||
assert(s->codec_id == CODEC_ID_MPEG1VIDEO); // mpeg2 can do these repeat things | |||
/* mpeg1 picture header */ | |||
put_header(s, PICTURE_START_CODE); | |||
/* temporal reference */ | |||
@@ -372,10 +392,31 @@ void mpeg1_encode_picture_header(MpegEncContext *s, int picture_number) | |||
if (s->pict_type == B_TYPE) { | |||
put_bits(&s->pb, 1, 0); /* half pel coordinates */ | |||
put_bits(&s->pb, 3, s->b_code); /* backward_f_code */ | |||
} | |||
} | |||
put_bits(&s->pb, 1, 0); /* extra bit picture */ | |||
if(s->codec_id == CODEC_ID_MPEG2VIDEO){ | |||
put_header(s, EXT_START_CODE); | |||
put_bits(&s->pb, 4, 8); //pic ext | |||
put_bits(&s->pb, 4, s->f_code); | |||
put_bits(&s->pb, 4, s->f_code); | |||
put_bits(&s->pb, 4, s->b_code); | |||
put_bits(&s->pb, 4, s->b_code); | |||
put_bits(&s->pb, 2, s->intra_dc_precision); | |||
put_bits(&s->pb, 2, s->picture_structure= PICT_FRAME); | |||
put_bits(&s->pb, 1, s->top_field_first); | |||
put_bits(&s->pb, 1, s->frame_pred_frame_dct= 1); | |||
put_bits(&s->pb, 1, s->concealment_motion_vectors); | |||
put_bits(&s->pb, 1, s->q_scale_type); | |||
put_bits(&s->pb, 1, s->intra_vlc_format); | |||
put_bits(&s->pb, 1, s->alternate_scan); | |||
put_bits(&s->pb, 1, s->repeat_first_field); | |||
put_bits(&s->pb, 1, s->chroma_420_type=1); | |||
put_bits(&s->pb, 1, s->progressive_frame=1); | |||
put_bits(&s->pb, 1, 0); //composite_display_flag | |||
} | |||
s->mb_y=0; | |||
ff_mpeg1_encode_slice_header(s); | |||
} | |||
@@ -396,7 +437,7 @@ void mpeg1_encode_mb(MpegEncContext *s, | |||
cbp |= 1 << (5 - i); | |||
} | |||
if (cbp == 0 && !first_mb && (mb_x != s->mb_width - 1 || mb_y != s->mb_height - 1) && | |||
if (cbp == 0 && !first_mb && (mb_x != s->mb_width - 1 || (mb_y != s->mb_height - 1 && s->codec_id == CODEC_ID_MPEG1VIDEO)) && | |||
((s->pict_type == P_TYPE && (motion_x | motion_y) == 0) || | |||
(s->pict_type == B_TYPE && s->mv_dir == s->last_mv_dir && (((s->mv_dir & MV_DIR_FORWARD) ? ((s->mv[0][0][0] - s->last_mv[0][0][0])|(s->mv[0][0][1] - s->last_mv[0][0][1])) : 0) | | |||
((s->mv_dir & MV_DIR_BACKWARD) ? ((s->mv[1][0][0] - s->last_mv[1][0][0])|(s->mv[1][0][1] - s->last_mv[1][0][1])) : 0)) == 0))) { | |||
@@ -708,8 +749,13 @@ void ff_mpeg1_encode_init(MpegEncContext *s) | |||
} | |||
s->me.mv_penalty= mv_penalty; | |||
s->fcode_tab= fcode_tab; | |||
s->min_qcoeff=-255; | |||
s->max_qcoeff= 255; | |||
if(s->codec_id == CODEC_ID_MPEG1VIDEO){ | |||
s->min_qcoeff=-255; | |||
s->max_qcoeff= 255; | |||
}else{ | |||
s->min_qcoeff=-2047; | |||
s->max_qcoeff= 2047; | |||
} | |||
s->intra_ac_vlc_length= | |||
s->inter_ac_vlc_length= uni_mpeg1_ac_vlc_len; | |||
} | |||
@@ -747,6 +793,12 @@ static void mpeg1_encode_block(MpegEncContext *s, | |||
encode_dc(s, diff, component); | |||
s->last_dc[component] = dc; | |||
i = 1; | |||
/* | |||
if (s->intra_vlc_format) | |||
rl = &rl_mpeg2; | |||
else | |||
rl = &rl_mpeg1; | |||
*/ | |||
} else { | |||
/* encode the first coefficient : needs to be done here because | |||
it is handled slightly differently */ | |||
@@ -791,14 +843,18 @@ static void mpeg1_encode_block(MpegEncContext *s, | |||
put_bits(&s->pb, mpeg1_vlc[111/*rl->n*/][1], mpeg1_vlc[111/*rl->n*/][0]); | |||
/* escape: only clip in this case */ | |||
put_bits(&s->pb, 6, run); | |||
if (alevel < 128) { | |||
put_bits(&s->pb, 8, level & 0xff); | |||
} else { | |||
if (level < 0) { | |||
put_bits(&s->pb, 16, 0x8001 + level + 255); | |||
if(s->codec_id == CODEC_ID_MPEG1VIDEO){ | |||
if (alevel < 128) { | |||
put_bits(&s->pb, 8, level & 0xff); | |||
} else { | |||
put_bits(&s->pb, 16, level & 0xffff); | |||
if (level < 0) { | |||
put_bits(&s->pb, 16, 0x8001 + level + 255); | |||
} else { | |||
put_bits(&s->pb, 16, level & 0xffff); | |||
} | |||
} | |||
}else{ | |||
put_bits(&s->pb, 12, level & 0xfff); | |||
} | |||
} | |||
last_non_zero = i; | |||
@@ -868,7 +924,7 @@ static inline int get_dmv(MpegEncContext *s) | |||
static inline int get_qscale(MpegEncContext *s) | |||
{ | |||
int qscale = get_bits(&s->gb, 5); | |||
if (s->mpeg2) { | |||
if (s->codec_id == CODEC_ID_MPEG2VIDEO) { | |||
if (s->q_scale_type) { | |||
return non_linear_qscale[qscale]; | |||
} else { | |||
@@ -987,7 +1043,7 @@ static int mpeg_decode_mb(MpegEncContext *s, | |||
memset(s->last_mv, 0, sizeof(s->last_mv)); /* reset mv prediction */ | |||
s->mb_intra = 1; | |||
if (s->mpeg2) { | |||
if (s->codec_id == CODEC_ID_MPEG2VIDEO) { | |||
for(i=0;i<6;i++) { | |||
if (mpeg2_decode_block_intra(s, block[i], i) < 0) | |||
return -1; | |||
@@ -1165,7 +1221,7 @@ static int mpeg_decode_mb(MpegEncContext *s, | |||
} | |||
cbp++; | |||
if (s->mpeg2) { | |||
if (s->codec_id == CODEC_ID_MPEG2VIDEO) { | |||
for(i=0;i<6;i++) { | |||
if (cbp & 32) { | |||
if (mpeg2_decode_block_non_intra(s, block[i], i) < 0) | |||
@@ -1648,9 +1704,12 @@ static void mpeg_decode_sequence_extension(MpegEncContext *s) | |||
int horiz_size_ext, vert_size_ext; | |||
int bit_rate_ext, vbv_buf_ext; | |||
int frame_rate_ext_n, frame_rate_ext_d; | |||
int level, profile; | |||
float aspect; | |||
skip_bits(&s->gb, 8); /* profil and level */ | |||
skip_bits(&s->gb, 1); /* profil and level esc*/ | |||
profile= get_bits(&s->gb, 3); | |||
level= get_bits(&s->gb, 4); | |||
s->progressive_sequence = get_bits1(&s->gb); /* progressive_sequence */ | |||
skip_bits(&s->gb, 2); /* chroma_format */ | |||
horiz_size_ext = get_bits(&s->gb, 2); | |||
@@ -1675,12 +1734,15 @@ static void mpeg_decode_sequence_extension(MpegEncContext *s) | |||
1<<30); | |||
dprintf("sequence extension\n"); | |||
s->mpeg2 = 1; | |||
s->codec_id= s->avctx->codec_id= CODEC_ID_MPEG2VIDEO; | |||
s->avctx->sub_id = 2; /* indicates mpeg2 found */ | |||
aspect= mpeg2_aspect[s->aspect_ratio_info]; | |||
if(aspect>0.0) s->avctx->aspect_ratio= s->width/(aspect*s->height); | |||
else if(aspect<0.0) s->avctx->aspect_ratio= -1.0/aspect; | |||
if(s->avctx->debug & FF_DEBUG_PICT_INFO) | |||
printf("profile: %d, level: %d \n", profile, level); | |||
} | |||
static void mpeg_decode_quant_matrix_extension(MpegEncContext *s) | |||
@@ -2046,7 +2108,7 @@ static int slice_end(AVCodecContext *avctx, AVFrame *pict) | |||
if (/*s->mb_y<<field_pic == s->mb_height &&*/ !s->first_field) { | |||
/* end of image */ | |||
if(s->mpeg2){ | |||
if(s->codec_id == CODEC_ID_MPEG2VIDEO){ | |||
s->current_picture_ptr->qscale_type= FF_QSCALE_TYPE_MPEG2; | |||
}else | |||
s->current_picture_ptr->qscale_type= FF_QSCALE_TYPE_MPEG1; | |||
@@ -2089,7 +2151,7 @@ static int mpeg1_decode_sequence(AVCodecContext *avctx, | |||
width = get_bits(&s->gb, 12); | |||
height = get_bits(&s->gb, 12); | |||
s->aspect_ratio_info= get_bits(&s->gb, 4); | |||
if(!s->mpeg2){ | |||
if(s->codec_id == CODEC_ID_MPEG1VIDEO){ | |||
aspect= mpeg1_aspect[s->aspect_ratio_info]; | |||
if(aspect!=0.0) avctx->aspect_ratio= width/(aspect*height); | |||
} | |||
@@ -2187,7 +2249,7 @@ static int mpeg1_decode_sequence(AVCodecContext *avctx, | |||
s->progressive_frame = 1; | |||
s->picture_structure = PICT_FRAME; | |||
s->frame_pred_frame_dct = 1; | |||
s->mpeg2 = 0; | |||
s->codec_id= s->avctx->codec_id= CODEC_ID_MPEG1VIDEO; | |||
avctx->sub_id = 1; /* indicates mpeg1 */ | |||
return 0; | |||
} | |||
@@ -2233,7 +2295,7 @@ static int vcr2_init_sequence(AVCodecContext *avctx) | |||
s->progressive_frame = 1; | |||
s->picture_structure = PICT_FRAME; | |||
s->frame_pred_frame_dct = 1; | |||
s->mpeg2 = 1; | |||
s->codec_id= s->avctx->codec_id= CODEC_ID_MPEG2VIDEO; | |||
avctx->sub_id = 2; /* indicates mpeg2 */ | |||
return 0; | |||
} | |||
@@ -34,8 +34,8 @@ | |||
#include "fastmemcpy.h" | |||
#endif | |||
//#undef NDEBUG | |||
//#include <assert.h> | |||
#undef NDEBUG | |||
#include <assert.h> | |||
#ifdef CONFIG_ENCODERS | |||
static void encode_picture(MpegEncContext *s, int picture_number); | |||
@@ -191,7 +191,7 @@ int DCT_common_init(MpegEncContext *s) | |||
#endif | |||
#ifdef HAVE_MMX | |||
MPV_common_init_mmx(s); | |||
MPV_common_init_mmx(s); //FIXME dont pass mpegenccontext to these, rather use dspcontext | |||
#endif | |||
#ifdef ARCH_ALPHA | |||
MPV_common_init_axp(s); | |||
@@ -279,7 +279,7 @@ static int alloc_picture(MpegEncContext *s, Picture *pic, int shared){ | |||
} | |||
CHECKED_ALLOCZ(pic->mbskip_table , mb_array_size * sizeof(uint8_t)+2) //the +2 is for the slice end check | |||
CHECKED_ALLOCZ(pic->qscale_table , mb_array_size * sizeof(uint8_t)) | |||
CHECKED_ALLOCZ(pic->qscale_table , mb_array_size * sizeof(uint8_t)+3) //+3 for mpeg2 SIMD >>1 | |||
CHECKED_ALLOCZ(pic->mb_type_base , big_mb_num * sizeof(int)) | |||
pic->mb_type= pic->mb_type_base + s->mb_stride+1; | |||
if(s->out_format == FMT_H264){ | |||
@@ -424,7 +424,7 @@ int MPV_common_init(MpegEncContext *s) | |||
CHECKED_ALLOCZ(s->error_status_table, mb_array_size*sizeof(uint8_t)) | |||
if (s->out_format == FMT_H263 || s->encoding) { | |||
if (s->out_format == FMT_H263 || s->encoding || 1) { | |||
int size; | |||
/* MV prediction */ | |||
@@ -581,7 +581,7 @@ int MPV_encode_init(AVCodecContext *avctx) | |||
s->data_partitioning= avctx->flags & CODEC_FLAG_PART; | |||
s->quarter_sample= (avctx->flags & CODEC_FLAG_QPEL)!=0; | |||
s->mpeg_quant= avctx->mpeg_quant; | |||
if (s->gop_size <= 1) { | |||
s->intra_only = 1; | |||
s->gop_size = 12; | |||
@@ -618,20 +618,20 @@ int MPV_encode_init(AVCodecContext *avctx) | |||
return -1; | |||
} | |||
if(s->max_b_frames && s->codec_id != CODEC_ID_MPEG4 && s->codec_id != CODEC_ID_MPEG1VIDEO){ | |||
if(s->max_b_frames && s->codec_id != CODEC_ID_MPEG4 && s->codec_id != CODEC_ID_MPEG1VIDEO && s->codec_id != CODEC_ID_MPEG2VIDEO){ | |||
fprintf(stderr, "b frames not supporetd by codec\n"); | |||
return -1; | |||
} | |||
/* | |||
if(s->mpeg_quant && s->codec_id != CODEC_ID_MPEG4){ //FIXME mpeg2 uses that too | |||
fprintf(stderr, "mpeg2 style quantization not supporetd by codec\n"); | |||
return -1; | |||
} | |||
*/ | |||
if(s->codec_id==CODEC_ID_MJPEG){ | |||
s->intra_quant_bias= 1<<(QUANT_BIAS_SHIFT-1); //(a + x/2)/x | |||
s->inter_quant_bias= 0; | |||
}else if(s->mpeg_quant || s->codec_id==CODEC_ID_MPEG1VIDEO){ | |||
}else if(s->mpeg_quant || s->codec_id==CODEC_ID_MPEG1VIDEO || s->codec_id==CODEC_ID_MPEG2VIDEO){ | |||
s->intra_quant_bias= 3<<(QUANT_BIAS_SHIFT-3); //(a + x*3/8)/x | |||
s->inter_quant_bias= 0; | |||
}else{ | |||
@@ -652,6 +652,13 @@ int MPV_encode_init(AVCodecContext *avctx) | |||
s->low_delay= 0; //s->max_b_frames ? 0 : 1; | |||
avctx->delay= s->low_delay ? 0 : (s->max_b_frames + 1); | |||
break; | |||
case CODEC_ID_MPEG2VIDEO: | |||
s->out_format = FMT_MPEG1; | |||
s->low_delay= 0; //s->max_b_frames ? 0 : 1; | |||
avctx->delay= s->low_delay ? 0 : (s->max_b_frames + 1); | |||
s->rtp_mode= 1; // mpeg2 must have slices | |||
if(s->rtp_payload_size == 0) s->rtp_payload_size= 256*256*256; | |||
break; | |||
case CODEC_ID_LJPEG: | |||
case CODEC_ID_MJPEG: | |||
s->out_format = FMT_MJPEG; | |||
@@ -820,7 +827,7 @@ int MPV_encode_init(AVCodecContext *avctx) | |||
s->inter_matrix[j] = ff_mpeg1_default_non_intra_matrix[i]; | |||
}else | |||
#endif | |||
{ /* mpeg1 */ | |||
{ /* mpeg1/2 */ | |||
s->intra_matrix[j] = ff_mpeg1_default_intra_matrix[i]; | |||
s->inter_matrix[j] = ff_mpeg1_default_non_intra_matrix[i]; | |||
} | |||
@@ -1002,6 +1009,7 @@ alloc: | |||
if( alloc_picture(s, (Picture*)pic, 0) < 0) | |||
return -1; | |||
assert(pic->data[0]); | |||
s->current_picture_ptr= &s->picture[i]; | |||
} | |||
@@ -1048,12 +1056,11 @@ alloc: | |||
/* set dequantizer, we cant do it during init as it might change for mpeg4 | |||
and we cant do it in the header decode as init isnt called for mpeg4 there yet */ | |||
if(s->out_format == FMT_H263){ | |||
if(s->mpeg_quant) | |||
s->dct_unquantize = s->dct_unquantize_mpeg2; | |||
else | |||
s->dct_unquantize = s->dct_unquantize_h263; | |||
}else | |||
if(s->mpeg_quant || s->codec_id == CODEC_ID_MPEG2VIDEO) | |||
s->dct_unquantize = s->dct_unquantize_mpeg2; | |||
else if(s->out_format == FMT_H263) | |||
s->dct_unquantize = s->dct_unquantize_h263; | |||
else | |||
s->dct_unquantize = s->dct_unquantize_mpeg1; | |||
#ifdef HAVE_XVMC | |||
@@ -1074,7 +1081,7 @@ void MPV_frame_end(MpegEncContext *s) | |||
XVMC_field_end(s); | |||
}else | |||
#endif | |||
if(s->codec_id!=CODEC_ID_SVQ1 && s->codec_id != CODEC_ID_MPEG1VIDEO){ | |||
if(s->codec_id!=CODEC_ID_SVQ1 && s->out_format != FMT_MPEG1){ | |||
if (s->pict_type != B_TYPE && !s->intra_only && !(s->flags&CODEC_FLAG_EMU_EDGE)) { | |||
draw_edges(s->current_picture.data[0], s->linesize , s->h_edge_pos , s->v_edge_pos , EDGE_WIDTH ); | |||
draw_edges(s->current_picture.data[1], s->uvlinesize, s->h_edge_pos>>1, s->v_edge_pos>>1, EDGE_WIDTH/2); | |||
@@ -2345,7 +2352,8 @@ static inline void MPV_motion(MpegEncContext *s, | |||
} | |||
} | |||
break; | |||
default: | |||
printf("X"); | |||
} | |||
} | |||
@@ -2523,7 +2531,7 @@ void MPV_decode_mb(MpegEncContext *s, DCTELEM block[6][64]) | |||
if(s->hurry_up>1) return; | |||
/* add dct residue */ | |||
if(s->encoding || !( s->mpeg2 || s->h263_msmpeg4 || s->codec_id==CODEC_ID_MPEG1VIDEO | |||
if(s->encoding || !( s->h263_msmpeg4 || s->codec_id==CODEC_ID_MPEG1VIDEO || s->codec_id==CODEC_ID_MPEG2VIDEO | |||
|| (s->codec_id==CODEC_ID_MPEG4 && !s->mpeg_quant))){ | |||
add_dequant_dct(s, block[0], 0, dest_y, dct_linesize); | |||
add_dequant_dct(s, block[1], 1, dest_y + 8, dct_linesize); | |||
@@ -2552,7 +2560,7 @@ void MPV_decode_mb(MpegEncContext *s, DCTELEM block[6][64]) | |||
#endif | |||
} else { | |||
/* dct only in intra block */ | |||
if(s->encoding || !(s->mpeg2 || s->codec_id==CODEC_ID_MPEG1VIDEO)){ | |||
if(s->encoding || !(s->codec_id==CODEC_ID_MPEG1VIDEO || s->codec_id==CODEC_ID_MPEG2VIDEO)){ | |||
put_dct(s, block[0], 0, dest_y, dct_linesize); | |||
put_dct(s, block[1], 1, dest_y + 8, dct_linesize); | |||
put_dct(s, block[2], 2, dest_y + dct_offset, dct_linesize); | |||
@@ -2997,7 +3005,9 @@ static void encode_mb(MpegEncContext *s, int motion_x, int motion_y) | |||
for(i=0;i<6;i++) { | |||
if(!skip_dct[i]){ | |||
int overflow; | |||
START_TIMER; | |||
s->block_last_index[i] = s->dct_quantize(s, s->block[i], i, s->qscale, &overflow); | |||
STOP_TIMER("dct_quant"); | |||
// FIXME we could decide to change to quantizer instead of clipping | |||
// JS: I don't think that would be a good idea it could lower quality instead | |||
// of improve it. Just INTRADC clipping deserves changes in quantizer | |||
@@ -3023,6 +3033,7 @@ static void encode_mb(MpegEncContext *s, int motion_x, int motion_y) | |||
/* huffman encode */ | |||
switch(s->codec_id){ //FIXME funct ptr could be slightly faster | |||
case CODEC_ID_MPEG1VIDEO: | |||
case CODEC_ID_MPEG2VIDEO: | |||
mpeg1_encode_mb(s, s->block, motion_x, motion_y); break; | |||
#ifdef CONFIG_RISKY | |||
case CODEC_ID_MPEG4: | |||
@@ -3316,7 +3327,8 @@ static void encode_picture(MpegEncContext *s, int picture_number) | |||
#ifdef CONFIG_RISKY | |||
/* we need to initialize some time vars before we can encode b-frames */ | |||
// RAL: Condition added for MPEG1VIDEO | |||
if (s->codec_id == CODEC_ID_MPEG1VIDEO || (s->h263_pred && !s->h263_msmpeg4)) | |||
//FIXME figure out why mpeg1/2 need this !!! | |||
if (s->codec_id == CODEC_ID_MPEG1VIDEO || s->codec_id == CODEC_ID_MPEG2VIDEO || (s->h263_pred && !s->h263_msmpeg4)) | |||
ff_set_mpeg4_time(s, s->picture_number); | |||
#endif | |||
@@ -3562,15 +3574,14 @@ static void encode_picture(MpegEncContext *s, int picture_number) | |||
/* write gob / video packet header */ | |||
#ifdef CONFIG_RISKY | |||
if(s->rtp_mode){ | |||
if(s->rtp_mode && mb_y + mb_x>0){ | |||
int current_packet_size, is_gob_start; | |||
current_packet_size= pbBufPtr(&s->pb) - s->ptr_lastgob; | |||
is_gob_start=0; | |||
if(s->codec_id==CODEC_ID_MPEG4){ | |||
if(current_packet_size >= s->rtp_payload_size | |||
&& s->mb_y + s->mb_x>0){ | |||
if(current_packet_size >= s->rtp_payload_size){ | |||
if(s->partitioned_frame){ | |||
ff_mpeg4_merge_partitions(s); | |||
@@ -3588,14 +3599,21 @@ static void encode_picture(MpegEncContext *s, int picture_number) | |||
} | |||
}else if(s->codec_id==CODEC_ID_MPEG1VIDEO){ | |||
if( current_packet_size >= s->rtp_payload_size | |||
&& s->mb_y + s->mb_x>0 && s->mb_skip_run==0){ | |||
&& s->mb_skip_run==0){ | |||
ff_mpeg1_encode_slice_header(s); | |||
ff_mpeg1_clean_buffers(s); | |||
is_gob_start=1; | |||
} | |||
}else if(s->codec_id==CODEC_ID_MPEG2VIDEO){ | |||
if( ( current_packet_size >= s->rtp_payload_size || mb_x==0) | |||
&& s->mb_skip_run==0){ | |||
ff_mpeg1_encode_slice_header(s); | |||
ff_mpeg1_clean_buffers(s); | |||
is_gob_start=1; | |||
} | |||
}else{ | |||
if(current_packet_size >= s->rtp_payload_size | |||
&& s->mb_x==0 && s->mb_y>0 && s->mb_y%s->gob_index==0){ | |||
&& s->mb_x==0 && s->mb_y%s->gob_index==0){ | |||
h263_encode_gob_header(s, mb_y); | |||
is_gob_start=1; | |||
@@ -4000,7 +4018,7 @@ static int dct_quantize_trellis_c(MpegEncContext *s, | |||
start_i = 1; | |||
last_non_zero = 0; | |||
qmat = s->q_intra_matrix[qscale]; | |||
if(s->mpeg_quant || s->codec_id== CODEC_ID_MPEG1VIDEO) | |||
if(s->mpeg_quant) | |||
bias= 1<<(QMAT_SHIFT-1); | |||
length = s->intra_ac_vlc_length; | |||
last_length= s->intra_ac_vlc_last_length; | |||
@@ -4529,6 +4547,16 @@ AVCodec mpeg1video_encoder = { | |||
#ifdef CONFIG_RISKY | |||
AVCodec mpeg2video_encoder = { | |||
"mpeg2video", | |||
CODEC_TYPE_VIDEO, | |||
CODEC_ID_MPEG2VIDEO, | |||
sizeof(MpegEncContext), | |||
MPV_encode_init, | |||
MPV_encode_picture, | |||
MPV_encode_end, | |||
}; | |||
AVCodec h263_encoder = { | |||
"h263", | |||
CODEC_TYPE_VIDEO, | |||
@@ -48,8 +48,13 @@ enum OutputFormat { | |||
#define MAX_PICTURE_COUNT 15 | |||
#if 1 | |||
#define ME_MAP_SIZE 4096 | |||
#define ME_MAP_SHIFT 6 | |||
#else | |||
#define ME_MAP_SIZE 64 | |||
#define ME_MAP_SHIFT 3 | |||
#endif | |||
#define ME_MAP_MV_BITS 11 | |||
/* run length table */ | |||
@@ -385,8 +390,10 @@ typedef struct MpegEncContext { | |||
int me_method; ///< ME algorithm | |||
int scene_change_score; | |||
int mv_dir; | |||
#define MV_DIR_BACKWARD 1 | |||
#define MV_DIR_FORWARD 2 | |||
#define MV_DIR_L1 1 | |||
#define MV_DIR_L0 2 | |||
#define MV_DIR_BACKWARD MV_DIR_L1 | |||
#define MV_DIR_FORWARD MV_DIR_L0 | |||
#define MV_DIRECT 4 ///< bidirectional mode where the difference equals the MV of the last P/S/I-Frame (mpeg4) | |||
int mv_type; | |||
#define MV_TYPE_16X16 0 ///< 1 vector for the whole mb | |||
@@ -568,6 +575,11 @@ typedef struct MpegEncContext { | |||
uint8_t *tex_pb_buffer; | |||
uint8_t *pb2_buffer; | |||
int mpeg_quant; | |||
#define FF_QUANT_DEFAULT 0 | |||
#define FF_QUANT_MPEG2 1 | |||
#define FF_QUANT_MPEG1 2 | |||
#define FF_QUANT_H263 3 | |||
int16_t (*field_mv_table)[2][2]; ///< used for interlaced b frame decoding | |||
int8_t (*field_select_table)[2]; ///< wtf, no really another table for interlaced b frames | |||
int t_frame; ///< time distance of first I -> B, used for interlaced b frames | |||
@@ -644,7 +656,6 @@ typedef struct MpegEncContext { | |||
int repeat_first_field; | |||
int chroma_420_type; | |||
int progressive_frame; | |||
int mpeg2; | |||
int full_pel[2]; | |||
int interlaced_dct; | |||
int first_slice; | |||
@@ -652,7 +663,7 @@ typedef struct MpegEncContext { | |||
/* RTP specific */ | |||
/* These are explained on avcodec.h */ | |||
int rtp_mode; | |||
int rtp_mode; //FIXME simplify this mess (remove callback, merge mode + payload) | |||
int rtp_payload_size; | |||
void (*rtp_callback)(void *data, int size, int packet_number); | |||
uint8_t *ptr_lastgob; | |||
@@ -870,6 +881,7 @@ int msmpeg4_decode_ext_header(MpegEncContext * s, int buf_size); | |||
int ff_msmpeg4_decode_init(MpegEncContext *s); | |||
void ff_msmpeg4_encode_init(MpegEncContext *s); | |||
int ff_wmv2_decode_picture_header(MpegEncContext * s); | |||
int ff_wmv2_decode_secondary_picture_header(MpegEncContext * s); | |||
void ff_wmv2_add_mb(MpegEncContext *s, DCTELEM block[6][64], uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr); | |||
void ff_mspel_motion(MpegEncContext *s, | |||
uint8_t *dest_y, uint8_t *dest_cb, uint8_t *dest_cr, | |||