-rw-r--r-- | noncore/multimedia/opieplayer2/lib.cpp | 2 | ||||
-rw-r--r-- | noncore/multimedia/opieplayer2/nullvideo.c | 17 | ||||
-rw-r--r-- | noncore/multimedia/opieplayer2/xinevideowidget.cpp | 79 | ||||
-rw-r--r-- | noncore/multimedia/opieplayer2/xinevideowidget.h | 3 |
4 files changed, 49 insertions, 52 deletions
diff --git a/noncore/multimedia/opieplayer2/lib.cpp b/noncore/multimedia/opieplayer2/lib.cpp index aa37cd7..ac5cdd5 100644 --- a/noncore/multimedia/opieplayer2/lib.cpp +++ b/noncore/multimedia/opieplayer2/lib.cpp @@ -183,27 +183,27 @@ bool Lib::isScaling() { return ::null_is_scaling( m_videoOutput ); } void Lib::xine_event_handler( void* user_data, xine_event_t* t ) { ((Lib*)user_data)->handleXineEvent( t ); } void Lib::xine_display_frame( void* user_data, uint8_t *frame, int width, int height, int bytes ) { printf("display x frame"); ((Lib*)user_data)->drawFrame( frame, width, height, bytes ); printf("displayed x frame\n"); } void Lib::drawFrame( uint8_t* frame, int width, int height, int bytes ) { if (!m_video ) { qWarning("not showing video now"); return; } qWarning("called draw frame %d %d", width, height); QSize size = m_wid->size(); int xoffset = (size.width() - width) / 2; int yoffset = (size.height() - height) / 2; int linestep = qt_screen->linestep(); m_wid->setImage( frame, yoffset, xoffset, width, height, linestep, bytes, m_bytes_per_pixel ); - m_wid->repaint(); +// m_wid->repaint(false); } diff --git a/noncore/multimedia/opieplayer2/nullvideo.c b/noncore/multimedia/opieplayer2/nullvideo.c index f356e76..63d5752 100644 --- a/noncore/multimedia/opieplayer2/nullvideo.c +++ b/noncore/multimedia/opieplayer2/nullvideo.c @@ -51,71 +51,70 @@ struct opie_frame_s { vo_frame_t frame; char* name; int version; int width; int height; int ratio_code; int format; int flags; int user_ratio; double ratio_factor; int ideal_width; int ideal_height; int output_width, output_height; uint8_t *chunk[3]; yuv2rgb_t *yuv2rgb; uint8_t *rgb_dst; int yuv_stride; int stripe_height, stripe_inc; int bytes_per_line; uint8_t *data; - int show_video; +// int show_video; null_driver_t *output; }; static uint32_t null_get_capabilities(vo_driver_t *self ){ null_driver_t* this = (null_driver_t*)self; printf("capabilities\n"); return this->m_capabilities; } static void null_frame_copy (vo_frame_t *vo_img, uint8_t **src) { opie_frame_t *frame = (opie_frame_t *) vo_img ; printf("frame copy\n"); - if(!frame->show_video ){ printf("no video\n"); return; } // no video + if(!frame->output->m_show_video ){ printf("no video\n"); return; } // no video if (frame->format == IMGFMT_YV12) { frame->yuv2rgb->yuv2rgb_fun (frame->yuv2rgb, frame->rgb_dst, src[0], src[1], src[2]); } else { frame->yuv2rgb->yuy22rgb_fun (frame->yuv2rgb, frame->rgb_dst, src[0]); - } frame->rgb_dst += frame->stripe_inc; printf("returning\n"); } static void null_frame_field (vo_frame_t *vo_img, int which_field) { opie_frame_t *frame = (opie_frame_t *) vo_img ; printf("field\n\n"); switch (which_field) { case VO_TOP_FIELD: frame->rgb_dst = (uint8_t *)frame->data; frame->stripe_inc = 2*frame->stripe_height * frame->bytes_per_line; break; case VO_BOTTOM_FIELD: frame->rgb_dst = (uint8_t *)frame->data + frame->bytes_per_line ; frame->stripe_inc = 2*frame->stripe_height * frame->bytes_per_line; break; case VO_BOTH_FIELDS: frame->rgb_dst = (uint8_t *)frame->data; break; } @@ -124,69 +123,69 @@ static void null_frame_field (vo_frame_t *vo_img, int which_field) { /* take care of the frame*/ static void null_frame_dispose( vo_frame_t* vo_img){ opie_frame_t* frame = (opie_frame_t*)vo_img; printf("frame_dispose\n"); if( frame->data ) free( frame->data ); free (frame); } /* end take care of frames*/ static vo_frame_t* null_alloc_frame( vo_driver_t* self ){ null_driver_t* this = (null_driver_t*)self; opie_frame_t* frame; frame = (opie_frame_t*)malloc ( sizeof(opie_frame_t) ); memset( frame, 0, sizeof( opie_frame_t) ); pthread_mutex_init (&frame->frame.mutex, NULL); printf("alloc_frame\n"); frame->name = "opie\0"; frame->version = 1; frame->output = this; - frame->show_video = this->m_show_video; +// frame->show_video = this->m_show_video; /* initialize the frame*/ frame->frame.driver = self; /*frame.frame.free = null_frame_free;*/ frame->frame.copy = null_frame_copy; frame->frame.field = null_frame_field; frame->frame.dispose = null_frame_dispose; frame->yuv2rgb = 0; /* * colorspace converter for this frame */ frame->yuv2rgb = this->yuv2rgb_factory->create_converter (this->yuv2rgb_factory); return (vo_frame_t*) frame; } // size specific static void null_compute_ideal_size (null_driver_t *this, opie_frame_t *frame) { - if (!this->m_is_scaling || !this->m_show_video) { + if (!this->m_is_scaling /*|| !this->m_show_video*/) { printf("Not scaling\n"); frame->ideal_width = frame->width; frame->ideal_height = frame->height; frame->ratio_factor = 1.0; } else { double image_ratio, desired_ratio, corr_factor; image_ratio = (double) frame->width / (double) frame->height; switch (frame->user_ratio) { case ASPECT_AUTO: switch (frame->ratio_code) { case XINE_ASPECT_RATIO_ANAMORPHIC: /* anamorphic */ desired_ratio = 16.0 /9.0; break; case XINE_ASPECT_RATIO_211_1: /* 2.11:1 */ desired_ratio = 2.11/1.0; break; case XINE_ASPECT_RATIO_SQUARE: /* square pels */ case XINE_ASPECT_RATIO_DONT_TOUCH: /* probably non-mpeg stream => don't touch aspect ratio */ desired_ratio = image_ratio; break; @@ -280,49 +279,49 @@ static void null_update_frame_format( vo_driver_t* self, vo_frame_t* img, opie_frame_t* frame = (opie_frame_t*)img; /* not needed now */ printf("update_frame_format\n"); printf("al crash aye?\n"); flags &= VO_BOTH_FIELDS; /* find out if we need to adapt this frame */ if ((width != frame->width) || (height != frame->height) || (ratio_code != frame->ratio_code) || (flags != frame->flags) || (format != frame->format) || (this->user_ratio != frame->user_ratio) || this->gui_changed ) { frame->width = width; frame->height = height; frame->ratio_code = ratio_code; frame->flags = flags; frame->format = format; frame->user_ratio = this->user_ratio; this->gui_changed = 0; - frame->show_video = this->m_show_video; +// frame->show_video = this->m_show_video; null_compute_ideal_size (this, frame); null_compute_rgb_size (this, frame); /* * (re-) allocate */ if( frame->data ) { if(frame->chunk[0] ){ free( frame->chunk[0] ); frame->chunk[0] = NULL; } if(frame->chunk[1] ){ free ( frame->chunk[1] ); frame->chunk[1] = NULL; } if(frame->chunk[2] ){ free ( frame->chunk[2] ); frame->chunk[2] = NULL; } free ( frame->data ); } printf("after freeing\n"); @@ -334,49 +333,49 @@ static void null_update_frame_format( vo_driver_t* self, vo_frame_t* img, frame->frame.base[0] = xine_xmalloc_aligned(16, image_size, (void **)&frame->chunk[0] ); frame->frame.base[1] = xine_xmalloc_aligned(16, image_size, (void **)&frame->chunk[1] ); frame->frame.base[2] = xine_xmalloc_aligned(16, image_size, (void **)&frame->chunk[2] ); }else{ int image_size = width * height; /* cast ouch*/ frame->frame.base[0] = xine_xmalloc_aligned(16, image_size, (void **)&frame->chunk[0] ); frame->chunk[1] = NULL; frame->chunk[2] = NULL; } frame->format = format; frame->width = width; frame->height = height; frame->stripe_height = 16 * frame->output_height / frame->height; frame->bytes_per_line = frame->output_width * this->bytes_per_pixel; /* * set up colorspace converter */ - if(this->m_show_video ){ + if(1 /*this->m_show_video*/ ){ printf("showing video\n"); switch (flags) { case VO_TOP_FIELD: case VO_BOTTOM_FIELD: frame->yuv2rgb->configure (frame->yuv2rgb, frame->width, 16, frame->width*2, frame->width, frame->output_width, frame->stripe_height, frame->bytes_per_line*2); frame->yuv_stride = frame->bytes_per_line*2; break; case VO_BOTH_FIELDS: frame->yuv2rgb->configure (frame->yuv2rgb, frame->width, 16, frame->width, frame->width/2, frame->output_width, frame->stripe_height, frame->bytes_per_line); @@ -393,57 +392,57 @@ static void null_update_frame_format( vo_driver_t* self, vo_frame_t* img, if (frame->data) { switch (flags) { case VO_TOP_FIELD: frame->rgb_dst = (uint8_t *)frame->data; frame->stripe_inc = 2 * frame->stripe_height * frame->bytes_per_line; break; case VO_BOTTOM_FIELD: frame->rgb_dst = (uint8_t *)frame->data + frame->bytes_per_line ; frame->stripe_inc = 2 * frame->stripe_height * frame->bytes_per_line; break; case VO_BOTH_FIELDS: frame->rgb_dst = (uint8_t *)frame->data; frame->stripe_inc = frame->stripe_height * frame->bytes_per_line; break; } } printf("done\n"); } static void null_display_frame( vo_driver_t* self, vo_frame_t *frame_gen ){ null_driver_t* this = (null_driver_t*) self; opie_frame_t* frame = (opie_frame_t*)frame_gen; display_xine_frame_t display = this->frameDis; printf("display frame\n"); - // if( this->m_show_video ) { // return if not displaying +// if( this->m_show_video ) { // return if not displaying printf("calling home aye\n" ); if( display != NULL ) { (*display)(this->caller, frame->data, frame->output_width, frame->output_height, frame->bytes_per_line ); printf("display done hope you enyoyed the frame"); } - // } +// } frame->frame.displayed (&frame->frame); } // blending related static void null_overlay_clut_yuv2rgb(null_driver_t *this, vo_overlay_t *overlay, opie_frame_t *frame) { int i; clut_t* clut = (clut_t*) overlay->color; if (!overlay->rgb_clut) { for (i = 0; i < sizeof(overlay->color)/sizeof(overlay->color[0]); i++) { *((uint32_t *)&clut[i]) = frame->yuv2rgb->yuv2rgb_single_pixel_fun (frame->yuv2rgb, clut[i].y, clut[i].cb, clut[i].cr); } overlay->rgb_clut++; } if (!overlay->clip_rgb_clut) { clut = (clut_t*) overlay->clip_color; for (i = 0; i < sizeof(overlay->color)/sizeof(overlay->color[0]); i++) { *((uint32_t *)&clut[i]) = diff --git a/noncore/multimedia/opieplayer2/xinevideowidget.cpp b/noncore/multimedia/opieplayer2/xinevideowidget.cpp index d665f16..b5a714e 100644 --- a/noncore/multimedia/opieplayer2/xinevideowidget.cpp +++ b/noncore/multimedia/opieplayer2/xinevideowidget.cpp @@ -25,106 +25,101 @@ : = ...= . :.=- -. .:....=;==+<; You should have received a copy of the GNU -_. . . )=. = Library General Public License along with -- :-=` this library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include <qimage.h> #include <qpainter.h> #include <qgfx_qws.h> #include <qdirectpainter_qws.h> #include <qsize.h> #include <qpe/resource.h> #include "xinevideowidget.h" XineVideoWidget::XineVideoWidget( int width, int height, QWidget* parent, const char* name ) - : QWidget( parent, name ) + : QWidget( parent, name, WRepaintNoErase | WResizeNoErase ) { m_image = new QImage( width, height, qt_screen->depth() ); m_buff = 0; setBackgroundMode( NoBackground); /* QImage image = Resource::loadImage("SoundPlayer"); image = image.smoothScale( width, height ); m_image = new QImage( image );*/ } XineVideoWidget::~XineVideoWidget() { delete m_image; } void XineVideoWidget::clear() { m_buff = 0; - repaint(); + repaint(false); } void XineVideoWidget::paintEvent( QPaintEvent* e ) { qWarning("painting"); - QPainter p(this ); - p.setBrush( QBrush( Qt::black ) ); - p.drawRect( rect() ); - if (m_buff == 0 ) + if (m_buff == 0 ) { + QPainter p(this ); + p.fillRect( rect(), black ); p.drawImage( 0, 0, *m_image ); - else { + qWarning ( "logo\n" ); + } + else { qWarning("paitnevent\n"); - - QDirectPainter dp( this ); - uchar* dst = dp.frameBuffer() + (m_yOff + dp.yOffset() ) * linestep + - (m_xOff + dp.xOffset() ) * m_bytes_per_pixel; - uchar* frame = m_buff; - for(int y = 0; y < m_Height; y++ ) { - memcpy( dst, frame, m_bytes ); - frame += m_bytes; - dst += linestep; + { + + if (( m_thisframe & m_lastframe ) != m_lastframe ) { + QPainter p ( this ); + p. fillRect ( m_lastframe, black ); + } + } + { + QDirectPainter dp ( this ); + + uchar* dst = dp.frameBuffer() + (m_thisframe. y ( ) + dp.yOffset() ) * linestep + + (m_thisframe. x ( ) + dp.xOffset() ) * m_bytes_per_pixel; + uchar* frame = m_buff; + for(int y = 0; y < m_thisframe. height ( ); y++ ) { + memcpy( dst, frame, m_bytes ); + frame += m_bytes; + dst += linestep; + } } - // QVFB hack by MArtin Jones -// QPainter dp2(this); - // dp2.fillRect( rect(), QBrush( NoBrush ) ); + { + // QVFB hack by MArtin Jones + QPainter p ( this ); + p. fillRect ( m_thisframe, QBrush ( NoBrush )); + } } -// QWidget::paintEvent( e ); } int XineVideoWidget::height() const{ return m_image->height(); } int XineVideoWidget::width() const{ return m_image->width(); } void XineVideoWidget::setImage( QImage* image ) { delete m_image; m_image = image; } void XineVideoWidget::setImage( uchar* image, int yoffsetXLine, int xoffsetXBytes, int width, int height, int linestep, int bytes, int bpp ) { -/* if (m_buff != 0 ) - free(m_buff ); -*/ + + m_lastframe = m_thisframe; + m_thisframe. setRect ( xoffsetXBytes, yoffsetXLine, width, height ); + m_buff = image; - m_yOff = yoffsetXLine; - m_xOff = xoffsetXBytes; - m_Width = width; - m_Height = height; this->linestep = linestep; m_bytes = bytes; m_bytes_per_pixel = bpp; - //// - qWarning("width %d %d", width, height ); -/* QDirectPainter dp( this ); - uchar* dst = dp.frameBuffer() + (m_yOff + dp.yOffset() ) * linestep + - (m_xOff + dp.xOffset() ) * m_bytes_per_pixel; - uchar* frame = m_buff; - for(int y = 0; y < m_Height; y++ ) { - memcpy( dst, frame, m_bytes ); - frame += m_bytes; - dst += linestep; - } - // QVFB hack - QPainter dp2(this); - dp2.fillRect( rect(), QBrush( NoBrush ) ); -*/ + + repaint ( false ); } diff --git a/noncore/multimedia/opieplayer2/xinevideowidget.h b/noncore/multimedia/opieplayer2/xinevideowidget.h index b670fa0..5656194 100644 --- a/noncore/multimedia/opieplayer2/xinevideowidget.h +++ b/noncore/multimedia/opieplayer2/xinevideowidget.h @@ -30,35 +30,38 @@ Boston, MA 02111-1307, USA. */ #include <qwidget.h> class QImage; class XineVideoWidget : public QWidget { Q_OBJECT public: XineVideoWidget( int width, int height, QWidget* parent, const char* name ); ~XineVideoWidget(); QImage *image() { return m_image; }; void setImage( QImage* image ); void setImage( uchar* image, int yoffsetXLine, int xoffsetXBytes, int width, int height, int linestep, int bytes, int bpp); int width() const; int height() const; void clear() ; protected: void paintEvent( QPaintEvent* p ); private: + QRect m_lastframe; + QRect m_thisframe; + int m_wid; int m_height; int m_yOff, m_xOff; uchar* m_buff; int m_Width, m_Height, linestep; int m_bytes; int m_bytes_per_pixel; QImage* m_image; }; |