天天看點

海思中fifo的使用及c語言中fifo的使用以及c中關于字元串的說明%s以及strlen注意問題

題記:最近在調試想把海思的視訊資料先存儲到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到底能不能達到我想要的目的,我最終目的是可以根據網絡狀态來改變碼流,進而改變碼率。

繼續閱讀