@ -1098,7 +1098,8 @@ int ff_find_unused_picture(MpegEncContext *s, int shared)
return - 1 ;
return - 1 ;
}
}
static void update_noise_reduction ( MpegEncContext * s ) {
static void update_noise_reduction ( MpegEncContext * s )
{
int intra , i ;
int intra , i ;
for ( intra = 0 ; intra < 2 ; intra + + ) {
for ( intra = 0 ; intra < 2 ; intra + + ) {
@ -1110,13 +1111,17 @@ static void update_noise_reduction(MpegEncContext *s){
}
}
for ( i = 0 ; i < 64 ; i + + ) {
for ( i = 0 ; i < 64 ; i + + ) {
s - > dct_offset [ intra ] [ i ] = ( s - > avctx - > noise_reduction * s - > dct_count [ intra ] + s - > dct_error_sum [ intra ] [ i ] / 2 ) / ( s - > dct_error_sum [ intra ] [ i ] + 1 ) ;
s - > dct_offset [ intra ] [ i ] = ( s - > avctx - > noise_reduction *
s - > dct_count [ intra ] +
s - > dct_error_sum [ intra ] [ i ] / 2 ) /
( s - > dct_error_sum [ intra ] [ i ] + 1 ) ;
}
}
}
}
}
}
/**
/**
* generic function for encode / decode called after coding / decoding the header and before a frame is coded / decoded
* generic function for encode / decode called after coding / decoding
* the header and before a frame is coded / decoded .
*/
*/
int MPV_frame_start ( MpegEncContext * s , AVCodecContext * avctx )
int MPV_frame_start ( MpegEncContext * s , AVCodecContext * avctx )
{
{
@ -1124,10 +1129,13 @@ int MPV_frame_start(MpegEncContext *s, AVCodecContext *avctx)
Picture * pic ;
Picture * pic ;
s - > mb_skipped = 0 ;
s - > mb_skipped = 0 ;
assert ( s - > last_picture_ptr = = NULL | | s - > out_format ! = FMT_H264 | | s - > codec_id = = CODEC_ID_SVQ3 ) ;
assert ( s - > last_picture_ptr = = NULL | | s - > out_format ! = FMT_H264 | |
s - > codec_id = = CODEC_ID_SVQ3 ) ;
/* mark & release old frames */
/* mark & release old frames */
if ( s - > pict_type ! = AV_PICTURE_TYPE_B & & s - > last_picture_ptr & & s - > last_picture_ptr ! = s - > next_picture_ptr & & s - > last_picture_ptr - > f . data [ 0 ] ) {
if ( s - > pict_type ! = AV_PICTURE_TYPE_B & & s - > last_picture_ptr & &
s - > last_picture_ptr ! = s - > next_picture_ptr & &
s - > last_picture_ptr - > f . data [ 0 ] ) {
if ( s - > out_format ! = FMT_H264 | | s - > codec_id = = CODEC_ID_SVQ3 ) {
if ( s - > out_format ! = FMT_H264 | | s - > codec_id = = CODEC_ID_SVQ3 ) {
if ( s - > last_picture_ptr - > owner2 = = s )
if ( s - > last_picture_ptr - > owner2 = = s )
free_frame_buffer ( s , s - > last_picture_ptr ) ;
free_frame_buffer ( s , s - > last_picture_ptr ) ;
@ -1136,9 +1144,12 @@ int MPV_frame_start(MpegEncContext *s, AVCodecContext *avctx)
/* if (mpeg124/h263) */
/* if (mpeg124/h263) */
if ( ! s - > encoding ) {
if ( ! s - > encoding ) {
for ( i = 0 ; i < s - > picture_count ; i + + ) {
for ( i = 0 ; i < s - > picture_count ; i + + ) {
if ( s - > picture [ i ] . owner2 = = s & & s - > picture [ i ] . f . data [ 0 ] & & & s - > picture [ i ] ! = s - > next_picture_ptr & & s - > picture [ i ] . f . reference ) {
if ( s - > picture [ i ] . owner2 = = s & & s - > picture [ i ] . f . data [ 0 ] & &
& s - > picture [ i ] ! = s - > next_picture_ptr & &
s - > picture [ i ] . f . reference ) {
if ( ! ( avctx - > active_thread_type & FF_THREAD_FRAME ) )
if ( ! ( avctx - > active_thread_type & FF_THREAD_FRAME ) )
av_log ( avctx , AV_LOG_ERROR , " releasing zombie picture \n " ) ;
av_log ( avctx , AV_LOG_ERROR ,
" releasing zombie picture \n " ) ;
free_frame_buffer ( s , & s - > picture [ i ] ) ;
free_frame_buffer ( s , & s - > picture [ i ] ) ;
}
}
}
}
@ -1149,9 +1160,12 @@ int MPV_frame_start(MpegEncContext *s, AVCodecContext *avctx)
if ( ! s - > encoding ) {
if ( ! s - > encoding ) {
ff_release_unused_pictures ( s , 1 ) ;
ff_release_unused_pictures ( s , 1 ) ;
if ( s - > current_picture_ptr & & s - > current_picture_ptr - > f . data [ 0 ] = = NULL )
if ( s - > current_picture_ptr & &
pic = s - > current_picture_ptr ; //we already have a unused image (maybe it was set before reading the header)
s - > current_picture_ptr - > f . data [ 0 ] = = NULL ) {
else {
// we already have a unused image
// (maybe it was set before reading the header)
pic = s - > current_picture_ptr ;
} else {
i = ff_find_unused_picture ( s , 0 ) ;
i = ff_find_unused_picture ( s , 0 ) ;
if ( i < 0 )
if ( i < 0 )
return i ;
return i ;
@ -1174,11 +1188,14 @@ int MPV_frame_start(MpegEncContext *s, AVCodecContext *avctx)
s - > current_picture_ptr = pic ;
s - > current_picture_ptr = pic ;
// FIXME use only the vars from current_pic
// FIXME use only the vars from current_pic
s - > current_picture_ptr - > f . top_field_first = s - > top_field_first ;
s - > current_picture_ptr - > f . top_field_first = s - > top_field_first ;
if ( s - > codec_id = = CODEC_ID_MPEG1VIDEO | | s - > codec_id = = CODEC_ID_MPEG2VIDEO ) {
if ( s - > codec_id = = CODEC_ID_MPEG1VIDEO | |
s - > codec_id = = CODEC_ID_MPEG2VIDEO ) {
if ( s - > picture_structure ! = PICT_FRAME )
if ( s - > picture_structure ! = PICT_FRAME )
s - > current_picture_ptr - > f . top_field_first = ( s - > picture_structure = = PICT_TOP_FIELD ) = = s - > first_field ;
s - > current_picture_ptr - > f . top_field_first =
( s - > picture_structure = = PICT_TOP_FIELD ) = = s - > first_field ;
}
}
s - > current_picture_ptr - > f . interlaced_frame = ! s - > progressive_frame & & ! s - > progressive_sequence ;
s - > current_picture_ptr - > f . interlaced_frame = ! s - > progressive_frame & &
! s - > progressive_sequence ;
s - > current_picture_ptr - > field_picture = s - > picture_structure ! = PICT_FRAME ;
s - > current_picture_ptr - > field_picture = s - > picture_structure ! = PICT_FRAME ;
}
}
@ -1194,19 +1211,24 @@ int MPV_frame_start(MpegEncContext *s, AVCodecContext *avctx)
if ( ! s - > dropable )
if ( ! s - > dropable )
s - > next_picture_ptr = s - > current_picture_ptr ;
s - > next_picture_ptr = s - > current_picture_ptr ;
}
}
/* av_log(s->avctx, AV_LOG_DEBUG, "L%p N%p C%p L%p N%p C%p type:%d drop:%d\n", s->last_picture_ptr, s->next_picture_ptr,s->current_picture_ptr,
/* av_log(s->avctx, AV_LOG_DEBUG, "L%p N%p C%p L%p N%p C%p type:%d drop:%d\n",
s - > last_picture_ptr , s - > next_picture_ptr , s - > current_picture_ptr ,
s - > last_picture_ptr ? s - > last_picture_ptr - > f . data [ 0 ] : NULL ,
s - > last_picture_ptr ? s - > last_picture_ptr - > f . data [ 0 ] : NULL ,
s - > next_picture_ptr ? s - > next_picture_ptr - > f . data [ 0 ] : NULL ,
s - > next_picture_ptr ? s - > next_picture_ptr - > f . data [ 0 ] : NULL ,
s - > current_picture_ptr ? s - > current_picture_ptr - > f . data [ 0 ] : NULL ,
s - > current_picture_ptr ? s - > current_picture_ptr - > f . data [ 0 ] : NULL ,
s - > pict_type , s - > dropable ) ; */
s - > pict_type , s - > dropable ) ; */
if ( s - > codec_id ! = CODEC_ID_H264 ) {
if ( s - > codec_id ! = CODEC_ID_H264 ) {
if ( ( s - > last_picture_ptr = = NULL | | s - > last_picture_ptr - > f . data [ 0 ] = = NULL ) & &
if ( ( s - > last_picture_ptr = = NULL | |
( s - > pict_type ! = AV_PICTURE_TYPE_I | | s - > picture_structure ! = PICT_FRAME ) ) {
s - > last_picture_ptr - > f . data [ 0 ] = = NULL ) & &
( s - > pict_type ! = AV_PICTURE_TYPE_I | |
s - > picture_structure ! = PICT_FRAME ) ) {
if ( s - > pict_type ! = AV_PICTURE_TYPE_I )
if ( s - > pict_type ! = AV_PICTURE_TYPE_I )
av_log ( avctx , AV_LOG_ERROR , " warning: first frame is no keyframe \n " ) ;
av_log ( avctx , AV_LOG_ERROR ,
" warning: first frame is no keyframe \n " ) ;
else if ( s - > picture_structure ! = PICT_FRAME )
else if ( s - > picture_structure ! = PICT_FRAME )
av_log ( avctx , AV_LOG_INFO , " allocate dummy last picture for field based first keyframe \n " ) ;
av_log ( avctx , AV_LOG_INFO ,
" allocate dummy last picture for field based first keyframe \n " ) ;
/* Allocate a dummy frame */
/* Allocate a dummy frame */
i = ff_find_unused_picture ( s , 0 ) ;
i = ff_find_unused_picture ( s , 0 ) ;
@ -1222,10 +1244,14 @@ int MPV_frame_start(MpegEncContext *s, AVCodecContext *avctx)
memset ( s - > last_picture_ptr - > f . data [ 0 ] + s - > last_picture_ptr - > f . linesize [ 0 ] * i , 16 , avctx - > width ) ;
memset ( s - > last_picture_ptr - > f . data [ 0 ] + s - > last_picture_ptr - > f . linesize [ 0 ] * i , 16 , avctx - > width ) ;
}
}
ff_thread_report_progress ( ( AVFrame * ) s - > last_picture_ptr , INT_MAX , 0 ) ;
ff_thread_report_progress ( ( AVFrame * ) s - > last_picture_ptr ,
ff_thread_report_progress ( ( AVFrame * ) s - > last_picture_ptr , INT_MAX , 1 ) ;
INT_MAX , 0 ) ;
ff_thread_report_progress ( ( AVFrame * ) s - > last_picture_ptr ,
INT_MAX , 1 ) ;
}
}
if ( ( s - > next_picture_ptr = = NULL | | s - > next_picture_ptr - > f . data [ 0 ] = = NULL ) & & s - > pict_type = = AV_PICTURE_TYPE_B ) {
if ( ( s - > next_picture_ptr = = NULL | |
s - > next_picture_ptr - > f . data [ 0 ] = = NULL ) & &
s - > pict_type = = AV_PICTURE_TYPE_B ) {
/* Allocate a dummy frame */
/* Allocate a dummy frame */
i = ff_find_unused_picture ( s , 0 ) ;
i = ff_find_unused_picture ( s , 0 ) ;
if ( i < 0 )
if ( i < 0 )
@ -1234,21 +1260,27 @@ int MPV_frame_start(MpegEncContext *s, AVCodecContext *avctx)
s - > next_picture_ptr - > f . key_frame = 0 ;
s - > next_picture_ptr - > f . key_frame = 0 ;
if ( ff_alloc_picture ( s , s - > next_picture_ptr , 0 ) < 0 )
if ( ff_alloc_picture ( s , s - > next_picture_ptr , 0 ) < 0 )
return - 1 ;
return - 1 ;
ff_thread_report_progress ( ( AVFrame * ) s - > next_picture_ptr , INT_MAX , 0 ) ;
ff_thread_report_progress ( ( AVFrame * ) s - > next_picture_ptr ,
ff_thread_report_progress ( ( AVFrame * ) s - > next_picture_ptr , INT_MAX , 1 ) ;
INT_MAX , 0 ) ;
ff_thread_report_progress ( ( AVFrame * ) s - > next_picture_ptr ,
INT_MAX , 1 ) ;
}
}
}
}
if ( s - > last_picture_ptr ) ff_copy_picture ( & s - > last_picture , s - > last_picture_ptr ) ;
if ( s - > last_picture_ptr )
if ( s - > next_picture_ptr ) ff_copy_picture ( & s - > next_picture , s - > next_picture_ptr ) ;
ff_copy_picture ( & s - > last_picture , s - > last_picture_ptr ) ;
if ( s - > next_picture_ptr )
ff_copy_picture ( & s - > next_picture , s - > next_picture_ptr ) ;
assert ( s - > pict_type = = AV_PICTURE_TYPE_I | | ( s - > last_picture_ptr & & s - > last_picture_ptr - > f . data [ 0 ] ) ) ;
assert ( s - > pict_type = = AV_PICTURE_TYPE_I | | ( s - > last_picture_ptr & &
s - > last_picture_ptr - > f . data [ 0 ] ) ) ;
if ( s - > picture_structure ! = PICT_FRAME & & s - > out_format ! = FMT_H264 ) {
if ( s - > picture_structure ! = PICT_FRAME & & s - > out_format ! = FMT_H264 ) {
int i ;
int i ;
for ( i = 0 ; i < 4 ; i + + ) {
for ( i = 0 ; i < 4 ; i + + ) {
if ( s - > picture_structure = = PICT_BOTTOM_FIELD ) {
if ( s - > picture_structure = = PICT_BOTTOM_FIELD ) {
s - > current_picture . f . data [ i ] + = s - > current_picture . f . linesize [ i ] ;
s - > current_picture . f . data [ i ] + =
s - > current_picture . f . linesize [ i ] ;
}
}
s - > current_picture . f . linesize [ i ] * = 2 ;
s - > current_picture . f . linesize [ i ] * = 2 ;
s - > last_picture . f . linesize [ i ] * = 2 ;
s - > last_picture . f . linesize [ i ] * = 2 ;
@ -1258,8 +1290,9 @@ int MPV_frame_start(MpegEncContext *s, AVCodecContext *avctx)
s - > err_recognition = avctx - > err_recognition ;
s - > err_recognition = avctx - > err_recognition ;
/* set dequantizer, we can't do it during init as it might change for mpeg4
/* set dequantizer, we can't do it during init as
and we can ' t do it in the header decode as init is not called for mpeg4 there yet */
* it might change for mpeg4 and we can ' t do it in the header
* decode as init is not called for mpeg4 there yet */
if ( s - > mpeg_quant | | s - > codec_id = = CODEC_ID_MPEG2VIDEO ) {
if ( s - > mpeg_quant | | s - > codec_id = = CODEC_ID_MPEG2VIDEO ) {
s - > dct_unquantize_intra = s - > dct_unquantize_mpeg2_intra ;
s - > dct_unquantize_intra = s - > dct_unquantize_mpeg2_intra ;
s - > dct_unquantize_inter = s - > dct_unquantize_mpeg2_inter ;
s - > dct_unquantize_inter = s - > dct_unquantize_mpeg2_inter ;
@ -1273,7 +1306,6 @@ int MPV_frame_start(MpegEncContext *s, AVCodecContext *avctx)
if ( s - > dct_error_sum ) {
if ( s - > dct_error_sum ) {
assert ( s - > avctx - > noise_reduction & & s - > encoding ) ;
assert ( s - > avctx - > noise_reduction & & s - > encoding ) ;
update_noise_reduction ( s ) ;
update_noise_reduction ( s ) ;
}
}
@ -1283,7 +1315,8 @@ int MPV_frame_start(MpegEncContext *s, AVCodecContext *avctx)
return 0 ;
return 0 ;
}
}
/* generic function for encode/decode called after a frame has been coded/decoded */
/* generic function for encode/decode called after a
* frame has been coded / decoded . */
void MPV_frame_end ( MpegEncContext * s )
void MPV_frame_end ( MpegEncContext * s )
{
{
int i ;
int i ;
@ -1291,24 +1324,27 @@ void MPV_frame_end(MpegEncContext *s)
// just to make sure that all data is rendered.
// just to make sure that all data is rendered.
if ( CONFIG_MPEG_XVMC_DECODER & & s - > avctx - > xvmc_acceleration ) {
if ( CONFIG_MPEG_XVMC_DECODER & & s - > avctx - > xvmc_acceleration ) {
ff_xvmc_field_end ( s ) ;
ff_xvmc_field_end ( s ) ;
} else if ( ( s - > error_count | | s - > encoding | | ! ( s - > avctx - > codec - > capabilities & CODEC_CAP_DRAW_HORIZ_BAND ) )
} else if ( ( s - > error_count | | s - > encoding | | ! ( s - > avctx - > codec - > capabilities & CODEC_CAP_DRAW_HORIZ_BAND ) ) & &
& & ! s - > avctx - > hwaccel
! s - > avctx - > hwaccel & &
& & ! ( s - > avctx - > codec - > capabilities & CODEC_CAP_HWACCEL_VDPAU )
! ( s - > avctx - > codec - > capabilities & CODEC_CAP_HWACCEL_VDPAU ) & &
& & s - > unrestricted_mv
s - > unrestricted_mv & &
& & s - > current_picture . f . reference
s - > current_picture . f . reference & &
& & ! s - > intra_only
! s - > intra_only & &
& & ! ( s - > flags & CODEC_FLAG_EMU_EDGE ) ) {
! ( s - > flags & CODEC_FLAG_EMU_EDGE ) ) {
int hshift = av_pix_fmt_descriptors [ s - > avctx - > pix_fmt ] . log2_chroma_w ;
int hshift = av_pix_fmt_descriptors [ s - > avctx - > pix_fmt ] . log2_chroma_w ;
int vshift = av_pix_fmt_descriptors [ s - > avctx - > pix_fmt ] . log2_chroma_h ;
int vshift = av_pix_fmt_descriptors [ s - > avctx - > pix_fmt ] . log2_chroma_h ;
s - > dsp . draw_edges ( s - > current_picture . f . data [ 0 ] , s - > linesize ,
s - > dsp . draw_edges ( s - > current_picture . f . data [ 0 ] , s - > linesize ,
s - > h_edge_pos , s - > v_edge_pos ,
s - > h_edge_pos , s - > v_edge_pos ,
EDGE_WIDTH , EDGE_WIDTH , EDGE_TOP | EDGE_BOTTOM ) ;
EDGE_WIDTH , EDGE_WIDTH ,
EDGE_TOP | EDGE_BOTTOM ) ;
s - > dsp . draw_edges ( s - > current_picture . f . data [ 1 ] , s - > uvlinesize ,
s - > dsp . draw_edges ( s - > current_picture . f . data [ 1 ] , s - > uvlinesize ,
s - > h_edge_pos > > hshift , s - > v_edge_pos > > vshift ,
s - > h_edge_pos > > hshift , s - > v_edge_pos > > vshift ,
EDGE_WIDTH > > hshift , EDGE_WIDTH > > vshift , EDGE_TOP | EDGE_BOTTOM ) ;
EDGE_WIDTH > > hshift , EDGE_WIDTH > > vshift ,
EDGE_TOP | EDGE_BOTTOM ) ;
s - > dsp . draw_edges ( s - > current_picture . f . data [ 2 ] , s - > uvlinesize ,
s - > dsp . draw_edges ( s - > current_picture . f . data [ 2 ] , s - > uvlinesize ,
s - > h_edge_pos > > hshift , s - > v_edge_pos > > vshift ,
s - > h_edge_pos > > hshift , s - > v_edge_pos > > vshift ,
EDGE_WIDTH > > hshift , EDGE_WIDTH > > vshift , EDGE_TOP | EDGE_BOTTOM ) ;
EDGE_WIDTH > > hshift , EDGE_WIDTH > > vshift ,
EDGE_TOP | EDGE_BOTTOM ) ;
}
}
emms_c ( ) ;
emms_c ( ) ;
@ -1332,7 +1368,8 @@ void MPV_frame_end(MpegEncContext *s)
if ( s - > encoding ) {
if ( s - > encoding ) {
/* release non-reference frames */
/* release non-reference frames */
for ( i = 0 ; i < s - > picture_count ; i + + ) {
for ( i = 0 ; i < s - > picture_count ; i + + ) {
if ( s - > picture [ i ] . f . data [ 0 ] & & ! s - > picture [ i ] . f . reference /*&& s->picture[i].type != FF_BUFFER_TYPE_SHARED*/ ) {
if ( s - > picture [ i ] . f . data [ 0 ] & & ! s - > picture [ i ] . f . reference
/* && s->picture[i].type != FF_BUFFER_TYPE_SHARED */ ) {
free_frame_buffer ( s , & s - > picture [ i ] ) ;
free_frame_buffer ( s , & s - > picture [ i ] ) ;
}
}
}
}
@ -1346,7 +1383,8 @@ void MPV_frame_end(MpegEncContext *s)
s - > avctx - > coded_frame = ( AVFrame * ) s - > current_picture_ptr ;
s - > avctx - > coded_frame = ( AVFrame * ) s - > current_picture_ptr ;
if ( s - > codec_id ! = CODEC_ID_H264 & & s - > current_picture . f . reference ) {
if ( s - > codec_id ! = CODEC_ID_H264 & & s - > current_picture . f . reference ) {
ff_thread_report_progress ( ( AVFrame * ) s - > current_picture_ptr , s - > mb_height - 1 , 0 ) ;
ff_thread_report_progress ( ( AVFrame * ) s - > current_picture_ptr ,
s - > mb_height - 1 , 0 ) ;
}
}
}
}
@ -1357,7 +1395,9 @@ void MPV_frame_end(MpegEncContext *s)
* @ param stride stride / linesize of the image
* @ param stride stride / linesize of the image
* @ param color color of the arrow
* @ param color color of the arrow
*/
*/
static void draw_line ( uint8_t * buf , int sx , int sy , int ex , int ey , int w , int h , int stride , int color ) {
static void draw_line ( uint8_t * buf , int sx , int sy , int ex , int ey ,
int w , int h , int stride , int color )
{
int x , y , fr , f ;
int x , y , fr , f ;
sx = av_clip ( sx , 0 , w - 1 ) ;
sx = av_clip ( sx , 0 , w - 1 ) ;
@ -1388,8 +1428,10 @@ static void draw_line(uint8_t *buf, int sx, int sy, int ex, int ey, int w, int h
}
}
buf + = sx + sy * stride ;
buf + = sx + sy * stride ;
ey - = sy ;
ey - = sy ;
if ( ey ) f = ( ( ex - sx ) < < 16 ) / ey ;
if ( ey )
else f = 0 ;
f = ( ( ex - sx ) < < 16 ) / ey ;
else
f = 0 ;
for ( y = 0 ; y < = ey ; y + + ) {
for ( y = 0 ; y < = ey ; y + + ) {
x = ( y * f ) > > 16 ;
x = ( y * f ) > > 16 ;
fr = ( y * f ) & 0xFFFF ;
fr = ( y * f ) & 0xFFFF ;
@ -1406,7 +1448,9 @@ static void draw_line(uint8_t *buf, int sx, int sy, int ex, int ey, int w, int h
* @ param stride stride / linesize of the image
* @ param stride stride / linesize of the image
* @ param color color of the arrow
* @ param color color of the arrow
*/
*/
static void draw_arrow ( uint8_t * buf , int sx , int sy , int ex , int ey , int w , int h , int stride , int color ) {
static void draw_arrow ( uint8_t * buf , int sx , int sy , int ex ,
int ey , int w , int h , int stride , int color )
{
int dx , dy ;
int dx , dy ;
sx = av_clip ( sx , - 100 , w + 100 ) ;
sx = av_clip ( sx , - 100 , w + 100 ) ;
@ -1433,11 +1477,12 @@ static void draw_arrow(uint8_t *buf, int sx, int sy, int ex, int ey, int w, int
}
}
/**
/**
* Print debuging info for the given picture .
* Print debugg ing info for the given picture .
*/
*/
void ff_print_debug_info ( MpegEncContext * s , AVFrame * pict ) {
void ff_print_debug_info ( MpegEncContext * s , AVFrame * pict )
{
if ( s - > avctx - > hwaccel | | ! pict | | ! pict - > mb_type ) return ;
if ( s - > avctx - > hwaccel | | ! pict | | ! pict - > mb_type )
return ;
if ( s - > avctx - > debug & ( FF_DEBUG_SKIP | FF_DEBUG_QP | FF_DEBUG_MB_TYPE ) ) {
if ( s - > avctx - > debug & ( FF_DEBUG_SKIP | FF_DEBUG_QP | FF_DEBUG_MB_TYPE ) ) {
int x , y ;
int x , y ;
@ -1448,11 +1493,13 @@ void ff_print_debug_info(MpegEncContext *s, AVFrame *pict){
for ( x = 0 ; x < s - > mb_width ; x + + ) {
for ( x = 0 ; x < s - > mb_width ; x + + ) {
if ( s - > avctx - > debug & FF_DEBUG_SKIP ) {
if ( s - > avctx - > debug & FF_DEBUG_SKIP ) {
int count = s - > mbskip_table [ x + y * s - > mb_stride ] ;
int count = s - > mbskip_table [ x + y * s - > mb_stride ] ;
if ( count > 9 ) count = 9 ;
if ( count > 9 )
count = 9 ;
av_log ( s - > avctx , AV_LOG_DEBUG , " %1d " , count ) ;
av_log ( s - > avctx , AV_LOG_DEBUG , " %1d " , count ) ;
}
}
if ( s - > avctx - > debug & FF_DEBUG_QP ) {
if ( s - > avctx - > debug & FF_DEBUG_QP ) {
av_log ( s - > avctx , AV_LOG_DEBUG , " %2d " , pict - > qscale_table [ x + y * s - > mb_stride ] ) ;
av_log ( s - > avctx , AV_LOG_DEBUG , " %2d " ,
pict - > qscale_table [ x + y * s - > mb_stride ] ) ;
}
}
if ( s - > avctx - > debug & FF_DEBUG_MB_TYPE ) {
if ( s - > avctx - > debug & FF_DEBUG_MB_TYPE ) {
int mb_type = pict - > mb_type [ x + y * s - > mb_stride ] ;
int mb_type = pict - > mb_type [ x + y * s - > mb_stride ] ;
@ -1509,7 +1556,7 @@ void ff_print_debug_info(MpegEncContext *s, AVFrame *pict){
}
}
if ( ( s - > avctx - > debug & ( FF_DEBUG_VIS_QP | FF_DEBUG_VIS_MB_TYPE ) ) | |
if ( ( s - > avctx - > debug & ( FF_DEBUG_VIS_QP | FF_DEBUG_VIS_MB_TYPE ) ) | |
s - > avctx - > debug_mv ) {
( s - > avctx - > debug_mv ) ) {
const int shift = 1 + s - > quarter_sample ;
const int shift = 1 + s - > quarter_sample ;
int mb_y ;
int mb_y ;
uint8_t * ptr ;
uint8_t * ptr ;
@ -1518,12 +1565,16 @@ void ff_print_debug_info(MpegEncContext *s, AVFrame *pict){
const int width = s - > avctx - > width ;
const int width = s - > avctx - > width ;
const int height = s - > avctx - > height ;
const int height = s - > avctx - > height ;
const int mv_sample_log2 = 4 - pict - > motion_subsample_log2 ;
const int mv_sample_log2 = 4 - pict - > motion_subsample_log2 ;
const int mv_stride = ( s - > mb_width < < mv_sample_log2 ) + ( s - > codec_id = = CODEC_ID_H264 ? 0 : 1 ) ;
const int mv_stride = ( s - > mb_width < < mv_sample_log2 ) +
( s - > codec_id = = CODEC_ID_H264 ? 0 : 1 ) ;
s - > low_delay = 0 ; // needed to see the vectors without trashing the buffers
s - > low_delay = 0 ; // needed to see the vectors without trashing the buffers
avcodec_get_chroma_sub_sample ( s - > avctx - > pix_fmt , & h_chroma_shift , & v_chroma_shift ) ;
avcodec_get_chroma_sub_sample ( s - > avctx - > pix_fmt ,
& h_chroma_shift , & v_chroma_shift ) ;
for ( i = 0 ; i < 3 ; i + + ) {
for ( i = 0 ; i < 3 ; i + + ) {
memcpy ( s - > visualization_buffer [ i ] , pict - > data [ i ] , ( i = = 0 ) ? pict - > linesize [ i ] * height : pict - > linesize [ i ] * height > > v_chroma_shift ) ;
memcpy ( s - > visualization_buffer [ i ] , pict - > data [ i ] ,
( i = = 0 ) ? pict - > linesize [ i ] * height :
pict - > linesize [ i ] * height > > v_chroma_shift ) ;
pict - > data [ i ] = s - > visualization_buffer [ i ] ;
pict - > data [ i ] = s - > visualization_buffer [ i ] ;
}
}
pict - > type = FF_BUFFER_TYPE_COPY ;
pict - > type = FF_BUFFER_TYPE_COPY ;
@ -1535,20 +1586,26 @@ void ff_print_debug_info(MpegEncContext *s, AVFrame *pict){
int mb_x ;
int mb_x ;
for ( mb_x = 0 ; mb_x < s - > mb_width ; mb_x + + ) {
for ( mb_x = 0 ; mb_x < s - > mb_width ; mb_x + + ) {
const int mb_index = mb_x + mb_y * s - > mb_stride ;
const int mb_index = mb_x + mb_y * s - > mb_stride ;
if ( s - > avctx - > debug_mv & & pict - > motion_val ) {
if ( ( s - > avctx - > debug_mv ) & & pict - > motion_val ) {
int type ;
int type ;
for ( type = 0 ; type < 3 ; type + + ) {
for ( type = 0 ; type < 3 ; type + + ) {
int direction = 0 ;
int direction = 0 ;
switch ( type ) {
switch ( type ) {
case 0 : if ( ( ! ( s - > avctx - > debug_mv & FF_DEBUG_VIS_MV_P_FOR ) ) | | ( pict - > pict_type ! = AV_PICTURE_TYPE_P ) )
case 0 :
if ( ( ! ( s - > avctx - > debug_mv & FF_DEBUG_VIS_MV_P_FOR ) ) | |
( pict - > pict_type ! = AV_PICTURE_TYPE_P ) )
continue ;
continue ;
direction = 0 ;
direction = 0 ;
break ;
break ;
case 1 : if ( ( ! ( s - > avctx - > debug_mv & FF_DEBUG_VIS_MV_B_FOR ) ) | | ( pict - > pict_type ! = AV_PICTURE_TYPE_B ) )
case 1 :
if ( ( ! ( s - > avctx - > debug_mv & FF_DEBUG_VIS_MV_B_FOR ) ) | |
( pict - > pict_type ! = AV_PICTURE_TYPE_B ) )
continue ;
continue ;
direction = 0 ;
direction = 0 ;
break ;
break ;
case 2 : if ( ( ! ( s - > avctx - > debug_mv & FF_DEBUG_VIS_MV_B_BACK ) ) | | ( pict - > pict_type ! = AV_PICTURE_TYPE_B ) )
case 2 :
if ( ( ! ( s - > avctx - > debug_mv & FF_DEBUG_VIS_MV_B_BACK ) ) | |
( pict - > pict_type ! = AV_PICTURE_TYPE_B ) )
continue ;
continue ;
direction = 1 ;
direction = 1 ;
break ;
break ;
@ -1561,10 +1618,12 @@ void ff_print_debug_info(MpegEncContext *s, AVFrame *pict){
for ( i = 0 ; i < 4 ; i + + ) {
for ( i = 0 ; i < 4 ; i + + ) {
int sx = mb_x * 16 + 4 + 8 * ( i & 1 ) ;
int sx = mb_x * 16 + 4 + 8 * ( i & 1 ) ;
int sy = mb_y * 16 + 4 + 8 * ( i > > 1 ) ;
int sy = mb_y * 16 + 4 + 8 * ( i > > 1 ) ;
int xy = ( mb_x * 2 + ( i & 1 ) + ( mb_y * 2 + ( i > > 1 ) ) * mv_stride ) < < ( mv_sample_log2 - 1 ) ;
int xy = ( mb_x * 2 + ( i & 1 ) +
( mb_y * 2 + ( i > > 1 ) ) * mv_stride ) < < ( mv_sample_log2 - 1 ) ;
int mx = ( pict - > motion_val [ direction ] [ xy ] [ 0 ] > > shift ) + sx ;
int mx = ( pict - > motion_val [ direction ] [ xy ] [ 0 ] > > shift ) + sx ;
int my = ( pict - > motion_val [ direction ] [ xy ] [ 1 ] > > shift ) + sy ;
int my = ( pict - > motion_val [ direction ] [ xy ] [ 1 ] > > shift ) + sy ;
draw_arrow ( ptr , sx , sy , mx , my , width , height , s - > linesize , 100 ) ;
draw_arrow ( ptr , sx , sy , mx , my , width ,
height , s - > linesize , 100 ) ;
}
}
} else if ( IS_16X8 ( pict - > mb_type [ mb_index ] ) ) {
} else if ( IS_16X8 ( pict - > mb_type [ mb_index ] ) ) {
int i ;
int i ;
@ -1578,7 +1637,8 @@ void ff_print_debug_info(MpegEncContext *s, AVFrame *pict){
if ( IS_INTERLACED ( pict - > mb_type [ mb_index ] ) )
if ( IS_INTERLACED ( pict - > mb_type [ mb_index ] ) )
my * = 2 ;
my * = 2 ;
draw_arrow ( ptr , sx , sy , mx + sx , my + sy , width , height , s - > linesize , 100 ) ;
draw_arrow ( ptr , sx , sy , mx + sx , my + sy , width ,
height , s - > linesize , 100 ) ;
}
}
} else if ( IS_8X16 ( pict - > mb_type [ mb_index ] ) ) {
} else if ( IS_8X16 ( pict - > mb_type [ mb_index ] ) ) {
int i ;
int i ;
@ -1586,13 +1646,14 @@ void ff_print_debug_info(MpegEncContext *s, AVFrame *pict){
int sx = mb_x * 16 + 4 + 8 * i ;
int sx = mb_x * 16 + 4 + 8 * i ;
int sy = mb_y * 16 + 8 ;
int sy = mb_y * 16 + 8 ;
int xy = ( mb_x * 2 + i + mb_y * 2 * mv_stride ) < < ( mv_sample_log2 - 1 ) ;
int xy = ( mb_x * 2 + i + mb_y * 2 * mv_stride ) < < ( mv_sample_log2 - 1 ) ;
int mx = ( pict - > motion_val [ direction ] [ xy ] [ 0 ] > > shift ) ;
int mx = pict - > motion_val [ direction ] [ xy ] [ 0 ] > > shift ;
int my = ( pict - > motion_val [ direction ] [ xy ] [ 1 ] > > shift ) ;
int my = pict - > motion_val [ direction ] [ xy ] [ 1 ] > > shift ;
if ( IS_INTERLACED ( pict - > mb_type [ mb_index ] ) )
if ( IS_INTERLACED ( pict - > mb_type [ mb_index ] ) )
my * = 2 ;
my * = 2 ;
draw_arrow ( ptr , sx , sy , mx + sx , my + sy , width , height , s - > linesize , 100 ) ;
draw_arrow ( ptr , sx , sy , mx + sx , my + sy , width ,
height , s - > linesize , 100 ) ;
}
}
} else {
} else {
int sx = mb_x * 16 + 8 ;
int sx = mb_x * 16 + 8 ;
@ -1605,14 +1666,20 @@ void ff_print_debug_info(MpegEncContext *s, AVFrame *pict){
}
}
}
}
if ( ( s - > avctx - > debug & FF_DEBUG_VIS_QP ) & & pict - > motion_val ) {
if ( ( s - > avctx - > debug & FF_DEBUG_VIS_QP ) & & pict - > motion_val ) {
uint64_t c = ( pict - > qscale_table [ mb_index ] * 128 / 31 ) * 0x0101010101010101ULL ;
uint64_t c = ( pict - > qscale_table [ mb_index ] * 128 / 31 ) *
0x0101010101010101ULL ;
int y ;
int y ;
for ( y = 0 ; y < block_height ; y + + ) {
for ( y = 0 ; y < block_height ; y + + ) {
* ( uint64_t * ) ( pict - > data [ 1 ] + 8 * mb_x + ( block_height * mb_y + y ) * pict - > linesize [ 1 ] ) = c ;
* ( uint64_t * ) ( pict - > data [ 1 ] + 8 * mb_x +
* ( uint64_t * ) ( pict - > data [ 2 ] + 8 * mb_x + ( block_height * mb_y + y ) * pict - > linesize [ 2 ] ) = c ;
( block_height * mb_y + y ) *
pict - > linesize [ 1 ] ) = c ;
* ( uint64_t * ) ( pict - > data [ 2 ] + 8 * mb_x +
( block_height * mb_y + y ) *
pict - > linesize [ 2 ] ) = c ;
}
}
}
}
if ( ( s - > avctx - > debug & FF_DEBUG_VIS_MB_TYPE ) & & pict - > motion_val ) {
if ( ( s - > avctx - > debug & FF_DEBUG_VIS_MB_TYPE ) & &
pict - > motion_val ) {
int mb_type = pict - > mb_type [ mb_index ] ;
int mb_type = pict - > mb_type [ mb_index ] ;
uint64_t u , v ;
uint64_t u , v ;
int y ;
int y ;
@ -1624,7 +1691,8 @@ v= (int)(128 + r*sin(theta*3.141592/180));
u = v = 128 ;
u = v = 128 ;
if ( IS_PCM ( mb_type ) ) {
if ( IS_PCM ( mb_type ) ) {
COLOR ( 120 , 48 )
COLOR ( 120 , 48 )
} else if ( ( IS_INTRA ( mb_type ) & & IS_ACPRED ( mb_type ) ) | | IS_INTRA16x16 ( mb_type ) ) {
} else if ( ( IS_INTRA ( mb_type ) & & IS_ACPRED ( mb_type ) ) | |
IS_INTRA16x16 ( mb_type ) ) {
COLOR ( 30 , 48 )
COLOR ( 30 , 48 )
} else if ( IS_INTRA4x4 ( mb_type ) ) {
} else if ( IS_INTRA4x4 ( mb_type ) ) {
COLOR ( 90 , 48 )
COLOR ( 90 , 48 )
@ -1650,36 +1718,45 @@ v= (int)(128 + r*sin(theta*3.141592/180));
u * = 0x0101010101010101ULL ;
u * = 0x0101010101010101ULL ;
v * = 0x0101010101010101ULL ;
v * = 0x0101010101010101ULL ;
for ( y = 0 ; y < block_height ; y + + ) {
for ( y = 0 ; y < block_height ; y + + ) {
* ( uint64_t * ) ( pict - > data [ 1 ] + 8 * mb_x + ( block_height * mb_y + y ) * pict - > linesize [ 1 ] ) = u ;
* ( uint64_t * ) ( pict - > data [ 1 ] + 8 * mb_x +
* ( uint64_t * ) ( pict - > data [ 2 ] + 8 * mb_x + ( block_height * mb_y + y ) * pict - > linesize [ 2 ] ) = v ;
( block_height * mb_y + y ) * pict - > linesize [ 1 ] ) = u ;
* ( uint64_t * ) ( pict - > data [ 2 ] + 8 * mb_x +
( block_height * mb_y + y ) * pict - > linesize [ 2 ] ) = v ;
}
}
// segmentation
// segmentation
if ( IS_8X8 ( mb_type ) | | IS_16X8 ( mb_type ) ) {
if ( IS_8X8 ( mb_type ) | | IS_16X8 ( mb_type ) ) {
* ( uint64_t * ) ( pict - > data [ 0 ] + 16 * mb_x + 0 + ( 16 * mb_y + 8 ) * pict - > linesize [ 0 ] ) ^ = 0x8080808080808080ULL ;
* ( uint64_t * ) ( pict - > data [ 0 ] + 16 * mb_x + 0 +
* ( uint64_t * ) ( pict - > data [ 0 ] + 16 * mb_x + 8 + ( 16 * mb_y + 8 ) * pict - > linesize [ 0 ] ) ^ = 0x8080808080808080ULL ;
( 16 * mb_y + 8 ) * pict - > linesize [ 0 ] ) ^ = 0x8080808080808080ULL ;
* ( uint64_t * ) ( pict - > data [ 0 ] + 16 * mb_x + 8 +
( 16 * mb_y + 8 ) * pict - > linesize [ 0 ] ) ^ = 0x8080808080808080ULL ;
}
}
if ( IS_8X8 ( mb_type ) | | IS_8X16 ( mb_type ) ) {
if ( IS_8X8 ( mb_type ) | | IS_8X16 ( mb_type ) ) {
for ( y = 0 ; y < 16 ; y + + )
for ( y = 0 ; y < 16 ; y + + )
pict - > data [ 0 ] [ 16 * mb_x + 8 + ( 16 * mb_y + y ) * pict - > linesize [ 0 ] ] ^ = 0x80 ;
pict - > data [ 0 ] [ 16 * mb_x + 8 + ( 16 * mb_y + y ) *
pict - > linesize [ 0 ] ] ^ = 0x80 ;
}
}
if ( IS_8X8 ( mb_type ) & & mv_sample_log2 > = 2 ) {
if ( IS_8X8 ( mb_type ) & & mv_sample_log2 > = 2 ) {
int dm = 1 < < ( mv_sample_log2 - 2 ) ;
int dm = 1 < < ( mv_sample_log2 - 2 ) ;
for ( i = 0 ; i < 4 ; i + + ) {
for ( i = 0 ; i < 4 ; i + + ) {
int sx = mb_x * 16 + 8 * ( i & 1 ) ;
int sx = mb_x * 16 + 8 * ( i & 1 ) ;
int sy = mb_y * 16 + 8 * ( i > > 1 ) ;
int sy = mb_y * 16 + 8 * ( i > > 1 ) ;
int xy = ( mb_x * 2 + ( i & 1 ) + ( mb_y * 2 + ( i > > 1 ) ) * mv_stride ) < < ( mv_sample_log2 - 1 ) ;
int xy = ( mb_x * 2 + ( i & 1 ) +
( mb_y * 2 + ( i > > 1 ) ) * mv_stride ) < < ( mv_sample_log2 - 1 ) ;
// FIXME bidir
// FIXME bidir
int32_t * mv = ( int32_t * ) & pict - > motion_val [ 0 ] [ xy ] ;
int32_t * mv = ( int32_t * ) & pict - > motion_val [ 0 ] [ xy ] ;
if ( mv [ 0 ] ! = mv [ dm ] | | mv [ dm * mv_stride ] ! = mv [ dm * ( mv_stride + 1 ) ] )
if ( mv [ 0 ] ! = mv [ dm ] | |
mv [ dm * mv_stride ] ! = mv [ dm * ( mv_stride + 1 ) ] )
for ( y = 0 ; y < 8 ; y + + )
for ( y = 0 ; y < 8 ; y + + )
pict - > data [ 0 ] [ sx + 4 + ( sy + y ) * pict - > linesize [ 0 ] ] ^ = 0x80 ;
pict - > data [ 0 ] [ sx + 4 + ( sy + y ) * pict - > linesize [ 0 ] ] ^ = 0x80 ;
if ( mv [ 0 ] ! = mv [ dm * mv_stride ] | | mv [ dm ] ! = mv [ dm * ( mv_stride + 1 ) ] )
if ( mv [ 0 ] ! = mv [ dm * mv_stride ] | | mv [ dm ] ! = mv [ dm * ( mv_stride + 1 ) ] )
* ( uint64_t * ) ( pict - > data [ 0 ] + sx + ( sy + 4 ) * pict - > linesize [ 0 ] ) ^ = 0x8080808080808080ULL ;
* ( uint64_t * ) ( pict - > data [ 0 ] + sx + ( sy + 4 ) *
pict - > linesize [ 0 ] ) ^ = 0x8080808080808080ULL ;
}
}
}
}
if ( IS_INTERLACED ( mb_type ) & & s - > codec_id = = CODEC_ID_H264 ) {
if ( IS_INTERLACED ( mb_type ) & &
s - > codec_id = = CODEC_ID_H264 ) {
// hmm
// hmm
}
}
}
}
@ -1711,15 +1788,18 @@ static inline int hpel_motion_lowres(MpegEncContext *s,
sx = motion_x & s_mask ;
sx = motion_x & s_mask ;
sy = motion_y & s_mask ;
sy = motion_y & s_mask ;
src_x + = motion_x > > ( lowres + 1 ) ;
src_x + = motion_x > > lowres + 1 ;
src_y + = motion_y > > ( lowres + 1 ) ;
src_y + = motion_y > > lowres + 1 ;
src + = src_y * stride + src_x ;
src + = src_y * stride + src_x ;
if ( ( unsigned ) src_x > h_edge_pos - ( ! ! sx ) - w
if ( ( unsigned ) src_x > h_edge_pos - ( ! ! sx ) - w | |
| | ( unsigned ) src_y > ( v_edge_pos > > field_based ) - ( ! ! sy ) - h ) {
( unsigned ) src_y > ( v_edge_pos > > field_based ) - ( ! ! sy ) - h ) {
s - > dsp . emulated_edge_mc ( s - > edge_emu_buffer , src , s - > linesize , w + 1 , ( h + 1 ) < < field_based ,
s - > dsp . emulated_edge_mc ( s - > edge_emu_buffer , src , s - > linesize , w + 1 ,
src_x , src_y < < field_based , h_edge_pos , v_edge_pos ) ;
( h + 1 ) < < field_based , src_x ,
src_y < < field_based ,
h_edge_pos ,
v_edge_pos ) ;
src = s - > edge_emu_buffer ;
src = s - > edge_emu_buffer ;
emu = 1 ;
emu = 1 ;
}
}
@ -1734,13 +1814,20 @@ static inline int hpel_motion_lowres(MpegEncContext *s,
/* apply one mpeg motion vector to the three components */
/* apply one mpeg motion vector to the three components */
static av_always_inline void mpeg_motion_lowres ( MpegEncContext * s ,
static av_always_inline void mpeg_motion_lowres ( MpegEncContext * s ,
uint8_t * dest_y , uint8_t * dest_cb , uint8_t * dest_cr ,
uint8_t * dest_y ,
int field_based , int bottom_field , int field_select ,
uint8_t * dest_cb ,
uint8_t * * ref_picture , h264_chroma_mc_func * pix_op ,
uint8_t * dest_cr ,
int motion_x , int motion_y , int h , int mb_y )
int field_based ,
int bottom_field ,
int field_select ,
uint8_t * * ref_picture ,
h264_chroma_mc_func * pix_op ,
int motion_x , int motion_y ,
int h , int mb_y )
{
{
uint8_t * ptr_y , * ptr_cb , * ptr_cr ;
uint8_t * ptr_y , * ptr_cb , * ptr_cr ;
int mx , my , src_x , src_y , uvsrc_x , uvsrc_y , uvlinesize , linesize , sx , sy , uvsx , uvsy ;
int mx , my , src_x , src_y , uvsrc_x , uvsrc_y , uvlinesize , linesize , sx , sy ,
uvsx , uvsy ;
const int lowres = s - > avctx - > lowres ;
const int lowres = s - > avctx - > lowres ;
const int op_index = FFMIN ( lowres - 1 + s - > chroma_x_shift , 2 ) ;
const int op_index = FFMIN ( lowres - 1 + s - > chroma_x_shift , 2 ) ;
const int block_s = 8 > > lowres ;
const int block_s = 8 > > lowres ;
@ -1750,7 +1837,8 @@ static av_always_inline void mpeg_motion_lowres(MpegEncContext *s,
linesize = s - > current_picture . f . linesize [ 0 ] < < field_based ;
linesize = s - > current_picture . f . linesize [ 0 ] < < field_based ;
uvlinesize = s - > current_picture . f . linesize [ 1 ] < < field_based ;
uvlinesize = s - > current_picture . f . linesize [ 1 ] < < field_based ;
if ( s - > quarter_sample ) { //FIXME obviously not perfect but qpel will not work in lowres anyway
// FIXME obviously not perfect but qpel will not work in lowres anyway
if ( s - > quarter_sample ) {
motion_x / = 2 ;
motion_x / = 2 ;
motion_y / = 2 ;
motion_y / = 2 ;
}
}
@ -1761,15 +1849,16 @@ static av_always_inline void mpeg_motion_lowres(MpegEncContext *s,
sx = motion_x & s_mask ;
sx = motion_x & s_mask ;
sy = motion_y & s_mask ;
sy = motion_y & s_mask ;
src_x = s - > mb_x * 2 * block_s + ( motion_x > > ( lowres + 1 ) ) ;
src_x = s - > mb_x * 2 * block_s + ( motion_x > > lowres + 1 ) ;
src_y = ( mb_y * 2 * block_s > > field_based ) + ( motion_y > > ( lowres + 1 ) ) ;
src_y = ( mb_y * 2 * block_s > > field_based ) + ( motion_y > > lowres + 1 ) ;
if ( s - > out_format = = FMT_H263 ) {
if ( s - > out_format = = FMT_H263 ) {
uvsx = ( ( motion_x > > 1 ) & s_mask ) | ( sx & 1 ) ;
uvsx = ( ( motion_x > > 1 ) & s_mask ) | ( sx & 1 ) ;
uvsy = ( ( motion_y > > 1 ) & s_mask ) | ( sy & 1 ) ;
uvsy = ( ( motion_y > > 1 ) & s_mask ) | ( sy & 1 ) ;
uvsrc_x = src_x > > 1 ;
uvsrc_x = src_x > > 1 ;
uvsrc_y = src_y > > 1 ;
uvsrc_y = src_y > > 1 ;
} else if ( s - > out_format = = FMT_H261 ) { //even chroma mv's are full pel in H261
} else if ( s - > out_format = = FMT_H261 ) {
// even chroma mv's are full pel in H261
mx = motion_x / 4 ;
mx = motion_x / 4 ;
my = motion_y / 4 ;
my = motion_y / 4 ;
uvsx = ( 2 * mx ) & s_mask ;
uvsx = ( 2 * mx ) & s_mask ;
@ -1782,8 +1871,8 @@ static av_always_inline void mpeg_motion_lowres(MpegEncContext *s,
my = motion_y / 2 ;
my = motion_y / 2 ;
uvsx = mx & s_mask ;
uvsx = mx & s_mask ;
uvsy = my & s_mask ;
uvsy = my & s_mask ;
uvsrc_x = s - > mb_x * block_s + ( mx > > ( lowres + 1 ) ) ;
uvsrc_x = s - > mb_x * block_s + ( mx > > lowres + 1 ) ;
uvsrc_y = ( mb_y * block_s > > field_based ) + ( my > > ( lowres + 1 ) ) ;
uvsrc_y = ( mb_y * block_s > > field_based ) + ( my > > lowres + 1 ) ;
} else {
} else {
if ( s - > chroma_x_shift ) {
if ( s - > chroma_x_shift ) {
//Chroma422
//Chroma422
@ -1806,23 +1895,30 @@ static av_always_inline void mpeg_motion_lowres(MpegEncContext *s,
ptr_cb = ref_picture [ 1 ] + uvsrc_y * uvlinesize + uvsrc_x ;
ptr_cb = ref_picture [ 1 ] + uvsrc_y * uvlinesize + uvsrc_x ;
ptr_cr = ref_picture [ 2 ] + uvsrc_y * uvlinesize + uvsrc_x ;
ptr_cr = ref_picture [ 2 ] + uvsrc_y * uvlinesize + uvsrc_x ;
if ( ( unsigned ) src_x > h_edge_pos - ( ! ! sx ) - 2 * block_s
if ( ( unsigned ) src_x > h_edge_pos - ( ! ! sx ) - 2 * block_s | |
| | ( unsigned ) src_y > ( v_edge_pos > > field_based ) - ( ! ! sy ) - h ) {
( unsigned ) src_y > ( v_edge_pos > > field_based ) - ( ! ! sy ) - h ) {
s - > dsp . emulated_edge_mc ( s - > edge_emu_buffer , ptr_y , s - > linesize , 17 , 17 + field_based ,
s - > dsp . emulated_edge_mc ( s - > edge_emu_buffer , ptr_y ,
src_x , src_y < < field_based , h_edge_pos , v_edge_pos ) ;
s - > linesize , 17 , 17 + field_based ,
src_x , src_y < < field_based , h_edge_pos ,
v_edge_pos ) ;
ptr_y = s - > edge_emu_buffer ;
ptr_y = s - > edge_emu_buffer ;
if ( ! CONFIG_GRAY | | ! ( s - > flags & CODEC_FLAG_GRAY ) ) {
if ( ! CONFIG_GRAY | | ! ( s - > flags & CODEC_FLAG_GRAY ) ) {
uint8_t * uvbuf = s - > edge_emu_buffer + 18 * s - > linesize ;
uint8_t * uvbuf = s - > edge_emu_buffer + 18 * s - > linesize ;
s - > dsp . emulated_edge_mc ( uvbuf , ptr_cb , s - > uvlinesize , 9 , 9 + field_based ,
s - > dsp . emulated_edge_mc ( uvbuf , ptr_cb , s - > uvlinesize , 9 ,
uvsrc_x , uvsrc_y < < field_based , h_edge_pos > > 1 , v_edge_pos > > 1 ) ;
9 + field_based ,
s - > dsp . emulated_edge_mc ( uvbuf + 16 , ptr_cr , s - > uvlinesize , 9 , 9 + field_based ,
uvsrc_x , uvsrc_y < < field_based ,
uvsrc_x , uvsrc_y < < field_based , h_edge_pos > > 1 , v_edge_pos > > 1 ) ;
h_edge_pos > > 1 , v_edge_pos > > 1 ) ;
s - > dsp . emulated_edge_mc ( uvbuf + 16 , ptr_cr , s - > uvlinesize , 9 ,
9 + field_based ,
uvsrc_x , uvsrc_y < < field_based ,
h_edge_pos > > 1 , v_edge_pos > > 1 ) ;
ptr_cb = uvbuf ;
ptr_cb = uvbuf ;
ptr_cr = uvbuf + 16 ;
ptr_cr = uvbuf + 16 ;
}
}
}
}
if ( bottom_field ) { //FIXME use this for field pix too instead of the obnoxious hack which changes picture.f.data
// FIXME use this for field pix too instead of the obnoxious hack which changes picture.f.data
if ( bottom_field ) {
dest_y + = s - > linesize ;
dest_y + = s - > linesize ;
dest_cb + = s - > uvlinesize ;
dest_cb + = s - > uvlinesize ;
dest_cr + = s - > uvlinesize ;
dest_cr + = s - > uvlinesize ;
@ -1853,13 +1949,14 @@ static inline void chroma_4mv_motion_lowres(MpegEncContext *s,
uint8_t * dest_cb , uint8_t * dest_cr ,
uint8_t * dest_cb , uint8_t * dest_cr ,
uint8_t * * ref_picture ,
uint8_t * * ref_picture ,
h264_chroma_mc_func * pix_op ,
h264_chroma_mc_func * pix_op ,
int mx , int my ) {
int mx , int my )
{
const int lowres = s - > avctx - > lowres ;
const int lowres = s - > avctx - > lowres ;
const int op_index = FFMIN ( lowres , 2 ) ;
const int op_index = FFMIN ( lowres , 2 ) ;
const int block_s = 8 > > lowres ;
const int block_s = 8 > > lowres ;
const int s_mask = ( 2 < < lowres ) - 1 ;
const int s_mask = ( 2 < < lowres ) - 1 ;
const int h_edge_pos = s - > h_edge_pos > > ( lowres + 1 ) ;
const int h_edge_pos = s - > h_edge_pos > > lowres + 1 ;
const int v_edge_pos = s - > v_edge_pos > > ( lowres + 1 ) ;
const int v_edge_pos = s - > v_edge_pos > > lowres + 1 ;
int emu = 0 , src_x , src_y , offset , sx , sy ;
int emu = 0 , src_x , src_y , offset , sx , sy ;
uint8_t * ptr ;
uint8_t * ptr ;
@ -1875,15 +1972,16 @@ static inline void chroma_4mv_motion_lowres(MpegEncContext *s,
sx = mx & s_mask ;
sx = mx & s_mask ;
sy = my & s_mask ;
sy = my & s_mask ;
src_x = s - > mb_x * block_s + ( mx > > ( lowres + 1 ) ) ;
src_x = s - > mb_x * block_s + ( mx > > lowres + 1 ) ;
src_y = s - > mb_y * block_s + ( my > > ( lowres + 1 ) ) ;
src_y = s - > mb_y * block_s + ( my > > lowres + 1 ) ;
offset = src_y * s - > uvlinesize + src_x ;
offset = src_y * s - > uvlinesize + src_x ;
ptr = ref_picture [ 1 ] + offset ;
ptr = ref_picture [ 1 ] + offset ;
if ( s - > flags & CODEC_FLAG_EMU_EDGE ) {
if ( s - > flags & CODEC_FLAG_EMU_EDGE ) {
if ( ( unsigned ) src_x > h_edge_pos - ( ! ! sx ) - block_s
if ( ( unsigned ) src_x > h_edge_pos - ( ! ! sx ) - block_s | |
| | ( unsigned ) src_y > v_edge_pos - ( ! ! sy ) - block_s ) {
( unsigned ) src_y > v_edge_pos - ( ! ! sy ) - block_s ) {
s - > dsp . emulated_edge_mc ( s - > edge_emu_buffer , ptr , s - > uvlinesize , 9 , 9 , src_x , src_y , h_edge_pos , v_edge_pos ) ;
s - > dsp . emulated_edge_mc ( s - > edge_emu_buffer , ptr , s - > uvlinesize ,
9 , 9 , src_x , src_y , h_edge_pos , v_edge_pos ) ;
ptr = s - > edge_emu_buffer ;
ptr = s - > edge_emu_buffer ;
emu = 1 ;
emu = 1 ;
}
}
@ -1894,7 +1992,8 @@ static inline void chroma_4mv_motion_lowres(MpegEncContext *s,
ptr = ref_picture [ 2 ] + offset ;
ptr = ref_picture [ 2 ] + offset ;
if ( emu ) {
if ( emu ) {
s - > dsp . emulated_edge_mc ( s - > edge_emu_buffer , ptr , s - > uvlinesize , 9 , 9 , src_x , src_y , h_edge_pos , v_edge_pos ) ;
s - > dsp . emulated_edge_mc ( s - > edge_emu_buffer , ptr , s - > uvlinesize , 9 , 9 ,
src_x , src_y , h_edge_pos , v_edge_pos ) ;
ptr = s - > edge_emu_buffer ;
ptr = s - > edge_emu_buffer ;
}
}
pix_op [ op_index ] ( dest_cr , ptr , s - > uvlinesize , block_s , sx , sy ) ;
pix_op [ op_index ] ( dest_cr , ptr , s - > uvlinesize , block_s , sx , sy ) ;
@ -1912,7 +2011,8 @@ static inline void chroma_4mv_motion_lowres(MpegEncContext *s,
* the motion vectors are taken from s - > mv and the MV type from s - > mv_type
* the motion vectors are taken from s - > mv and the MV type from s - > mv_type
*/
*/
static inline void MPV_motion_lowres ( MpegEncContext * s ,
static inline void MPV_motion_lowres ( MpegEncContext * s ,
uint8_t * dest_y , uint8_t * dest_cb , uint8_t * dest_cr ,
uint8_t * dest_y , uint8_t * dest_cb ,
uint8_t * dest_cr ,
int dir , uint8_t * * ref_picture ,
int dir , uint8_t * * ref_picture ,
h264_chroma_mc_func * pix_op )
h264_chroma_mc_func * pix_op )
{
{
@ -1929,15 +2029,18 @@ static inline void MPV_motion_lowres(MpegEncContext *s,
mpeg_motion_lowres ( s , dest_y , dest_cb , dest_cr ,
mpeg_motion_lowres ( s , dest_y , dest_cb , dest_cr ,
0 , 0 , 0 ,
0 , 0 , 0 ,
ref_picture , pix_op ,
ref_picture , pix_op ,
s - > mv [ dir ] [ 0 ] [ 0 ] , s - > mv [ dir ] [ 0 ] [ 1 ] , 2 * block_s , mb_y ) ;
s - > mv [ dir ] [ 0 ] [ 0 ] , s - > mv [ dir ] [ 0 ] [ 1 ] ,
2 * block_s , mb_y ) ;
break ;
break ;
case MV_TYPE_8X8 :
case MV_TYPE_8X8 :
mx = 0 ;
mx = 0 ;
my = 0 ;
my = 0 ;
for ( i = 0 ; i < 4 ; i + + ) {
for ( i = 0 ; i < 4 ; i + + ) {
hpel_motion_lowres ( s , dest_y + ( ( i & 1 ) + ( i > > 1 ) * s - > linesize ) * block_s ,
hpel_motion_lowres ( s , dest_y + ( ( i & 1 ) + ( i > > 1 ) *
s - > linesize ) * block_s ,
ref_picture [ 0 ] , 0 , 0 ,
ref_picture [ 0 ] , 0 , 0 ,
( 2 * mb_x + ( i & 1 ) ) * block_s , ( 2 * mb_y + ( i > > 1 ) ) * block_s ,
( 2 * mb_x + ( i & 1 ) ) * block_s ,
( 2 * mb_y + ( i > > 1 ) ) * block_s ,
s - > width , s - > height , s - > linesize ,
s - > width , s - > height , s - > linesize ,
s - > h_edge_pos > > lowres , s - > v_edge_pos > > lowres ,
s - > h_edge_pos > > lowres , s - > v_edge_pos > > lowres ,
block_s , block_s , pix_op ,
block_s , block_s , pix_op ,
@ -1948,7 +2051,8 @@ static inline void MPV_motion_lowres(MpegEncContext *s,
}
}
if ( ! CONFIG_GRAY | | ! ( s - > flags & CODEC_FLAG_GRAY ) )
if ( ! CONFIG_GRAY | | ! ( s - > flags & CODEC_FLAG_GRAY ) )
chroma_4mv_motion_lowres ( s , dest_cb , dest_cr , ref_picture , pix_op , mx , my ) ;
chroma_4mv_motion_lowres ( s , dest_cb , dest_cr , ref_picture ,
pix_op , mx , my ) ;
break ;
break ;
case MV_TYPE_FIELD :
case MV_TYPE_FIELD :
if ( s - > picture_structure = = PICT_FRAME ) {
if ( s - > picture_structure = = PICT_FRAME ) {
@ -1956,28 +2060,33 @@ static inline void MPV_motion_lowres(MpegEncContext *s,
mpeg_motion_lowres ( s , dest_y , dest_cb , dest_cr ,
mpeg_motion_lowres ( s , dest_y , dest_cb , dest_cr ,
1 , 0 , s - > field_select [ dir ] [ 0 ] ,
1 , 0 , s - > field_select [ dir ] [ 0 ] ,
ref_picture , pix_op ,
ref_picture , pix_op ,
s - > mv [ dir ] [ 0 ] [ 0 ] , s - > mv [ dir ] [ 0 ] [ 1 ] , block_s , mb_y ) ;
s - > mv [ dir ] [ 0 ] [ 0 ] , s - > mv [ dir ] [ 0 ] [ 1 ] ,
block_s , mb_y ) ;
/* bottom field */
/* bottom field */
mpeg_motion_lowres ( s , dest_y , dest_cb , dest_cr ,
mpeg_motion_lowres ( s , dest_y , dest_cb , dest_cr ,
1 , 1 , s - > field_select [ dir ] [ 1 ] ,
1 , 1 , s - > field_select [ dir ] [ 1 ] ,
ref_picture , pix_op ,
ref_picture , pix_op ,
s - > mv [ dir ] [ 1 ] [ 0 ] , s - > mv [ dir ] [ 1 ] [ 1 ] , block_s , mb_y ) ;
s - > mv [ dir ] [ 1 ] [ 0 ] , s - > mv [ dir ] [ 1 ] [ 1 ] ,
block_s , mb_y ) ;
} else {
} else {
if ( s - > picture_structure ! = s - > field_select [ dir ] [ 0 ] + 1 & & s - > pict_type ! = AV_PICTURE_TYPE_B & & ! s - > first_field ) {
if ( s - > picture_structure ! = s - > field_select [ dir ] [ 0 ] + 1 & &
s - > pict_type ! = AV_PICTURE_TYPE_B & & ! s - > first_field ) {
ref_picture = s - > current_picture_ptr - > f . data ;
ref_picture = s - > current_picture_ptr - > f . data ;
}
}
mpeg_motion_lowres ( s , dest_y , dest_cb , dest_cr ,
mpeg_motion_lowres ( s , dest_y , dest_cb , dest_cr ,
0 , 0 , s - > field_select [ dir ] [ 0 ] ,
0 , 0 , s - > field_select [ dir ] [ 0 ] ,
ref_picture , pix_op ,
ref_picture , pix_op ,
s - > mv [ dir ] [ 0 ] [ 0 ] , s - > mv [ dir ] [ 0 ] [ 1 ] , 2 * block_s , mb_y > > 1 ) ;
s - > mv [ dir ] [ 0 ] [ 0 ] ,
s - > mv [ dir ] [ 0 ] [ 1 ] , 2 * block_s , mb_y > > 1 ) ;
}
}
break ;
break ;
case MV_TYPE_16X8 :
case MV_TYPE_16X8 :
for ( i = 0 ; i < 2 ; i + + ) {
for ( i = 0 ; i < 2 ; i + + ) {
uint8_t * * ref2picture ;
uint8_t * * ref2picture ;
if ( s - > picture_structure = = s - > field_select [ dir ] [ i ] + 1 | | s - > pict_type = = AV_PICTURE_TYPE_B | | s - > first_field ) {
if ( s - > picture_structure = = s - > field_select [ dir ] [ i ] + 1 | |
s - > pict_type = = AV_PICTURE_TYPE_B | | s - > first_field ) {
ref2picture = ref_picture ;
ref2picture = ref_picture ;
} else {
} else {
ref2picture = s - > current_picture_ptr - > f . data ;
ref2picture = s - > current_picture_ptr - > f . data ;
@ -1986,7 +2095,8 @@ static inline void MPV_motion_lowres(MpegEncContext *s,
mpeg_motion_lowres ( s , dest_y , dest_cb , dest_cr ,
mpeg_motion_lowres ( s , dest_y , dest_cb , dest_cr ,
0 , 0 , s - > field_select [ dir ] [ i ] ,
0 , 0 , s - > field_select [ dir ] [ i ] ,
ref2picture , pix_op ,
ref2picture , pix_op ,
s - > mv [ dir ] [ i ] [ 0 ] , s - > mv [ dir ] [ i ] [ 1 ] + 2 * block_s * i , block_s , mb_y > > 1 ) ;
s - > mv [ dir ] [ i ] [ 0 ] , s - > mv [ dir ] [ i ] [ 1 ] +
2 * block_s * i , block_s , mb_y > > 1 ) ;
dest_y + = 2 * block_s * s - > linesize ;
dest_y + = 2 * block_s * s - > linesize ;
dest_cb + = ( 2 * block_s > > s - > chroma_y_shift ) * s - > uvlinesize ;
dest_cb + = ( 2 * block_s > > s - > chroma_y_shift ) * s - > uvlinesize ;
@ -2001,7 +2111,9 @@ static inline void MPV_motion_lowres(MpegEncContext *s,
mpeg_motion_lowres ( s , dest_y , dest_cb , dest_cr ,
mpeg_motion_lowres ( s , dest_y , dest_cb , dest_cr ,
1 , j , j ^ i ,
1 , j , j ^ i ,
ref_picture , pix_op ,
ref_picture , pix_op ,
s - > mv [ dir ] [ 2 * i + j ] [ 0 ] , s - > mv [ dir ] [ 2 * i + j ] [ 1 ] , block_s , mb_y ) ;
s - > mv [ dir ] [ 2 * i + j ] [ 0 ] ,
s - > mv [ dir ] [ 2 * i + j ] [ 1 ] ,
block_s , mb_y ) ;
}
}
pix_op = s - > dsp . avg_h264_chroma_pixels_tab ;
pix_op = s - > dsp . avg_h264_chroma_pixels_tab ;
}
}
@ -2010,19 +2122,22 @@ static inline void MPV_motion_lowres(MpegEncContext *s,
mpeg_motion_lowres ( s , dest_y , dest_cb , dest_cr ,
mpeg_motion_lowres ( s , dest_y , dest_cb , dest_cr ,
0 , 0 , s - > picture_structure ! = i + 1 ,
0 , 0 , s - > picture_structure ! = i + 1 ,
ref_picture , pix_op ,
ref_picture , pix_op ,
s - > mv [ dir ] [ 2 * i ] [ 0 ] , s - > mv [ dir ] [ 2 * i ] [ 1 ] , 2 * block_s , mb_y > > 1 ) ;
s - > mv [ dir ] [ 2 * i ] [ 0 ] , s - > mv [ dir ] [ 2 * i ] [ 1 ] ,
2 * block_s , mb_y > > 1 ) ;
// after put we make avg of the same block
// after put we make avg of the same block
pix_op = s - > dsp . avg_h264_chroma_pixels_tab ;
pix_op = s - > dsp . avg_h264_chroma_pixels_tab ;
//opposite parity is always in the same frame if this is second field
// opposite parity is always in the same
// frame if this is second field
if ( ! s - > first_field ) {
if ( ! s - > first_field ) {
ref_picture = s - > current_picture_ptr - > f . data ;
ref_picture = s - > current_picture_ptr - > f . data ;
}
}
}
}
}
}
break ;
break ;
default : assert ( 0 ) ;
default :
assert ( 0 ) ;
}
}
}
}