Commit 78c19a34 authored by Derk-Jan Hartman's avatar Derk-Jan Hartman

theora: simplify theora's copypicture. All "visible area" logic is now handled...

theora: simplify theora's copypicture. All "visible area" logic is now handled by the core. (including offset).

This fixes display of the 322x242_not-divisible-by-sixteen-framesize.ogg sample of the theora testsuite.
parent 858fa11f
...@@ -305,6 +305,11 @@ static int ProcessHeaders( decoder_t *p_dec ) ...@@ -305,6 +305,11 @@ static int ProcessHeaders( decoder_t *p_dec )
{ {
p_dec->fmt_out.video.i_visible_width = p_sys->ti.frame_width; p_dec->fmt_out.video.i_visible_width = p_sys->ti.frame_width;
p_dec->fmt_out.video.i_visible_height = p_sys->ti.frame_height; p_dec->fmt_out.video.i_visible_height = p_sys->ti.frame_height;
if( p_sys->ti.offset_x || p_sys->ti.offset_y )
{
p_dec->fmt_out.video.i_x_offset = p_sys->ti.offset_x;
p_dec->fmt_out.video.i_y_offset = p_sys->ti.offset_y;
}
} }
if( p_sys->ti.aspect_denominator && p_sys->ti.aspect_numerator ) if( p_sys->ti.aspect_denominator && p_sys->ti.aspect_numerator )
...@@ -554,30 +559,19 @@ static void CloseDecoder( vlc_object_t *p_this ) ...@@ -554,30 +559,19 @@ static void CloseDecoder( vlc_object_t *p_this )
static void theora_CopyPicture( decoder_t *p_dec, picture_t *p_pic, static void theora_CopyPicture( decoder_t *p_dec, picture_t *p_pic,
yuv_buffer *yuv ) yuv_buffer *yuv )
{ {
int i_plane, i_line, i_width, i_dst_stride, i_src_stride; int i_plane, i_line, i_dst_stride, i_src_stride;
int i_src_xoffset, i_src_yoffset;
uint8_t *p_dst, *p_src; uint8_t *p_dst, *p_src;
for( i_plane = 0; i_plane < p_pic->i_planes; i_plane++ ) for( i_plane = 0; i_plane < p_pic->i_planes; i_plane++ )
{ {
p_dst = p_pic->p[i_plane].p_pixels; p_dst = p_pic->p[i_plane].p_pixels;
p_src = i_plane ? (i_plane - 1 ? yuv->v : yuv->u ) : yuv->y; p_src = i_plane ? (i_plane - 1 ? yuv->v : yuv->u ) : yuv->y;
i_width = p_pic->p[i_plane].i_visible_pitch;
i_dst_stride = p_pic->p[i_plane].i_pitch; i_dst_stride = p_pic->p[i_plane].i_pitch;
i_src_stride = i_plane ? yuv->uv_stride : yuv->y_stride; i_src_stride = i_plane ? yuv->uv_stride : yuv->y_stride;
i_src_xoffset = p_dec->p_sys->ti.offset_x;
i_src_yoffset = p_dec->p_sys->ti.offset_y;
if( i_plane )
{
i_src_xoffset /= 2;
i_src_yoffset /= 2;
}
p_src += (i_src_yoffset * i_src_stride + i_src_xoffset);
for( i_line = 0; i_line < p_pic->p[i_plane].i_visible_lines; i_line++ ) for( i_line = 0; i_line < p_pic->p[i_plane].i_lines; i_line++ )
{ {
vlc_memcpy( p_dst, p_src + i_src_xoffset, vlc_memcpy( p_dst, p_src,
i_plane ? yuv->uv_width : yuv->y_width ); i_plane ? yuv->uv_width : yuv->y_width );
p_src += i_src_stride; p_src += i_src_stride;
p_dst += i_dst_stride; p_dst += i_dst_stride;
......
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