00001
00002
00003
00004
00005
00006 #ifndef _PES_H_
00007 #define _PES_H_
00008
00009 #include <stdint.h>
00010 #include "ringbuffer.h"
00011
00012 #define TS_HEADER_MIN 4
00013 #define PS_HEADER_L1 14
00014 #define PS_HEADER_L2 (PS_HEADER_L1+24)
00015 #define PES_MIN 7
00016 #define PES_H_MIN 9
00017
00018 #define SYSTEM_START_CODE_S 0xB9
00019 #define SYSTEM_START_CODE_E 0xFF
00020 #define PACK_START 0xBA
00021 #define SYS_START 0xBB
00022 #define PROG_STREAM_MAP 0xBC
00023 #define PRIVATE_STREAM1 0xBD
00024 #define PADDING_STREAM 0xBE
00025 #define PRIVATE_STREAM2 0xBF
00026 #define AUDIO_STREAM_S 0xC0
00027 #define AUDIO_STREAM_E 0xDF
00028 #define VIDEO_STREAM_S 0xE0
00029 #define VIDEO_STREAM_E 0xEF
00030 #define ECM_STREAM 0xF0
00031 #define EMM_STREAM 0xF1
00032 #define DSM_CC_STREAM 0xF2
00033 #define ISO13522_STREAM 0xF3
00034 #define PROG_STREAM_DIR 0xFF
00035
00036
00037 #define PTS_DTS_FLAGS 0xC0
00038 #define ESCR_FLAG 0x20
00039 #define ES_RATE_FLAG 0x10
00040 #define DSM_TRICK_FLAG 0x08
00041 #define ADD_CPY_FLAG 0x04
00042 #define PES_CRC_FLAG 0x02
00043 #define PES_EXT_FLAG 0x01
00044
00045
00046 #define PTS_ONLY 0x80
00047 #define PTS_DTS 0xC0
00048
00049 #define MAX_PLENGTH 0xFFFF
00050 #define MMAX_PLENGTH (8*MAX_PLENGTH)
00051
00052 #define MAX_PTS (0x0000000200000000ULL)
00053 #define MAX_PTS2 (300* MAX_PTS)
00054
00055 typedef
00056 struct ps_packet_{
00057 uint8_t scr[6];
00058 uint8_t mux_rate[3];
00059 uint8_t stuff_length;
00060 uint8_t *data;
00061 uint8_t sheader_llength[2];
00062 int sheader_length;
00063 uint8_t rate_bound[3];
00064 uint8_t audio_bound;
00065 uint8_t video_bound;
00066 uint8_t reserved;
00067 int npes;
00068 } ps_packet;
00069
00070
00071 typedef
00072 struct pes_in_s{
00073 int type;
00074 unsigned int found;
00075 int withbuf;
00076 uint8_t *buf;
00077 ringbuffer *rbuf;
00078 uint8_t hbuf[260];
00079 int ini_pos;
00080 uint8_t cid;
00081 uint32_t plength;
00082 uint8_t plen[4];
00083 uint8_t flag1;
00084 uint8_t flag2;
00085 uint8_t hlength;
00086 uint8_t pts[5];
00087 uint8_t dts[5];
00088 int mpeg;
00089 int done;
00090 int which;
00091 void *priv;
00092 } pes_in_t;
00093
00094
00095 void init_pes_in(pes_in_t *p, int type, ringbuffer *rb, int wi);
00096 void get_pes (pes_in_t *p, uint8_t *buf, int count, void (*func)(pes_in_t *p));
00097 void printpts(int64_t pts);
00098 void printptss(int64_t pts);
00099 int64_t ptsdiff(uint64_t pts1, uint64_t pts2);
00100 uint64_t uptsdiff(uint64_t pts1, uint64_t pts2);
00101 int ptscmp(uint64_t pts1, uint64_t pts2);
00102 uint64_t ptsadd(uint64_t pts1, uint64_t pts2);
00103
00104
00105 int write_pes_header(uint8_t id, int length , uint64_t PTS, uint64_t DTS,
00106 uint8_t *obuf, int stuffing, uint8_t ptsdts);
00107 void write_padding_pes( int pack_size, int extcnt,
00108 uint64_t SCR, uint64_t muxr, uint8_t *buf);
00109 int write_ac3_pes( int pack_size, int extcnt, int n, uint64_t pts,
00110 uint64_t SCR,
00111 uint32_t muxr, uint8_t *buf, int *alength, uint8_t ptsdts,
00112 int nframes,int ac3_off, ringbuffer *ac3rbuffer);
00113 int write_audio_pes( int pack_size, int extcnt, int n, uint64_t pts,
00114 uint64_t SCR, uint32_t muxr, uint8_t *buf, int *alength,
00115 uint8_t ptsdts, ringbuffer *arbuffer);
00116 int write_video_pes( int pack_size, int extcnt, uint64_t vpts,
00117 uint64_t vdts, uint64_t SCR, uint64_t muxr,
00118 uint8_t *buf, int *vlength,
00119 uint8_t ptsdts, ringbuffer *vrbuffer);
00120 int write_nav_pack(int pack_size, int extcnt, uint64_t SCR, uint32_t muxr,
00121 uint8_t *buf);
00122
00123
00124 static inline void ptsdec(uint64_t *pts1, uint64_t pts2)
00125 {
00126 *pts1= uptsdiff(*pts1, pts2);
00127 }
00128
00129 static inline void ptsinc(uint64_t *pts1, uint64_t pts2)
00130 {
00131 *pts1 = (*pts1 + pts2)%MAX_PTS2;
00132 }
00133
00134
00135
00136
00137 #endif