Commit ba58dabc authored by Michael Niedermayer's avatar Michael Niedermayer

h263 slice structured mode

slice cleanup

Originally committed as revision 2568 to svn://svn.ffmpeg.org/ffmpeg/trunk
parent a8380f44
...@@ -17,7 +17,7 @@ extern "C" { ...@@ -17,7 +17,7 @@ extern "C" {
#define FFMPEG_VERSION_INT 0x000408 #define FFMPEG_VERSION_INT 0x000408
#define FFMPEG_VERSION "0.4.8" #define FFMPEG_VERSION "0.4.8"
#define LIBAVCODEC_BUILD 4693 #define LIBAVCODEC_BUILD 4694
#define LIBAVCODEC_VERSION_INT FFMPEG_VERSION_INT #define LIBAVCODEC_VERSION_INT FFMPEG_VERSION_INT
#define LIBAVCODEC_VERSION FFMPEG_VERSION #define LIBAVCODEC_VERSION FFMPEG_VERSION
...@@ -263,14 +263,11 @@ static const __attribute__((unused)) int Motion_Est_QTab[] = ...@@ -263,14 +263,11 @@ static const __attribute__((unused)) int Motion_Est_QTab[] =
#define CODEC_FLAG_H263P_AIV 0x00000008 ///< H263 Alternative inter vlc #define CODEC_FLAG_H263P_AIV 0x00000008 ///< H263 Alternative inter vlc
#define CODEC_FLAG_OBMC 0x00000001 ///< OBMC #define CODEC_FLAG_OBMC 0x00000001 ///< OBMC
#define CODEC_FLAG_LOOP_FILTER 0x00000800 ///< loop filter #define CODEC_FLAG_LOOP_FILTER 0x00000800 ///< loop filter
/* For advanced prediction mode, we reuse the 4MV flag */ #define CODEC_FLAG_H263P_SLICE_STRUCT 0x10000000
/* Unsupported options : /* Unsupported options :
* Syntax Arithmetic coding (SAC) * Syntax Arithmetic coding (SAC)
* Deblocking filter internal loop
* Slice structured
* Reference Picture Selection * Reference Picture Selection
* Independant Segment Decoding * Independant Segment Decoding */
* Modified Quantization */
/* /Fx */ /* /Fx */
/* codec capabilities */ /* codec capabilities */
...@@ -696,11 +693,8 @@ typedef struct AVCodecContext { ...@@ -696,11 +693,8 @@ typedef struct AVCodecContext {
void *priv_data; void *priv_data;
/* The following data is for RTP friendly coding */ /* unused, FIXME remove*/
/* By now only H.263/H.263+/MPEG4 coder honours this */ int rtp_mode;
int rtp_mode; /* 1 for activate RTP friendly-mode */
/* highers numbers represent more error-prone */
/* enviroments, by now just "1" exist */
int rtp_payload_size; /* The size of the RTP payload, the coder will */ int rtp_payload_size; /* The size of the RTP payload, the coder will */
/* do it's best to deliver a chunk with size */ /* do it's best to deliver a chunk with size */
...@@ -1398,7 +1392,27 @@ typedef struct AVCodecContext { ...@@ -1398,7 +1392,27 @@ typedef struct AVCodecContext {
* - decoding: set by lavc, user can override * - decoding: set by lavc, user can override
*/ */
int (*reget_buffer)(struct AVCodecContext *c, AVFrame *pic); int (*reget_buffer)(struct AVCodecContext *c, AVFrame *pic);
/**
* number of bits which should be loaded into the rc buffer before decoding starts
* - encoding: set by user.
* - decoding: unused
*/
int rc_initial_buffer_occupancy;
/**
*
* - encoding: set by user.
* - decoding: unused
*/
int inter_threshold;
/**
* CODEC_FLAG2_*.
* - encoding: set by user.
* - decoding: set by user.
*/
int flags2;
} AVCodecContext; } AVCodecContext;
......
...@@ -202,8 +202,6 @@ void h263_encode_picture_header(MpegEncContext * s, int picture_number) ...@@ -202,8 +202,6 @@ void h263_encode_picture_header(MpegEncContext * s, int picture_number)
/* Update the pointer to last GOB */ /* Update the pointer to last GOB */
s->ptr_lastgob = pbBufPtr(&s->pb); s->ptr_lastgob = pbBufPtr(&s->pb);
s->gob_number = 0;
put_bits(&s->pb, 22, 0x20); /* PSC */ put_bits(&s->pb, 22, 0x20); /* PSC */
put_bits(&s->pb, 8, (((int64_t)s->picture_number * 30 * s->avctx->frame_rate_base) / put_bits(&s->pb, 8, (((int64_t)s->picture_number * 30 * s->avctx->frame_rate_base) /
s->avctx->frame_rate) & 0xff); s->avctx->frame_rate) & 0xff);
...@@ -239,12 +237,12 @@ void h263_encode_picture_header(MpegEncContext * s, int picture_number) ...@@ -239,12 +237,12 @@ void h263_encode_picture_header(MpegEncContext * s, int picture_number)
put_bits(&s->pb, 3, format); put_bits(&s->pb, 3, format);
put_bits(&s->pb,1,0); /* Custom PCF: off */ put_bits(&s->pb,1,0); /* Custom PCF: off */
put_bits(&s->pb, 1, s->umvplus); /* Unrestricted Motion Vector */ put_bits(&s->pb,1, s->umvplus); /* Unrestricted Motion Vector */
put_bits(&s->pb,1,0); /* SAC: off */ put_bits(&s->pb,1,0); /* SAC: off */
put_bits(&s->pb,1,s->obmc); /* Advanced Prediction Mode */ put_bits(&s->pb,1,s->obmc); /* Advanced Prediction Mode */
put_bits(&s->pb,1,s->h263_aic); /* Advanced Intra Coding */ put_bits(&s->pb,1,s->h263_aic); /* Advanced Intra Coding */
put_bits(&s->pb,1,s->loop_filter); /* Deblocking Filter */ put_bits(&s->pb,1,s->loop_filter); /* Deblocking Filter */
put_bits(&s->pb,1,0); /* Slice Structured: off */ put_bits(&s->pb,1,s->h263_slice_structured); /* Slice Structured */
put_bits(&s->pb,1,0); /* Reference Picture Selection: off */ put_bits(&s->pb,1,0); /* Reference Picture Selection: off */
put_bits(&s->pb,1,0); /* Independent Segment Decoding: off */ put_bits(&s->pb,1,0); /* Independent Segment Decoding: off */
put_bits(&s->pb,1,s->alt_inter_vlc); /* Alternative Inter VLC */ put_bits(&s->pb,1,s->alt_inter_vlc); /* Alternative Inter VLC */
...@@ -282,6 +280,8 @@ void h263_encode_picture_header(MpegEncContext * s, int picture_number) ...@@ -282,6 +280,8 @@ void h263_encode_picture_header(MpegEncContext * s, int picture_number)
// put_bits(&s->pb,1,1); /* Limited according tables of Annex D */ // put_bits(&s->pb,1,1); /* Limited according tables of Annex D */
//FIXME check actual requested range //FIXME check actual requested range
put_bits(&s->pb,2,1); /* unlimited */ put_bits(&s->pb,2,1); /* unlimited */
if(s->h263_slice_structured)
put_bits(&s->pb,2,0); /* no weird submodes */
put_bits(&s->pb, 5, s->qscale); put_bits(&s->pb, 5, s->qscale);
} }
...@@ -300,22 +300,27 @@ void h263_encode_picture_header(MpegEncContext * s, int picture_number) ...@@ -300,22 +300,27 @@ void h263_encode_picture_header(MpegEncContext * s, int picture_number)
/** /**
* Encodes a group of blocks header. * Encodes a group of blocks header.
*/ */
int h263_encode_gob_header(MpegEncContext * s, int mb_line) void h263_encode_gob_header(MpegEncContext * s, int mb_line)
{ {
align_put_bits(&s->pb); put_bits(&s->pb, 17, 1); /* GBSC */
flush_put_bits(&s->pb);
/* Call the RTP callback to send the last GOB */ if(s->h263_slice_structured){
if (s->rtp_callback) { put_bits(&s->pb, 1, 1);
int pdif = pbBufPtr(&s->pb) - s->ptr_lastgob;
s->rtp_callback(s->ptr_lastgob, pdif, s->gob_number); ff_h263_encode_mba(s);
}
put_bits(&s->pb, 17, 1); /* GBSC */ if(s->mb_num > 1583)
s->gob_number = mb_line / s->gob_index; put_bits(&s->pb, 1, 1);
put_bits(&s->pb, 5, s->gob_number); /* GN */ put_bits(&s->pb, 5, s->qscale); /* GQUANT */
put_bits(&s->pb, 2, s->pict_type == I_TYPE); /* GFID */ put_bits(&s->pb, 1, 1);
put_bits(&s->pb, 5, s->qscale); /* GQUANT */ put_bits(&s->pb, 2, s->pict_type == I_TYPE); /* GFID */
//fprintf(stderr,"\nGOB: %2d size: %d", s->gob_number - 1, pdif); }else{
return 0; int gob_number= mb_line / s->gob_index;
put_bits(&s->pb, 5, gob_number); /* GN */
put_bits(&s->pb, 2, s->pict_type == I_TYPE); /* GFID */
put_bits(&s->pb, 5, s->qscale); /* GQUANT */
}
} }
static inline int get_block_rate(MpegEncContext * s, DCTELEM block[64], int block_last_index, uint8_t scantable[64]){ static inline int get_block_rate(MpegEncContext * s, DCTELEM block[64], int block_last_index, uint8_t scantable[64]){
...@@ -2784,13 +2789,38 @@ int ff_h263_get_gob_height(MpegEncContext *s){ ...@@ -2784,13 +2789,38 @@ int ff_h263_get_gob_height(MpegEncContext *s){
return 4; return 4;
} }
int ff_h263_decode_mba(MpegEncContext *s)
{
int i, mb_pos;
for(i=0; i<6; i++){
if(s->mb_num < ff_mba_max[i]) break;
}
mb_pos= get_bits(&s->gb, ff_mba_length[i]);
s->mb_x= mb_pos % s->mb_width;
s->mb_y= mb_pos / s->mb_width;
return mb_pos;
}
void ff_h263_encode_mba(MpegEncContext *s)
{
int i, mb_pos;
for(i=0; i<6; i++){
if(s->mb_num < ff_mba_max[i]) break;
}
mb_pos= s->mb_x + s->mb_width*s->mb_y;
put_bits(&s->pb, ff_mba_length[i], mb_pos);
}
/** /**
* decodes the group of blocks header. * decodes the group of blocks header or slice header.
* @return <0 if an error occured * @return <0 if an error occured
*/ */
static int h263_decode_gob_header(MpegEncContext *s) static int h263_decode_gob_header(MpegEncContext *s)
{ {
unsigned int val, gfid; unsigned int val, gfid, gob_number;
int left; int left;
/* Check for GOB Start Code */ /* Check for GOB Start Code */
...@@ -2808,22 +2838,34 @@ static int h263_decode_gob_header(MpegEncContext *s) ...@@ -2808,22 +2838,34 @@ static int h263_decode_gob_header(MpegEncContext *s)
if(left<=13) if(left<=13)
return -1; return -1;
#ifdef DEBUG if(s->h263_slice_structured){
fprintf(stderr,"\nGOB Start Code at MB %d\n", (s->mb_y * s->mb_width) + s->mb_x); if(get_bits1(&s->gb)==0)
#endif return -1;
s->gob_number = get_bits(&s->gb, 5); /* GN */
gfid = get_bits(&s->gb, 2); /* GFID */
s->qscale = get_bits(&s->gb, 5); /* GQUANT */
if(s->qscale==0)
return -1;
s->mb_x= 0; ff_h263_decode_mba(s);
s->mb_y= s->gob_index* s->gob_number;
if(s->mb_num > 1583)
if(get_bits1(&s->gb)==0)
return -1;
s->qscale = get_bits(&s->gb, 5); /* SQUANT */
if(get_bits1(&s->gb)==0)
return -1;
gfid = get_bits(&s->gb, 2); /* GFID */
}else{
gob_number = get_bits(&s->gb, 5); /* GN */
s->mb_x= 0;
s->mb_y= s->gob_index* gob_number;
gfid = get_bits(&s->gb, 2); /* GFID */
s->qscale = get_bits(&s->gb, 5); /* GQUANT */
}
if(s->mb_y >= s->mb_height) if(s->mb_y >= s->mb_height)
return -1; return -1;
#ifdef DEBUG
fprintf(stderr, "\nGN: %u GFID: %u Quant: %u\n", s->gob_number, gfid, s->qscale); if(s->qscale==0)
#endif return -1;
return 0; return 0;
} }
...@@ -2889,7 +2931,6 @@ void ff_mpeg4_encode_video_packet_header(MpegEncContext *s) ...@@ -2889,7 +2931,6 @@ void ff_mpeg4_encode_video_packet_header(MpegEncContext *s)
{ {
int mb_num_bits= av_log2(s->mb_num - 1) + 1; int mb_num_bits= av_log2(s->mb_num - 1) + 1;
ff_mpeg4_stuffing(&s->pb);
put_bits(&s->pb, ff_mpeg4_get_video_packet_prefix_length(s), 0); put_bits(&s->pb, ff_mpeg4_get_video_packet_prefix_length(s), 0);
put_bits(&s->pb, 1, 1); put_bits(&s->pb, 1, 1);
...@@ -4759,9 +4800,6 @@ int h263_decode_picture_header(MpegEncContext *s) ...@@ -4759,9 +4800,6 @@ int h263_decode_picture_header(MpegEncContext *s)
skip_bits1(&s->gb); /* camera off */ skip_bits1(&s->gb); /* camera off */
skip_bits1(&s->gb); /* freeze picture release off */ skip_bits1(&s->gb); /* freeze picture release off */
/* Reset GOB number */
s->gob_number = 0;
format = get_bits(&s->gb, 3); format = get_bits(&s->gb, 3);
/* /*
0 forbidden 0 forbidden
...@@ -4820,9 +4858,7 @@ int h263_decode_picture_header(MpegEncContext *s) ...@@ -4820,9 +4858,7 @@ int h263_decode_picture_header(MpegEncContext *s)
s->loop_filter= get_bits1(&s->gb); s->loop_filter= get_bits1(&s->gb);
s->unrestricted_mv = s->umvplus || s->obmc || s->loop_filter; s->unrestricted_mv = s->umvplus || s->obmc || s->loop_filter;
if (get_bits1(&s->gb) != 0) { s->h263_slice_structured= get_bits1(&s->gb);
av_log(s->avctx, AV_LOG_ERROR, "Slice Structured not supported\n");
}
if (get_bits1(&s->gb) != 0) { if (get_bits1(&s->gb) != 0) {
av_log(s->avctx, AV_LOG_ERROR, "Reference Picture Selection not supported\n"); av_log(s->avctx, AV_LOG_ERROR, "Reference Picture Selection not supported\n");
} }
...@@ -4894,6 +4930,14 @@ int h263_decode_picture_header(MpegEncContext *s) ...@@ -4894,6 +4930,14 @@ int h263_decode_picture_header(MpegEncContext *s)
if(get_bits1(&s->gb)==0) /* Unlimited Unrestricted Motion Vectors Indicator (UUI) */ if(get_bits1(&s->gb)==0) /* Unlimited Unrestricted Motion Vectors Indicator (UUI) */
skip_bits1(&s->gb); skip_bits1(&s->gb);
} }
if(s->h263_slice_structured){
if (get_bits1(&s->gb) != 0) {
av_log(s->avctx, AV_LOG_ERROR, "rectangular slices not supported\n");
}
if (get_bits1(&s->gb) != 0) {
av_log(s->avctx, AV_LOG_ERROR, "unordered slices not supported\n");
}
}
} }
s->qscale = get_bits(&s->gb, 5); s->qscale = get_bits(&s->gb, 5);
...@@ -4913,7 +4957,7 @@ int h263_decode_picture_header(MpegEncContext *s) ...@@ -4913,7 +4957,7 @@ int h263_decode_picture_header(MpegEncContext *s)
} }
if(s->avctx->debug&FF_DEBUG_PICT_INFO){ if(s->avctx->debug&FF_DEBUG_PICT_INFO){
av_log(s->avctx, AV_LOG_DEBUG, "qp:%d %c size:%d rnd:%d%s%s%s%s%s%s%s%s\n", av_log(s->avctx, AV_LOG_DEBUG, "qp:%d %c size:%d rnd:%d%s%s%s%s%s%s%s%s%s\n",
s->qscale, av_get_pict_type_char(s->pict_type), s->qscale, av_get_pict_type_char(s->pict_type),
s->gb.size_in_bits, 1-s->no_rounding, s->gb.size_in_bits, 1-s->no_rounding,
s->obmc ? " AP" : "", s->obmc ? " AP" : "",
...@@ -4923,7 +4967,8 @@ int h263_decode_picture_header(MpegEncContext *s) ...@@ -4923,7 +4967,8 @@ int h263_decode_picture_header(MpegEncContext *s)
s->h263_aic ? " AIC" : "", s->h263_aic ? " AIC" : "",
s->alt_inter_vlc ? " AIV" : "", s->alt_inter_vlc ? " AIV" : "",
s->modified_quant ? " MQ" : "", s->modified_quant ? " MQ" : "",
s->loop_filter ? " LOOP" : "" s->loop_filter ? " LOOP" : "",
s->h263_slice_structured ? " SS" : ""
); );
} }
#if 1 #if 1
......
...@@ -51,7 +51,6 @@ int ff_h263_decode_init(AVCodecContext *avctx) ...@@ -51,7 +51,6 @@ int ff_h263_decode_init(AVCodecContext *avctx)
/* select sub codec */ /* select sub codec */
switch(avctx->codec->id) { switch(avctx->codec->id) {
case CODEC_ID_H263: case CODEC_ID_H263:
s->gob_number = 0;
s->unrestricted_mv= 0; s->unrestricted_mv= 0;
break; break;
case CODEC_ID_MPEG4: case CODEC_ID_MPEG4:
......
...@@ -39,7 +39,7 @@ static void dct_unquantize_h263_mmx(MpegEncContext *s, ...@@ -39,7 +39,7 @@ static void dct_unquantize_h263_mmx(MpegEncContext *s,
qmul = qscale << 1; qmul = qscale << 1;
qadd = (qscale - 1) | 1; qadd = (qscale - 1) | 1;
assert(s->block_last_index[n]>=0); assert(s->block_last_index[n]>=0 || s->h263_aic);
if (s->mb_intra) { if (s->mb_intra) {
if (!s->h263_aic) { if (!s->h263_aic) {
......
...@@ -648,10 +648,6 @@ int MPV_encode_init(AVCodecContext *avctx) ...@@ -648,10 +648,6 @@ int MPV_encode_init(AVCodecContext *avctx)
avctx->gop_size=600; avctx->gop_size=600;
} }
s->gop_size = avctx->gop_size; s->gop_size = avctx->gop_size;
s->rtp_mode = avctx->rtp_mode;
s->rtp_payload_size = avctx->rtp_payload_size;
if (avctx->rtp_callback)
s->rtp_callback = avctx->rtp_callback;
s->max_qdiff= avctx->max_qdiff; s->max_qdiff= avctx->max_qdiff;
s->qcompress= avctx->qcompress; s->qcompress= avctx->qcompress;
s->qblur= avctx->qblur; s->qblur= avctx->qblur;
...@@ -666,6 +662,7 @@ int MPV_encode_init(AVCodecContext *avctx) ...@@ -666,6 +662,7 @@ int MPV_encode_init(AVCodecContext *avctx)
s->data_partitioning= avctx->flags & CODEC_FLAG_PART; s->data_partitioning= avctx->flags & CODEC_FLAG_PART;
s->quarter_sample= (avctx->flags & CODEC_FLAG_QPEL)!=0; s->quarter_sample= (avctx->flags & CODEC_FLAG_QPEL)!=0;
s->mpeg_quant= avctx->mpeg_quant; s->mpeg_quant= avctx->mpeg_quant;
s->rtp_mode= !!avctx->rtp_payload_size;
if (s->gop_size <= 1) { if (s->gop_size <= 1) {
s->intra_only = 1; s->intra_only = 1;
...@@ -769,8 +766,7 @@ int MPV_encode_init(AVCodecContext *avctx) ...@@ -769,8 +766,7 @@ int MPV_encode_init(AVCodecContext *avctx)
s->out_format = FMT_MPEG1; s->out_format = FMT_MPEG1;
s->low_delay= 0; //s->max_b_frames ? 0 : 1; s->low_delay= 0; //s->max_b_frames ? 0 : 1;
avctx->delay= s->low_delay ? 0 : (s->max_b_frames + 1); avctx->delay= s->low_delay ? 0 : (s->max_b_frames + 1);
s->rtp_mode= 1; // mpeg2 must have slices s->rtp_mode= 1;
if(s->rtp_payload_size == 0) s->rtp_payload_size= 256*256*256;
break; break;
case CODEC_ID_LJPEG: case CODEC_ID_LJPEG:
case CODEC_ID_MJPEG: case CODEC_ID_MJPEG:
...@@ -811,6 +807,7 @@ int MPV_encode_init(AVCodecContext *avctx) ...@@ -811,6 +807,7 @@ int MPV_encode_init(AVCodecContext *avctx)
s->obmc= (avctx->flags & CODEC_FLAG_OBMC) ? 1:0; s->obmc= (avctx->flags & CODEC_FLAG_OBMC) ? 1:0;
s->loop_filter= (avctx->flags & CODEC_FLAG_LOOP_FILTER) ? 1:0; s->loop_filter= (avctx->flags & CODEC_FLAG_LOOP_FILTER) ? 1:0;
s->unrestricted_mv= s->obmc || s->loop_filter || s->umvplus; s->unrestricted_mv= s->obmc || s->loop_filter || s->umvplus;
s->h263_slice_structured= (s->flags & CODEC_FLAG_H263P_SLICE_STRUCT) ? 1:0;
if(s->modified_quant) if(s->modified_quant)
s->chroma_qscale_table= ff_h263_chroma_qscale_table; s->chroma_qscale_table= ff_h263_chroma_qscale_table;
...@@ -3889,53 +3886,64 @@ static void encode_picture(MpegEncContext *s, int picture_number) ...@@ -3889,53 +3886,64 @@ static void encode_picture(MpegEncContext *s, int picture_number)
/* write gob / video packet header */ /* write gob / video packet header */
#ifdef CONFIG_RISKY #ifdef CONFIG_RISKY
if(s->rtp_mode && mb_y + mb_x>0){ if(s->rtp_mode){
int current_packet_size, is_gob_start; int current_packet_size, is_gob_start;
current_packet_size= pbBufPtr(&s->pb) - s->ptr_lastgob; current_packet_size= pbBufPtr(&s->pb) - s->ptr_lastgob;
is_gob_start=0;
if(s->codec_id==CODEC_ID_MPEG4){ is_gob_start= s->avctx->rtp_payload_size && current_packet_size >= s->avctx->rtp_payload_size && mb_y + mb_x>0;
if(current_packet_size >= s->rtp_payload_size){
switch(s->codec_id){
case CODEC_ID_H263:
case CODEC_ID_H263P:
if(!s->h263_slice_structured)
if(s->mb_x || s->mb_y%s->gob_index) is_gob_start=0;
break;
case CODEC_ID_MPEG2VIDEO:
if(s->mb_x==0 && s->mb_y!=0) is_gob_start=1;
case CODEC_ID_MPEG1VIDEO:
if(s->mb_skip_run) is_gob_start=0;
break;
}
if(is_gob_start){
if(s->codec_id==CODEC_ID_MPEG4 && s->partitioned_frame){
ff_mpeg4_merge_partitions(s);
ff_mpeg4_init_partitions(s);
}
if(s->codec_id==CODEC_ID_MPEG4)
ff_mpeg4_stuffing(&s->pb);
if(s->partitioned_frame){ align_put_bits(&s->pb);
ff_mpeg4_merge_partitions(s); // flush_put_bits(&s->pb);
ff_mpeg4_init_partitions(s); current_packet_size= pbBufPtr(&s->pb) - s->ptr_lastgob;
}
if (s->avctx->rtp_callback)
s->avctx->rtp_callback(s->ptr_lastgob, current_packet_size, 0);
switch(s->codec_id){
case CODEC_ID_MPEG4:
ff_mpeg4_encode_video_packet_header(s); ff_mpeg4_encode_video_packet_header(s);
if(s->flags&CODEC_FLAG_PASS1){
int bits= get_bit_count(&s->pb);
s->misc_bits+= bits - s->last_bits;
s->last_bits= bits;
}
ff_mpeg4_clean_buffers(s); ff_mpeg4_clean_buffers(s);
is_gob_start=1; break;
} case CODEC_ID_MPEG1VIDEO:
}else if(s->codec_id==CODEC_ID_MPEG1VIDEO){ case CODEC_ID_MPEG2VIDEO:
if( current_packet_size >= s->rtp_payload_size
&& 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_encode_slice_header(s);
ff_mpeg1_clean_buffers(s); ff_mpeg1_clean_buffers(s);
is_gob_start=1; break;
} case CODEC_ID_H263:
}else{ case CODEC_ID_H263P:
if(current_packet_size >= s->rtp_payload_size
&& s->mb_x==0 && s->mb_y%s->gob_index==0){
h263_encode_gob_header(s, mb_y); h263_encode_gob_header(s, mb_y);
is_gob_start=1; break;
} }
}
if(is_gob_start){ if(s->flags&CODEC_FLAG_PASS1){
int bits= get_bit_count(&s->pb);
s->misc_bits+= bits - s->last_bits;
s->last_bits= bits;
}
s->ptr_lastgob = pbBufPtr(&s->pb); s->ptr_lastgob = pbBufPtr(&s->pb);
s->first_slice_line=1; s->first_slice_line=1;
s->resync_mb_x=mb_x; s->resync_mb_x=mb_x;
...@@ -4256,18 +4264,12 @@ static void encode_picture(MpegEncContext *s, int picture_number) ...@@ -4256,18 +4264,12 @@ static void encode_picture(MpegEncContext *s, int picture_number)
ff_mpeg4_stuffing(&s->pb); ff_mpeg4_stuffing(&s->pb);
#endif #endif
//if (s->gob_number)
// fprintf(stderr,"\nNumber of GOB: %d", s->gob_number);
/* Send the last GOB if RTP */ /* Send the last GOB if RTP */
if (s->rtp_mode) { if (s->avctx->rtp_callback) {
flush_put_bits(&s->pb); flush_put_bits(&s->pb);
pdif = pbBufPtr(&s->pb) - s->ptr_lastgob; pdif = pbBufPtr(&s->pb) - s->ptr_lastgob;
/* Call the RTP callback to send the last GOB */ /* Call the RTP callback to send the last GOB */
if (s->rtp_callback) s->avctx->rtp_callback(s->ptr_lastgob, pdif, 0);
s->rtp_callback(s->ptr_lastgob, pdif, s->gob_number);
s->ptr_lastgob = pbBufPtr(&s->pb);
//fprintf(stderr,"\nGOB: %2d size: %d (last)", s->gob_number, pdif);
} }
} }
......
...@@ -523,17 +523,17 @@ typedef struct MpegEncContext { ...@@ -523,17 +523,17 @@ typedef struct MpegEncContext {
ParseContext parse_context; ParseContext parse_context;
/* H.263 specific */ /* H.263 specific */
int gob_number;
int gob_index; int gob_index;
int obmc; ///< overlapped block motion compensation int obmc; ///< overlapped block motion compensation
/* H.263+ specific */ /* H.263+ specific */
int umvplus; ///< == H263+ && unrestricted_mv int umvplus; ///< == H263+ && unrestricted_mv
int h263_aic; ///< Advanded INTRA Coding (AIC) int h263_aic; ///< Advanded INTRA Coding (AIC)
int h263_aic_dir; ///< AIC direction: 0 = left, 1 = top int h263_aic_dir; ///< AIC direction: 0 = left, 1 = top
int h263_slice_structured;
int alt_inter_vlc; ///< alternative inter vlc int alt_inter_vlc; ///< alternative inter vlc
int modified_quant; int modified_quant;
int loop_filter; int loop_filter;
/* mpeg4 specific */ /* mpeg4 specific */
int time_increment_resolution; int time_increment_resolution;
...@@ -663,12 +663,10 @@ typedef struct MpegEncContext { ...@@ -663,12 +663,10 @@ typedef struct MpegEncContext {
int interlaced_dct; int interlaced_dct;
int first_slice; int first_slice;
int first_field; ///< is 1 for the first field of a field picture 0 otherwise int first_field; ///< is 1 for the first field of a field picture 0 otherwise
/* RTP specific */ /* RTP specific */
/* These are explained on avcodec.h */
int rtp_mode; int rtp_mode;
int rtp_payload_size;
void (*rtp_callback)(void *data, int size, int packet_number);
uint8_t *ptr_lastgob; uint8_t *ptr_lastgob;
int swap_uv;//vcr2 codec is mpeg2 varint with UV swaped int swap_uv;//vcr2 codec is mpeg2 varint with UV swaped
short * pblocks[12]; short * pblocks[12];
...@@ -825,8 +823,6 @@ extern uint8_t ff_mpeg4_c_dc_scale_table[32]; ...@@ -825,8 +823,6 @@ extern uint8_t ff_mpeg4_c_dc_scale_table[32];
extern uint8_t ff_aic_dc_scale_table[32]; extern uint8_t ff_aic_dc_scale_table[32];
extern const int16_t ff_mpeg4_default_intra_matrix[64]; extern const int16_t ff_mpeg4_default_intra_matrix[64];
extern const int16_t ff_mpeg4_default_non_intra_matrix[64]; extern const int16_t ff_mpeg4_default_non_intra_matrix[64];
extern const uint16_t ff_mba_max[6];
extern const uint8_t ff_mba_length[6];
extern const uint8_t ff_h263_chroma_qscale_table[32]; extern const uint8_t ff_h263_chroma_qscale_table[32];
extern const uint8_t ff_h263_loop_filter_strength[32]; extern const uint8_t ff_h263_loop_filter_strength[32];
...@@ -844,7 +840,7 @@ void mpeg4_encode_mb(MpegEncContext *s, ...@@ -844,7 +840,7 @@ void mpeg4_encode_mb(MpegEncContext *s,
int motion_x, int motion_y); int motion_x, int motion_y);
void h263_encode_picture_header(MpegEncContext *s, int picture_number); void h263_encode_picture_header(MpegEncContext *s, int picture_number);
void ff_flv_encode_picture_header(MpegEncContext *s, int picture_number); void ff_flv_encode_picture_header(MpegEncContext *s, int picture_number);
int h263_encode_gob_header(MpegEncContext * s, int mb_line); void h263_encode_gob_header(MpegEncContext * s, int mb_line);
int16_t *h263_pred_motion(MpegEncContext * s, int block, int16_t *h263_pred_motion(MpegEncContext * s, int block,
int *px, int *py); int *px, int *py);
void mpeg4_pred_ac(MpegEncContext * s, DCTELEM *block, int n, void mpeg4_pred_ac(MpegEncContext * s, DCTELEM *block, int n,
...@@ -859,7 +855,8 @@ int ff_mpeg4_decode_picture_header(MpegEncContext * s, GetBitContext *gb); ...@@ -859,7 +855,8 @@ int ff_mpeg4_decode_picture_header(MpegEncContext * s, GetBitContext *gb);
void ff_h263_update_motion_val(MpegEncContext * s); void ff_h263_update_motion_val(MpegEncContext * s);
void ff_h263_loop_filter(MpegEncContext * s); void ff_h263_loop_filter(MpegEncContext * s);
void ff_set_qscale(MpegEncContext * s, int qscale); void ff_set_qscale(MpegEncContext * s, int qscale);
int ff_h263_decode_mba(MpegEncContext *s);
void ff_h263_encode_mba(MpegEncContext *s);
int intel_h263_decode_picture_header(MpegEncContext *s); int intel_h263_decode_picture_header(MpegEncContext *s);
int flv_h263_decode_picture_header(MpegEncContext *s); int flv_h263_decode_picture_header(MpegEncContext *s);
......
...@@ -403,13 +403,8 @@ static int rv20_decode_picture_header(MpegEncContext *s) ...@@ -403,13 +403,8 @@ static int rv20_decode_picture_header(MpegEncContext *s)
} }
} }
// printf("%d %d %d %d %d\n", seq, (int)s->time, (int)s->last_non_b_time, s->pp_time, s->pb_time); // printf("%d %d %d %d %d\n", seq, (int)s->time, (int)s->last_non_b_time, s->pp_time, s->pb_time);
for(i=0; i<6; i++){ ff_h263_decode_mba(s);
if(s->mb_width*s->mb_height < ff_mba_max[i]) break;
}
mb_pos= get_bits(&s->gb, ff_mba_length[i]);
s->mb_x= mb_pos % s->mb_width;
s->mb_y= mb_pos / s->mb_width;
s->no_rounding= get_bits1(&s->gb); s->no_rounding= get_bits1(&s->gb);
s->f_code = 1; s->f_code = 1;
......
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