Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
jo-chen opened this issue Jul 13, 2013 · 4 comments
Open

Comments

@jo-chen
Copy link

jo-chen commented Jul 13, 2013

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...

@kierank
Copy link
Owner

kierank commented Jul 13, 2013

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.

@joolzg
Copy link

joolzg commented Dec 9, 2014

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

@kierank
Copy link
Owner

kierank commented Dec 9, 2014

obe-vod isn't too bad.

@sujithhs
Copy link

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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants