[Libav-user] PCR value for TS stream

Li Zhang lizhang at utelisys.com
Wed May 9 11:38:30 CEST 2012



Hi,

I used the TS container to encapsulate my H264 and AAC. I want to use the PCR value to control UDP sending. However, I found that the PCR value I got from ffmpeg is very strange.

Firstly, some of the pcr value is super big and abnormal, such as
 pcr_extention:475,pcr_base:2127168108,
pcr_extention:111,pcr_base:1162685276

------------------pcr_extention:0,------------------pcr_base:18590400
------------------pcr_extention:0,------------------pcr_base:18597600
------------------pcr_extention:0,------------------pcr_base:18604800
------------------pcr_extention:0,------------------pcr_base:18612000
------------------pcr_extention:227,------------------pcr_base:18446744073583863388
------------------pcr_extention:0,------------------pcr_base:18619200
------------------pcr_extention:0,------------------pcr_base:18626400
------------------pcr_extention:0,------------------pcr_base:18633600
------------------pcr_extention:0,------------------pcr_base:18640800


Secondly, I found the difference between two PCR value is 7200 or 3600, which is 80ms or 40ms. And there are twenty-four 80ms and only two 40ms every 26 differences. According the standard, TS stream should have a pcr value at least 40ms. So I do not know why.

Here is the code I used to parse PCR value, I hope it is correct.



        int i=0;        //position pointer iterator
        int buf_size = 0; //the length of data packet
        uint8_t *buf = NULL;    //data packet pointer
        uint8_t *position = NULL;       //starting point for each 188B
        uint8_t adaption_field = 0;     //adaption field existing flag
        unsigned int pcr_flag;  //pcr existing flag
        uint8_t *pcr_field = NULL;      //pcr field pointer
        uint64_t pcr_base;      //base part of pcr
        unsigned int pcr_ext;   //extentions part of pcr

                for(i=0;i<buf_size;) {

                        position = &buf[i];
                        adaption_field = (position[3] & 0x30)>>4;

                        if(adaption_field > 1) {
                                pcr_flag = (position[5] & 0x10)>>4;

                                if(pcr_flag == 1) {
                                        pcr_field = position + 6;

                                        pcr_base = (pcr_field[0] * 0x2000000) + (pcr_field[1] * 0x20000) + (pcr_field[2] * 0x200) + (pcr_field[3] * 0x02) + ((pcr_field[4] & 0x80) >> 7);
                                        pcr_ext = ((pcr_field[4] & 0x01) * 0x100) + pcr_field[5];

                                        printf("------------------pcr_extention:%u,",pcr_ext);
                                        printf("------------------pcr_base:%llu \n",pcr_base);
                                 }
                          }
                         i += 188;
                      }

So does anyone can help me with that?

Thanks.



Best regards,

Li


More information about the Libav-user mailing list