VMR9显示的图片颜色失真,花屏?

来源:互联网 发布:网络消费陷阱揭秘 编辑:程序博客网 时间:2024/05/01 10:11

 

我将一副存储在单片机中的图片通过网线传到电脑上显示,没有用打时间戳,{etSyncSource(NULL);SetTime(NULL, NULL)}

确认所有的数据被传到电脑端了,视频不闪烁,移动,下面是我的视屏格式;

mPreferredMt.SetType(&MEDIATYPE_Video);
 mPreferredMt.SetSubtype(&MEDIASUBTYPE_RGB565);
 mPreferredMt.SetFormatType(&FORMAT_VideoInfo);
 mPreferredMt.SetTemporalCompression(FALSE);
 VIDEOINFO     info;
 ZeroMemory(&info, sizeof(VIDEOINFO));
 info.AvgTimePerFrame = 40000;
 info.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
 info.bmiHeader.biWidth  =160;
 info.bmiHeader.biHeight = - 120;
 info.bmiHeader.biBitCount  = 16;
 info.bmiHeader.biSizeImage = (192)*(120)*2;  //
 info.bmiHeader.biCompression = BI_BITFIELDS;
 info.bmiHeader.biPlanes = 1;
    info.bmiHeader.biClrImportant = 0;
    info.bmiHeader.biClrUsed = 0;        //Use max colour depth
    info.bmiHeader.biXPelsPerMeter = 0 ;
    info.bmiHeader.biYPelsPerMeter = 0 ; 
 info.dwBitMasks[0] =0xF800;
    info.dwBitMasks[1] =0x7E0;
 info.dwBitMasks[2] =0x1F;
    SetRectEmpty(&(info.rcSource));
    SetRectEmpty(&(info.rcTarget));


   info.rcSource.bottom = 0;
   info.rcSource.right = 0;
   info.rcTarget.bottom = 120;
   info.rcTarget.right = 160;
   TRACE("VIDEOINFO%u",sizeof(VIDEOINFO));
    mPreferredMt.SetFormat((BYTE*)&info, sizeof(VIDEOINFO));
 mPreferredMt.SetSampleSize(info.bmiHeader.biSizeImage);
 mPreferredMt.cbFormat = sizeof(VIDEOINFO);
 DisplayType("MediaType",&mPreferredMt);

 下面是我的数据接收函数,先接收一个同步标志,然后按行接收,一行320bytes的数据,把整幅图片120行接收完,在每行末尾加入64bytes,因为VMR9需要192*2=384bytes的STRIDE

void CStreamSocket::ReceivingLoop(void)
{
    unsigned int    bytes = 0;
    int err;
 char   VideoBegin =0;
    PBYTE  pSampleBuffer;
 SOCKET UDPReceiver,TCPReceiver;
    TRACE("In Net Receiver Filter Loop");
    char buffer[MAX_COMMAND_SIZE];
 // Set up command listening
 BOOL pass = mUDPReceiver->CreateReceiver();
 if(pass)
  UDPReceiver = mUDPReceiver->GetUDPReceiver();
    else
  TRACE("UDP SOCKET创建失败");
    while(TRUE)           
 { 
  if(mIsConnected!=TRUE)
  {
   TCPReceiver = AcceptConnectform();
   TRACE("连接到摄像头 %x",TCPReceiver);//建立连接
   
  }
  else
  {
   TRACE("Receive media data");
   // Receive media data
   BOOL pass = FALSE;
   do
   {
    pass = mOwnerFilter->GetSampleBuffer(&pSampleBuffer);
    if (!pass)
    {
     Sleep(100);
    }
   } while (mIsReceiving && !pass);
   
   while (VideoBegin == 0)  //同步主机和摄像头
   {
    
    bytes = recv(UDPReceiver, (char *)buffer, MAX_COMMAND_SIZE, 0);    
    TRACE("等待新的一帧图像 %X ",bytes);
    TRACE("buffer%x",*(long *)buffer);
    
    //long tem = *(long *)buffer;
                //TRACE("TEM%X",tem);
    TRACE("CMD%x",cmd_VideoBegin);
                //ntohl(tem);
    if ( *(long *)buffer == cmd_VideoBegin)
    {
     VideoBegin = 1; 
    }
   } 
   unsigned int row = 320;
   
   long received = 0;
   while (mIsReceiving && received < (160 +32)*120*2)
   {
    bytes = recv(TCPReceiver, (char*)(pSampleBuffer+received), row, 0);
    err=WSAGetLastError();
    switch(err)
    {
    case 0                 :  TRACE("Bytes received: %d\n", bytes);VideoBegin = 0;break;
    case WSAENOTCONN       :  mIsConnected=FALSE;TRACE("连接断开");break;
    case WSAENETRESET      :  mIsConnected=FALSE;TRACE("连接断开");break;
    case WSAESHUTDOWN      :  TRACE("连接被关闭");break;
    case WSAECONNABORTED   :  mIsConnected=FALSE;TRACE("连接断开");break;
    case WSAETIMEDOUT      :  mIsConnected=FALSE;TRACE("连接超时");break;
    case WSAECONNRESET     :  mIsConnected=FALSE;TRACE("连接断开");break;
    default:TRACE("recv failed: %d\n", err);
    }
    
    if(bytes == 320)  //得到的数据正好是一行则直接添加STRIDE
    {
     received += (row +64);
     
     TRACE("已经接收的数据 %d\n",received);
    }
    else
    {
     received += bytes;
     row =320-received%384;  //接收一行的下半部分
     TRACE("已经接收的数据 %d\n",received);
                    TRACE("下半部分 %d\n", row);
     
     if(row == 0)  //凑齐了一行数据后插入STRIDE
     {
      received+=64;
                        row = 320;
      
      
     }
    }
    
   }
   TRACE("received  %u",received);
   // Deliver this sample
   mOwnerFilter->DeliverHoldingSample(received);
   Sleep(10);
   
  }
 }
}

调试到这里不知道怎么弄了,请大家说说可能是哪方面的问题?

原创粉丝点击