diff options
author | Andreas Heinchen <heinchen@users.sourceforge.net> | 2003-07-08 12:24:40 +0000 |
---|---|---|
committer | Andreas Heinchen <heinchen@users.sourceforge.net> | 2003-07-08 12:24:40 +0000 |
commit | f5573211522e9938a735755f8aba6da2d8f07d83 (patch) | |
tree | 43dc59b2310e53d4dd5356b6255fd1782a133ed3 | |
parent | 3f731a72bfbdf89d6435e00e7efbefe58cf8d7f3 (diff) | |
download | xine-lib-f5573211522e9938a735755f8aba6da2d8f07d83.tar.gz xine-lib-f5573211522e9938a735755f8aba6da2d8f07d83.tar.bz2 |
added cropping/offset to theoradecoder (patch by Philip Jägenstedt)
CVS patchset: 5135
CVS date: 2003/07/08 12:24:40
-rw-r--r-- | src/libtheora/xine_decoder.c | 52 |
1 files changed, 33 insertions, 19 deletions
diff --git a/src/libtheora/xine_decoder.c b/src/libtheora/xine_decoder.c index 120ba0867..2c4ae609f 100644 --- a/src/libtheora/xine_decoder.c +++ b/src/libtheora/xine_decoder.c @@ -17,7 +17,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA * - * $Id: xine_decoder.c,v 1.10 2003/07/07 19:36:50 heinchen Exp $ + * $Id: xine_decoder.c,v 1.11 2003/07/08 12:24:40 heinchen Exp $ * * xine decoder plugin using libtheora * @@ -63,6 +63,7 @@ typedef struct theora_decoder_s { char* packet; int done; int width, height; + int offset_x, offset_y; int frame_duration; int skipframes; int hp_read; @@ -80,23 +81,29 @@ static void readin_op (theora_decoder_t *this, char* src, int size) { this->done=this->done+size; } -static void yuv2frame(yuv_buffer *yuv, vo_frame_t *frame) { +static void yuv2frame(yuv_buffer *yuv, vo_frame_t *frame, int offset_x, int offset_y) { int i; + int crop_offset; /*fixme - clarify if the frame must be copied or if there is a faster solution like exchanging the pointers*/ - /*copy all 3 parts of the picture*/ - for(i=0;i<yuv->y_height;i++) - xine_fast_memcpy(frame->base[0]+yuv->y_width*i, - yuv->y+yuv->y_stride*i, - yuv->y_width); - for(i=0;i<yuv->uv_height;i++){ - xine_fast_memcpy(frame->base[2]+yuv->uv_width*i, - yuv->v+yuv->uv_stride*i, - yuv->uv_width); - xine_fast_memcpy(frame->base[1]+yuv->uv_width*i, - yuv->u+yuv->uv_stride*i, - yuv->uv_width); + /*copy yuv data onto the frame, respecting offsets*/ + + crop_offset=offset_x+yuv->y_stride*offset_y; + for(i=0;i<frame->height;i++) + xine_fast_memcpy(frame->base[0]+frame->pitches[0]*i, + yuv->y+crop_offset+yuv->y_stride*i, + frame->width); + + crop_offset=(offset_x/2)+(yuv->uv_stride)*(offset_y/2); + for(i=0;i<frame->height/2;i++){ + xine_fast_memcpy(frame->base[1]+frame->pitches[1]*i, + yuv->u+crop_offset+yuv->uv_stride*i, + frame->width/2); + xine_fast_memcpy(frame->base[2]+frame->pitches[2]*i, + yuv->v+crop_offset+yuv->uv_stride*i, + frame->width/2); + } } @@ -169,12 +176,19 @@ static void theora_decode_data (video_decoder_t *this_gen, buf_element_t *buf) { theora_decode_init (&this->t_state, &this->t_info); this->frame_duration=((int64_t)90000*this->t_info.fps_denominator)/this->t_info.fps_numerator; #ifdef LOG - printf("libtheora: theora stream is Theora %dx%d %.02f fps video.\n", + printf("libtheora: theora stream is Theora %dx%d %.02f fps video.\n" + " frame content is %dx%d with offset (%d,%d).\n" + " aspect ratio is %d:%d.\n", this->t_info.width,this->t_info.height, - (double)this->t_info.fps_numerator/this->t_info.fps_denominator); + (double)this->t_info.fps_numerator/this->t_info.fps_denominator, + this->t_info.frame_width, this->t_info.frame_height, + this->t_info.offset_x, this->t_info.offset_y, + this->t_info.aspect_numerator, this->t_info.aspect_denominator); #endif - this->width=this->t_info.width; - this->height=this->t_info.height; + this->width=this->t_info.frame_width; + this->height=this->t_info.frame_height; + this->offset_x=this->t_info.offset_x; + this->offset_y=this->t_info.offset_y; this->initialized=1; this->hp_read++; } @@ -207,7 +221,7 @@ static void theora_decode_data (video_decoder_t *this_gen, buf_element_t *buf) { ASPECT_SQUARE, XINE_IMGFMT_YV12, VO_BOTH_FIELDS); - yuv2frame(&yuv, frame); + yuv2frame(&yuv, frame, this->offset_x, this->offset_y); frame->pts = buf->pts; frame->duration=this->frame_duration; |