/************************************************************************
*
* Author: Biju Ravindran
*
*
************************************************************************/
#include <stdio.h>
#define TS_PACKET_LENGTH 188
#define MAX_BUFF_LENGTH 256
#define PES_PACKET_HEADER 9
typedef struct
{
int adaptation_field_length;
int discontinuity_indicator;
int random_acces_indicator;
int elementary_stream_priority_indicator;
int pcr_flag;
int opcr_flag;
int splicing_point_flag;
int transport_private_data_flag;
int adaptation_field_extension_flag;
long long pcr_new_base;
long long pcr_new_ext;
}adapt_field_data_t;
typedef struct
{
int packet_start_code_prefix;
int stream_id;
int pes_packet_length;
int pes_header_data_length;
int pes_scrambling_control;
int pes_priority;
int data_alignment_indicator;
int pts_dts_flags;
long long pts_time;
long long dts_time;
unsigned int pes_pkt_type;
unsigned int hiTicks;
unsigned int midTicks;
unsigned int loTicks;
int marker_bit;
} pes_pkt_hdr_t;
typedef struct
{
unsigned char *p_ts_buff;
int req_vidpid;
int req_audpid;
int req_pcrpid;
adapt_field_data_t adapt_data;
pes_pkt_hdr_t pes_pkt_info;
int pcr_flag;
long long pcr_time;
long long prev_pcr_time;
long long sum_delta_pcr;
int first_time;
unsigned int packet_num;
unsigned int prev_pkt_num;
long long vid_pkt_sz;
unsigned int aud_pkt_sz;
float video_bitrate;
float audio_bitrate;
float transp_bitrate;
}ts_packet_info_t;
int process_ts_packet(ts_packet_info_t *p_ts_pkt);
int get_adaptation_field(unsigned char *pbuf, adapt_field_data_t *p_adapt);
int get_pes_packet_header(unsigned char *pbuf, pes_pkt_hdr_t *p_pes);
int get_adaptation_field(unsigned char *pbuf, adapt_field_data_t *p_adapt)
{
unsigned char *p_ts = pbuf;
int adaptation_field_length;
int pcr_flag;
long long pcr_new_base;
long long pcr_new_ext;
int rd_indx = 0;
adaptation_field_length = p_ts[rd_indx];
rd_indx++;
if(adaptation_field_length > 0)
{
pcr_flag = (p_ts[rd_indx++] & 0x10) >> 4;
if(pcr_flag)
{
pcr_new_base = ((long long)p_ts[rd_indx]<<32) |
((long long)p_ts[rd_indx + 1]<<24) |
((long long)p_ts[rd_indx + 2]<<16) |
((long long)p_ts[rd_indx + 3]<<8) |
((long long)p_ts[rd_indx + 4]);
pcr_new_base >>= 7;
rd_indx += 5;
pcr_new_ext = ((long long)p_ts[rd_indx]<<8) |((long long)p_ts[rd_indx + 1]);
pcr_new_ext &= 0x1FF; // 9 bits
}
}
/* Populate the required fields */
p_adapt->adaptation_field_length = adaptation_field_length;
p_adapt->pcr_flag = pcr_flag;
p_adapt->pcr_new_base = pcr_new_base;
p_adapt->pcr_new_ext = pcr_new_ext;
return 0;
}
int get_pes_packet_header(unsigned char *pbuf, pes_pkt_hdr_t *p_pes)
{
unsigned char *p_ts = pbuf;
int packet_start_code_prefix;
int stream_id;
int pes_packet_length;
int pes_scrambling_control;
int pes_priority;
int data_alignment_indicator;
int copyright;
int original_or_copy;
int pts_dts_flags;
int escr_flag;
int es_rate_flag;
int dsm_trick_mode_flag;
int additional_copy_info_flag;
int pes_crc_flag;
int pes_extension_flag;
int pes_header_data_length;
int rd_indx = 0;
unsigned int hiTicks;
unsigned int midTicks;
unsigned int loTicks;
int marker_bit = 0;
long long pts_time = 0;
long long dts_time = 0;
packet_start_code_prefix = (p_ts[rd_indx] << 16) | (p_ts[rd_indx + 1] << 8) | (p_ts[rd_indx + 2]);
rd_indx += 3;
stream_id = p_ts[rd_indx++];
pes_packet_length = (p_ts[rd_indx] << 8) | p_ts[rd_indx+1];
rd_indx += 2;
/* PES can be only Audio/Video, so don't check for other stream ids */
pes_scrambling_control = (p_ts[rd_indx] & 0x30) >> 4;
pes_priority = ((p_ts[rd_indx] & 0x8) >> 3);
data_alignment_indicator = ((p_ts[rd_indx] & 0x4) >> 2);
copyright = ((p_ts[rd_indx] & 0x2) >> 1);
original_or_copy = (p_ts[rd_indx++] & 0x1);
pts_dts_flags = ((p_ts[rd_indx++] & 0xC0) >> 6);
pes_header_data_length = p_ts[rd_indx++];
if(pts_dts_flags == 0x2)
{
hiTicks = (p_ts[rd_indx] & 0x0E)>>1;
marker_bit += (p_ts[rd_indx] & 0x01);
rd_indx++;
midTicks = (p_ts[rd_indx] << 7 ) | ((p_ts[rd_indx + 1] & 0xFE) >> 1);
marker_bit += p_ts[rd_indx + 1] & 0x01;
rd_indx += 2;
loTicks = (p_ts[rd_indx] << 7) | ((p_ts[rd_indx + 1] & 0xFE) >> 1);
marker_bit += p_ts[rd_indx + 1] & 0x01;
rd_indx += 2;
pts_time = (long long)(((long long)hiTicks << 30)|((long long)midTicks << 15) | (long long)loTicks);
}
if(pts_dts_flags == 0x3)
{
hiTicks = (p_ts[rd_indx] & 0x0E)>>1;
marker_bit += (p_ts[rd_indx] & 0x01);
rd_indx++;
midTicks = (p_ts[rd_indx] << 7 ) | ((p_ts[rd_indx + 1] & 0xFE) >> 1);
marker_bit += p_ts[rd_indx + 1] & 0x01;
rd_indx += 2;
loTicks = (p_ts[rd_indx] << 7) | ((p_ts[rd_indx + 1] & 0xFE) >> 1);
marker_bit += p_ts[rd_indx + 1] & 0x01;
rd_indx += 2;
pts_time = (long long)(((long long)hiTicks << 30)|((long long)midTicks << 15) | (long long)loTicks);
hiTicks = (p_ts[rd_indx] & 0x0E)>>1;
marker_bit += (p_ts[rd_indx] & 0x01);
rd_indx++;
midTicks = (p_ts[rd_indx] << 7 ) | ((p_ts[rd_indx + 1] & 0xFE) >> 1);
marker_bit += p_ts[rd_indx + 1] & 0x01;
rd_indx += 2;
loTicks = (p_ts[rd_indx] << 7) | ((p_ts[rd_indx + 1] & 0xFE) >> 1);
marker_bit += p_ts[rd_indx + 1] & 0x01;
rd_indx += 2;
dts_time = (long long)(((long long)hiTicks << 30)|((long long)midTicks << 15) | (long long)loTicks);
}
p_pes->packet_start_code_prefix = packet_start_code_prefix;
p_pes->stream_id = stream_id;
p_pes->pes_packet_length = pes_packet_length;
p_pes->pes_header_data_length = pes_header_data_length;
p_pes->pes_scrambling_control = pes_scrambling_control;
p_pes->pes_priority = pes_priority;
p_pes->data_alignment_indicator = data_alignment_indicator;
p_pes->pts_dts_flags = pts_dts_flags;
p_pes->hiTicks = hiTicks;
p_pes->midTicks = midTicks;
p_pes->loTicks = loTicks;
p_pes->marker_bit = marker_bit;
p_pes->pts_time = pts_time;
p_pes->dts_time = dts_time;
return 0;
}
int process_ts_packet(ts_packet_info_t *p_ts_pkt)
{
unsigned char *ts_packet = p_ts_pkt->p_ts_buff;
adapt_field_data_t *p_adapt_data = &p_ts_pkt->adapt_data;
pes_pkt_hdr_t *p_pes_pkt_hdr = &p_ts_pkt->pes_pkt_info;
int rd_indx = 0;
int sync_byte;
int transport_error_indicator;
int payload_unit_start_indicator;
int transport_priority;
int pid;
int transport_scrambling_control;
int adaptation_field_control;
int continuity_counter;
long long pcr_time = 0;
long long pts_time = 0;
long long dts_time = 0;
sync_byte = ts_packet[rd_indx++];
transport_error_indicator = (ts_packet[rd_indx]& 0x80) >> 7;
payload_unit_start_indicator = (ts_packet[rd_indx]& 0x40) >> 6;
transport_priority = (ts_packet[rd_indx] & 0x20) >> 5;
pid = (ts_packet[rd_indx+1])|((ts_packet[rd_indx]&0x1f) << 8);
rd_indx += 2;
transport_scrambling_control = (ts_packet[rd_indx]&0xc0) >> 6;
adaptation_field_control = (ts_packet[rd_indx]&0x30) >> 4;
continuity_counter = (ts_packet[rd_indx++]&0xf);
ts_packet += rd_indx;
TS.zip_TS PES 188 204_ts 204_ts parser
版权申诉
146 浏览量
2022-09-14
18:33:34
上传
评论
收藏 19KB ZIP 举报
我虽横行却不霸道
- 粉丝: 75
- 资源: 1万+