mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-12-23 12:43:46 +02:00
mpeg2 encoding
Originally committed as revision 2164 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
parent
9b6a5b87a6
commit
029911d1c3
@ -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 */
|
||||
@ -376,6 +396,27 @@ void mpeg1_encode_picture_header(MpegEncContext *s, int picture_number)
|
||||
|
||||
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;
|
||||
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,6 +843,7 @@ 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(s->codec_id == CODEC_ID_MPEG1VIDEO){
|
||||
if (alevel < 128) {
|
||||
put_bits(&s->pb, 8, level & 0xff);
|
||||
} else {
|
||||
@ -800,6 +853,9 @@ static void mpeg1_encode_block(MpegEncContext *s,
|
||||
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 */
|
||||
@ -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)
|
||||
if(s->mpeg_quant || s->codec_id == CODEC_ID_MPEG2VIDEO)
|
||||
s->dct_unquantize = s->dct_unquantize_mpeg2;
|
||||
else
|
||||
else if(s->out_format == FMT_H263)
|
||||
s->dct_unquantize = s->dct_unquantize_h263;
|
||||
}else
|
||||
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,
|
||||
|
Loading…
Reference in New Issue
Block a user