題記:最近在調試想把海思的視訊資料先存儲到fifo中,然後取資料的時候再從fifo中取出資料,這樣來進一步使得視訊播放更加流暢。
1 實作fifo的demo
//============================================================================
// Name : FIFOTest01.cpp
// Author : frank
// Version :
// Copyright : Your copyright notice
// Description : Hello World in C++, Ansi-style
//============================================================================
//http://blog.chinaunix.net/uid-12045105-id-2963178.html
#include <iostream>
#include <string.h>
#include <stdio.h>
using namespace std;
#define BUFSIZE 1024
#define WR 1 //寫資料标志
#define RD 0 //讀資料标志
typedef struct FifoType{
unsigned char buffer[BUFSIZE]; /* Circular buffer */
unsigned int w_idx; /* Index of write */
unsigned int r_idx; /* Index of read */
}*pFifoType;
unsigned char data [1024] ;
unsigned char *fifoctl(pFifoType priv , unsigned char *data ,const unsigned char flag)
{
unsigned char temp[BUFSIZE];
//unsigned int widx = 0;
//widx = priv->w_idx;
// int len;/* Save the old index before proceeding */
if (flag == WR) //write data
{
int len = strlen((char *)data);
//cout << data << endl;
memcpy(priv->buffer,data,len);
}
else //read data
{
unsigned char *p;
p = priv->buffer;
int len = strlen((char *)p);
memcpy(temp,priv->buffer,len);
priv->r_idx = (priv->r_idx + 1);
}
return temp;
}
int main()
{ <span style="color:#ff0000;">//剛開始調試的時候出現 unsigned char [1024] 輸出亂碼。說明是在棧記憶體中存儲資料,資料量較小,那麼可以在堆記憶體中申請可以放到
//全局變量或者new 出來,在堆記憶體中比較大</span>
//unsigned char data = new unsigned char[];
for(int i=0;i<3;i++)
{
pFifoType priv = new FifoType;
priv->r_idx = 0;
priv->w_idx = 0;
unsigned char send [] = "00a4908fgghabcdefghilcsbcdabcdabcdefjifeghiebcdefgh";
fifoctl(priv,send,WR);
unsigned char *p;
p = fifoctl(priv,data,RD);
printf("p = %s\n",p);
//cout << p << endl;
delete priv;
priv = NULL;
}
return 0;
}
這個fifo,還沒有寫全,還要有判斷是否buffer的标志。注意看紅色的字型部分内容。
2 在海思中加的fifo
pFifoType priv = new FifoType;
fFrameSize = 0;
for(unsigned int j =0;j< stStream.u32PackCount;j++)
{
printf("len=%d",stStream.pstPack[j].u32Len[0]);
for (int i = 0; i < 10; i++) {
printf(" %02x", *(stStream.pstPack[j].pu8Addr[0]+ i));
}
printf("\n");
printf("flag run");
fifoctl(priv,stStream.pstPack[j].pu8Addr[0],stStream.pstPack[j].u32Len[0],WR);
printf("step01\n");
unsigned char *fifo_p;
fifo_p = fifoctl(priv,fifo_data,stStream.pstPack[j].u32Len[0],RD);
printf("step02\n");
memmove(fTo + fFrameSize, fifo_p,stStream.pstPack[j].u32Len[0]);
printf("step03\n");//
fFrameSize += stStream.pstPack[j].u32Len[0];
}
delete priv;
其中,fifo.cpp的内容是:
#include <iostream>
#include <string.h>
#include "fifo.h"
#include <stdio.h>
using namespace std;
unsigned char *fifoctl(pFifoType priv , unsigned char data[] ,int fifo_len,const unsigned char flag)
{
unsigned char temp[BUFSIZE];
//unsigned int widx = 0;
//widx = priv->w_idx;
// int len;/* Save the old index before proceeding */
if (flag == WR) //write data
{
/*for (int i = 0; i < 10; i++) {
printf("%02x", *(data+ i));//z這個地方列印出來的資料是000000016742001e95a8
}*/
memcpy(priv->fifo_buffer,data,fifo_len);
printf("fifo_len= %d",fifo_len);
}
else //read data
{
unsigned char *p;
p = priv->fifo_buffer;
memcpy(temp,priv->fifo_buffer,fifo_len);
printf("read len = %d",fifo_len);
priv->r_idx = (priv->r_idx + 1);
}
return temp;
}
講下在調試的時候出現的問題:
問題1:用%s,列印的資料沒有,因為我的資料包的開頭是00 00 01 ,而%s列印的時候遇到\n和0(null),就會停止。是以,如果printf("for2 stStream->pstPack[0].pu8Addr= %s\n",stStream.pstPack[j].pu8Addr[0]);是沒有資料的。必須改用%x ,char str[10]={'a','v','c','d',0,'e','f',0,0....} strlen 計算出的 字元串長度是4,寫的是0 而不是‘0’。。記住。
問題2 :對于unsigned char data[10],在堆記憶體和棧記憶體中,申請的位址不通,如果是全局變量或者是New出來的那麼就申請的
較大,。如果是局部變量就會申請的小。
3 未完待續
感覺這樣寫的fifo是沒用用的,必須要通過一線線程編碼然後将資料包放到fifo裡面,另外一個主線程,也就是要live555發送的線程,對獲得的資料進行發送,這就需要對fifo的資料的管理非常的嚴格,對有多少資料讀進去,多少資料讀出來,然後什麼交給live555多少資料,都要明白才行。看看接下來的時候能搞定嗎。
現在不知道我用fifo到底能不能達到我想要的目的,我最終目的是可以根據網絡狀态來改變碼流,進而改變碼率。