libmpegts icon indicating copy to clipboard operation
libmpegts copied to clipboard

How to compile and use - I am getting garbled NAL units in MPEG-TS

Open jo-chen opened this issue 11 years ago • 4 comments

Hi,

thank you for the great effort to create this library. I am trying to use it in my own project, however, I am getting garbled output in the mpeg-ts with AVC.

I have tried the following versions (2013/07/13) libmpegts-master libmpegts-obe-master libmpegts-20130401-STABLE

I have used the following compilers: gcc version 4.4.1 (Ubuntu 4.4.1-4ubuntu9), Target: x86_64-linux-gnu gcc version 4.7.3 (rev1, Built by MinGW-builds project), Target: i686-w64-mingw32 gcc version 4.7.3 (rev1, Built by MinGW-builds project), Target: x86_64-w64-mingw32

The generated MPEG-TS is fine, e.g. tsreport (of tstools) as well as code.google.com/p/tsdemuxer can handle it without complaints. However, the demuxed set of NAL units is garbled. When I do a binary diff with the original bytestream, I can observe that there are a couple of bytes missing and some are inserted. The extracted h264 bitstream is also shorter than the original.

As I am using 32bit and 64 bit compilers on both Win and Linux and the problem persists, this seems to be a problem of compiling the libmpegts objects. Can you give me any hints on why this is happening and how to avoid it?

Here's the code for initialization of libmpegts

ts_program_t tsprog = {0}; tsprog.num_streams = 1; tsprog.pcr_pid = 110; tsprog.pmt_pid = 120; tsprog.program_num = 1; tsprog.sdt.provider_name = provider_name; tsprog.sdt.service_name = service_name; tsprog.sdt.service_type = 0x19;

tsprog.streams = (ts_stream_t_) calloc( tsprog.num_streams, sizeof(_tsprog.streams) ); if( !tsprog.streams ) { fprintf( stderr, "malloc failed\n" ); return 1; }

tsprog.streams[0].pid = 130; tsprog.streams[0].stream_format = LIBMPEGTS_VIDEO_AVC; tsprog.streams[0].hdmv_video_format = LIBMPEGTS_HDMV_1080P; tsprog.streams[0].hdmv_frame_rate = 25; tsprog.streams[0].hdmv_aspect_ratio = LIBMPEGTS_HDMV_AR_16_9; tsprog.streams[0].stream_id = 224;

ts_main_t tsmain = {0}; tsmain.muxrate = 200000000; tsmain.num_programs = 1; tsmain.pat_period = 50; tsmain.pcr_period = 40; tsmain.programs = &tsprog; tsmain.sdt_period = 1000; tsmain.ts_id = 1; tsmain.ts_type = TS_TYPE_GENERIC; tswriter = ts_create_writer(); int tsts_ret = ts_setup_transport_stream(tswriter,&tsmain); if(tsts_ret < 0) return 0;

int tsvideo_ret = ts_setup_mpegvideo_stream(tswriter,130,30,AVC_MAIN,0,0,0); if (tsvideo_ret < 0) return 0;

... When a NAL unit is ready, the following code is executed

ts_frame_t coded_frames[1]; coded_frames[0].cpb_final_arrival_time = cbp_fat; coded_frames[0].cpb_initial_arrival_time = cbp_iat; coded_frames[0].pts = pts; coded_frames[0].dts = dts; coded_frames[0].frame_type = type;

coded_frames[0].data = data; coded_frames[0].size = data_len; coded_frames[0].pid = 130;

uint8_t *output; int len; int64_t *pcrlist;

int ret = ts_write_frames(tswriter,&coded_frames[0],1,&output,&len,&pcrlist);

if(len) write...

jo-chen avatar Jul 13 '13 10:07 jo-chen

The code looks ok but there might be something missing. Your timestamps have to be in 27MHz units if they are not already. Each frame must contain an entire H264 access unit though.

kierank avatar Jul 13 '13 18:07 kierank

is there a proper test example anywhere for using this library?

joolzg avatar Dec 09 '14 11:12 joolzg

obe-vod isn't too bad.

kierank avatar Dec 09 '14 11:12 kierank

In case of VBR TS muxing, how will PCR get computed in function get_pcr_int? I am trying to figure out what value needs to be set to the TS params variable - "muxrate" for VBR.

sujithhs avatar Apr 24 '18 08:04 sujithhs