summaryrefslogtreecommitdiff
Side-by-side diff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/multimedia/opieplayer2/xinevideowidget.cpp24
-rw-r--r--noncore/multimedia/opieplayer2/xinevideowidget.h3
2 files changed, 25 insertions, 2 deletions
diff --git a/noncore/multimedia/opieplayer2/xinevideowidget.cpp b/noncore/multimedia/opieplayer2/xinevideowidget.cpp
index b27b8e1..7c98ce5 100644
--- a/noncore/multimedia/opieplayer2/xinevideowidget.cpp
+++ b/noncore/multimedia/opieplayer2/xinevideowidget.cpp
@@ -107,58 +107,61 @@ static inline void memcpy_step_rev ( void *_dst, void *_src, size_t len, size_t
short int* dst = static_cast<short int*>( _dst );
short int* src = reinterpret_cast<short int*>( src_c );
while ( len-- ) {
src_c -= step;
src = reinterpret_cast<short int*>( src_c );
*dst++ = *src;
}
}
XineVideoWidget::XineVideoWidget ( QWidget* parent, const char* name )
- : QWidget ( parent, name, WRepaintNoErase | WResizeNoErase )
+ : QWidget ( parent, name, WRepaintNoErase | WResizeNoErase ),old_framerect(0,0,0,0),old_size(0,0)
{
setBackgroundMode ( NoBackground );
m_logo = 0;
m_buff = 0;
m_bytes_per_line_fb = qt_screen-> linestep ( );
m_bytes_per_pixel = ( qt_screen->depth() + 7 ) / 8;
m_rotation = 0;
m_lastsize = 0;
}
XineVideoWidget::~XineVideoWidget ( )
{
- ThreadUtil::AutoLock a(m_bufmutex);
+#if 0
if (m_buff) {
delete[]m_buff;
m_lastsize=0;
m_buff = 0;
}
+#endif
if (m_logo) {
delete m_logo;
}
}
void XineVideoWidget::clear ( )
{
+#if 0
ThreadUtil::AutoLock a(m_bufmutex);
if (m_buff) {
delete[]m_buff;
m_lastsize=0;
m_buff = 0;
}
+#endif
repaint ( false );
}
QSize XineVideoWidget::videoSize() const
{
QSize s = size();
bool fs = ( s == qApp->desktop()->size() );
// if we are in fullscreen mode, do not rotate the video
// (!! the paint routine uses m_rotation + qt_screen-> transformOrientation() !!)
m_rotation = fs ? - qt_screen->transformOrientation() : 0;
@@ -201,24 +204,36 @@ void XineVideoWidget::paintEvent2 ( QPaintEvent * )
int middle_h = _vh/2;
m_thisframe.setRect(width()/2-middle_w,height()/2-middle_h,_vw,_vh);
uchar *fb = dp. frameBuffer ( );
uchar *frame = m_buff;
// where is the video frame in fb coordinates
QRect framerect = qt_screen-> mapToDevice ( QRect ( mapToGlobal ( m_thisframe. topLeft ( )), m_thisframe. size ( )), QSize ( qt_screen-> width ( ),
qt_screen-> height ( )));
uchar * src = frame;
uchar * dst = fb+framerect.y()*m_bytes_per_line_fb+framerect.x()*m_bytes_per_pixel;
+ /* clean up the fb screen when shrinking the image only! */
+ if (old_framerect.isValid() && old_size.width()==width()&&old_size.height()==height() &&
+ (old_framerect.width()>framerect.width() || old_framerect.height()>framerect.height())) {
+ uchar*_dst = fb+old_framerect.y()*m_bytes_per_line_fb+old_framerect.x()*m_bytes_per_pixel;
+ for (int z=0;z<old_framerect.height();++z) {
+ memset(_dst,0,m_bytes_per_line_fb);
+ _dst+=m_bytes_per_line_fb;
+ }
+ }
+ old_framerect=framerect;
+ old_size = size();
+
if (framerect.height()!=m_framesize.height()) {
odebug << "Hoehm: " << framerect.height() << " <-> " << m_framesize.height() << oendl;
}
for (int y = 0;y<framerect.height();++y) {
switch (rot) {
case 0:
memcpy(dst,src,m_bytes_per_line_frame);
src+=m_bytes_per_line_frame;
break;
case 1:
memcpy_step ( dst, src, m_thisframe.size().width(), m_bytes_per_line_frame );
src -= m_bytes_per_pixel;
@@ -256,41 +271,46 @@ void XineVideoWidget::setVideoFrame ( uchar* img, int w, int h, int bpl )
{
// mutex area for AutoLock
{
#if 0
ThreadUtil::AutoLock a(m_bufmutex);
#endif
if (!isVisible()||w>width()||h>height()/*||m_bufmutex.isLocked()*/) {
//drop frame
return;
}
bool rot90 = (( -m_rotation ) & 1 );
int l = h*bpl;
+#if 0
if (l!=m_lastsize) {
if (m_buff) {
delete[]m_buff;
}
if (l>0) {
m_buff = new uchar[l];
odebug << "Point to: " << (unsigned long)m_buff << oendl;
m_lastsize=l;
} else {
m_buff = 0;
}
}
+#endif
m_lastsize = l;
m_framesize = QSize(w,h);
+#if 0
if (m_buff && m_lastsize) {
memcpy(m_buff,img,m_lastsize);
}
+#endif
+ m_buff = img;
m_bytes_per_line_frame = bpl;
if (m_buff) paintEvent2(0);
} // Release Mutex
}
void XineVideoWidget::resizeEvent ( QResizeEvent * )
{
#if 0
ThreadUtil::AutoLock a(m_bufmutex);
#endif
emit videoResized( videoSize() );
odebug << "All resize done" << oendl;
diff --git a/noncore/multimedia/opieplayer2/xinevideowidget.h b/noncore/multimedia/opieplayer2/xinevideowidget.h
index a0ec5bc..f240b1c 100644
--- a/noncore/multimedia/opieplayer2/xinevideowidget.h
+++ b/noncore/multimedia/opieplayer2/xinevideowidget.h
@@ -25,47 +25,50 @@
: = ...= . :.=-
-. .:....=;==+<; 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 <qwidget.h>
+#include <qrect.h>
#include "lib.h"
class QImage;
class XineVideoWidget : public QWidget {
Q_OBJECT
public:
XineVideoWidget ( QWidget* parent, const char* name );
~XineVideoWidget ( );
QImage *logo ( ) const;
void setLogo ( QImage *image );
void setVideoFrame ( uchar *image, int width, int height, int linestep );
void clear ( );
QSize videoSize() const;
protected:
void paintEvent2( QPaintEvent *p );
virtual void paintEvent(QPaintEvent*);
virtual void resizeEvent ( QResizeEvent *r );
+ QRect old_framerect;
+ QSize old_size;
void mouseReleaseEvent ( QMouseEvent *e );
signals:
void clicked ( );
void videoResized ( const QSize &s );
private:
QRect m_lastframe;
QRect m_thisframe;
uchar *m_buff;