void TracksRuler::paintEvent( QPaintEvent* e ) { QStylePainter painter( this ); painter.setClipRect( e->rect() ); // Draw the background const int projectEnd = ( int )( m_duration * m_factor ); if ( projectEnd - m_offset > 1 ) painter.fillRect( 0, 0, projectEnd - m_offset, height(), QBrush( QColor( 245, 245, 245 ) ) ); double f, step; int offsetMax; int offsetMin; const int maxVal = ( e->rect().right() + m_offset ) / FRAME_SIZE + 1; offsetMax = maxVal * FRAME_SIZE; QPalette palette; painter.setPen( palette.dark().color() ); offsetMin = ( int ) ( ( e->rect().left() + m_offset ) / m_textSpacing ); offsetMin = ( int ) ( offsetMin * m_textSpacing ); for ( f = offsetMin; f < offsetMax; f += m_textSpacing ) { QString time = getTimeCode( (int)( f / m_factor + 0.5 ) ); painter.drawText( ( int )f - m_offset + 2, LABEL_SIZE + 1, time ); } // Draw the marks offsetMin = ( e->rect().left() + m_offset ) / m_littleMarkDistance; offsetMin = offsetMin * m_littleMarkDistance; step = m_scale * m_littleMarkDistance; if ( step > 5 ) for ( f = offsetMin - m_offset; f < offsetMax - m_offset; f += step ) painter.drawLine( ( int )f, LITTLE_MARK_X1, ( int )f, LITTLE_MARK_X2 ); offsetMin = ( e->rect().left() + m_offset ) / m_mediumMarkDistance; offsetMin = offsetMin * m_mediumMarkDistance; step = m_scale * m_mediumMarkDistance; if ( step > 5 ) for ( f = offsetMin - m_offset; f < offsetMax - m_offset; f += step ) painter.drawLine( ( int )f, MIDDLE_MARK_X1, ( int )f, MIDDLE_MARK_X2 ); offsetMin = ( e->rect().left() + m_offset ) / m_bigMarkDistance; offsetMin = offsetMin * m_bigMarkDistance; step = m_scale * m_bigMarkDistance; if ( step > 5 ) for ( f = offsetMin - m_offset; f < offsetMax - m_offset; f += step ) painter.drawLine( ( int )f, BIG_MARK_X1, ( int )f, BIG_MARK_X2 ); // Draw the pointer int cursorPos = m_tracksView->cursorPos() * m_factor + 0.5 - offset(); QPolygon cursor( 3 ); cursor.setPoints( 3, cursorPos - 8, 15, cursorPos + 8, 15, cursorPos, 30 ); painter.setBrush( QBrush( QColor( 82, 97, 122, 150 ) ) ); painter.setRenderHint(QPainter::Antialiasing, true); painter.drawPolygon( cursor ); }
/** \fn GenericAviSaveCopyUnpack::setupVideo \brief init for unpacker code */ uint8_t GenericAviSaveCopyPack::writeVideoChunk (uint32_t frame) { uint8_t ret1; ADMCompressedImage img; uint32_t oldtimeinc=0; img.data=vbuffer; if(!video_body->isReordered(frameStart+frame)) { ret1 = video_body->getFrameNoAlloc (frameStart + frame,&img); _videoFlag=img.flags; } else { ret1=1; // We prefetch one frame... if(!frame) // First frame. { if(!prefetch(0,frame)) { return 0; } curToggle=0; } uint32_t len=0; ADMBitstream *current,*next; current=lookAhead[curToggle]; next=lookAhead[curToggle^1]; if(current->flags!=AVI_B_FRAME && current->flags!=1) { /* Get its timecode */ if(!getTimeCode(current,time_inc,&oldtimeinc)) { printf("WARNING cannot get timecode for frame %u\n",frame); } } if(frame+2<_incoming->getInfo()->nb_frames) { if( !prefetch(curToggle^1,frame+1)) { return 0; } // Curtoggle holds the current frame, curToggle ^1 hold the next frame if(current->flags!=1 && current->flags!=AVI_B_FRAME && next->flags==AVI_B_FRAME) { aprintf("Packing frame :%u\n",frame); // We need to pack this len=current->len; memcpy(vbuffer,current->data,len); memcpy(vbuffer+len,next->data,next->len); len+=next->len; img.dataLength=len; // Put nvop in next buffer putNvop(next,time_inc, oldtimeinc); next->flags=1; // Mark it as P, so that we can identify it later }else { // Just send len=current->len; memcpy(vbuffer,current->data,len); } } else { // Last frame aprintf("Last frame\n"); len= current->len; memcpy(vbuffer,current->data,len); } img.dataLength=len; if(current->flags==1) current->flags=0; // Remove our marker _videoFlag=img.flags=current->flags; if(_videoFlag==AVI_KEY_FRAME) { updateUserData(vbuffer,len); } curToggle^=1; } if (!ret1) return 0; if(_videoFlag==AVI_KEY_FRAME) newFile(); aprintf("Writting frame %u size %u flags %x\n",frame,img.dataLength,_videoFlag); encoding_gui->setFrame(frame,img.dataLength,0,frametogo); return writter->saveVideoFrame (img.dataLength, img.flags, img.data); }