Esempio n. 1
0
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);

}