Hi All,

I'm trying to stream (unicast) an H264 from elementary stream file. The final 
goal is to stream NAL packets from a hardware encoder but this should be easily 
adopted once the file streamer works.
The ES file was created by a remux software and is playable by mplayer.

The problem is my streamer exits after about 1 sec and the afterPlaying 
callback is called. The ByteStreamFileSource::doGetNextFrame() function fails 
on feof(fFid) with 16, which means the code trys to read 16 bytes past the end 
of file marker.

This is what I do to stream it:

        Groupsock rtpGroupsock(*env, destinationAddress, rtpPort, ttl);
        Groupsock rtcpGroupsock(*env, destinationAddress, rtcpPort, ttl);

videoSink = SimpleRTPSink::createNew(*env, &rtpGroupsock, 33, 90000, "video", 
"mp2t", 1, True, False /*no 'M' bit*/);

estimatedSessionBandwidth = 5000; // in kbps; for RTCP b/w share
        const unsigned maxCNAMElen = 100;
        unsigned char CNAME[maxCNAMElen+1];
        gethostname((char*)CNAME, maxCNAMElen);
        CNAME[maxCNAMElen] = '\0'; // just in case
        RTCPInstance* rtcp = RTCPInstance::createNew(*env, &rtcpGroupsock,
                estimatedSessionBandwidth, CNAME,
                videoSink, NULL /* we're a server */, false);

        play();

        env->taskScheduler().doEventLoop(&exit_flag); // does not return
        Medium::close(videoSource);
        Medium::close(rtcp);
        return 0; // only to prevent compiler warning
}

void afterPlaying(void* /*clientData*/)
{
        *env << "...done reading from file\n";
        exit_flag = 1;
}

void play()
{
        unsigned const inputDataChunkSize = 7*188;

        // Open the input file as a 'byte-stream file source':
        ByteStreamFileSource* videoFile
                = ByteStreamFileSource::createNew(*env, video, 
inputDataChunkSize);

        if (!videoFile )
                exit(1);

        // Create a 'framer' for the input source (to give us proper 
inter-packet gaps):
        videoSource = MPEG2TransportStreamFromESSource::createNew(*env);
        
((MPEG2TransportStreamFromESSource*)videoSource)->addNewVideoSource(videoFile, 
10);

        // Finally, start playing:
        *env << "Beginning to read from file...\n";
        videoSink->startPlaying(*videoSource, afterPlaying, videoSink);
}

What am I missing here?

_______________________________________________
live-devel mailing list
[email protected]
http://lists.live555.com/mailman/listinfo/live-devel

Reply via email to