[Freeswitch-dev] Video synchronization

Paulo Rogério Panhoto paulo at voicetechnology.com.br
Tue Jul 13 14:22:37 PDT 2010


Perhaps threading is the best to do. Does FS handle calls in separate
threads?

2010/7/13 Anthony Minessale <anthony.minessale at gmail.com>

> without threads for both it would require doing non blocking reads on the
> rtp streams.
> We have some provisions in the code for being able to do this but I am not
> sure it's been proven to work.
> We can always try to dust it off.
>
> I think its done by passing the io_flag SWITCH_IO_FLAG_NOBLOCK to the
> read_frame call.
>
> Another idea would be to open the audio and video tracks separately each in
> it's own thread and play them independently since it's 2 different IP
> streams.
>
>
>
> 2010/7/13 Paulo Rogério Panhoto <paulo at voicetechnology.com.br>
>
>>      I've found a way to synchronize the A/V streams with usleep() but I
>> don't think that's the best way to do this. Is there a switch_core....
>> function to perform a similar task (and maybe allow other tasks to run)?
>>
>>
>>     Here's the current version of the playback loop (that takes into
>> consideration multiple RTP packets per video frame) :
>>
>>         u_int64_t videoNext = 0, audioNext = 0;
>>         u_int64_t ts = 0;
>>
>>         bool videoSent = true, audioSent = true;
>>
>>         while (switch_channel_ready(channel))
>>         {
>>             bool vOk, aOk;
>>             if(videoSent)
>>
>>             {
>>                 vid_frame.packetlen = vid_frame.buflen;
>>                 vOk = vc.getVideoPacket(vid_frame.packet,
>> vid_frame.packetlen);
>>                 if (vOk)
>>                 {
>>                     switch_rtp_hdr_t *hdr =
>> reinterpret_cast<switch_rtp_hdr_t *>(vid_frame.packet);
>>
>>                     videoNext =
>> vc.videoTrack().track.get90KTimestamp(ntohl(hdr->ts));
>>                     hdr->ts = htonl(videoNext);
>>
>>                     if (pt)
>>                         hdr->pt = pt;
>>                 }
>>                 videoSent = false;
>>             }
>>             if(audioSent)
>>
>>             {
>>                 write_frame.datalen = write_frame.buflen;
>>                 aOk = vc.getAudioPacket(write_frame.data,
>> write_frame.datalen);
>>                 audioSent = false;
>>             }
>>
>>             if (!vOk && !aOk)
>>                 break;
>>
>>
>>             int64_t wait = min(audioNext, videoNext) - ts;
>>             if(wait > 0)
>>             {
>>                 /* wait the time for the next A/V frame */
>>                 usleep(wait * 1000 / 90);
>>                 //switch_core_timer_next(&timer);
>>                 ts += wait;
>>             }
>>
>>             if (switch_channel_test_flag(channel, CF_VIDEO) && ts >=
>> videoNext)
>>
>>             {
>>                 switch_byte_t *data = (switch_byte_t *) vid_frame.packet;
>>
>>                 vid_frame.data = data + 12;
>>                 vid_frame.datalen = vid_frame.packetlen - 12;
>>                 switch_core_session_write_video_frame(session, &vid_frame,
>> SWITCH_IO_FLAG_NONE, 0);
>>                 videoSent = true;
>>             }
>>
>>             if(aOk && ts >= audioNext)
>>
>>             {
>>                 if (write_frame.datalen > (int) write_frame.buflen)
>>                     write_frame.datalen = write_frame.buflen;
>>
>>                 switch_core_session_write_frame(session, &write_frame,
>> SWITCH_IO_FLAG_NONE, 0);
>>                 audioSent = true;
>>                 audioNext += 90000 / 50; // 20ms
>>             }
>>         }
>>
>>     Btw, thanks for the tip. I'll keep the separate thread to store video
>> for the record function.
>>
>>     Regards,
>>
>>     Paulo
>>
>>
>> On 13/07/10 15:39, Anthony Minessale wrote:
>>
>> we need to get nonblocking reads to the rtp working so the
>>
>>   read_video_frame();
>>    read_audio_frame();
>>
>>  don't block when there is no data.
>>
>>
>>
>> _______________________________________________
>> FreeSWITCH-dev mailing list
>> FreeSWITCH-dev at lists.freeswitch.org
>> http://lists.freeswitch.org/mailman/listinfo/freeswitch-dev
>> UNSUBSCRIBE:http://lists.freeswitch.org/mailman/options/freeswitch-dev
>> http://www.freeswitch.org
>>
>>
>
>
> --
> Anthony Minessale II
>
> FreeSWITCH http://www.freeswitch.org/
> ClueCon http://www.cluecon.com/
> Twitter: http://twitter.com/FreeSWITCH_wire
>
> AIM: anthm
> MSN:anthony_minessale at hotmail.com <MSN%3Aanthony_minessale at hotmail.com>
> GTALK/JABBER/PAYPAL:anthony.minessale at gmail.com<PAYPAL%3Aanthony.minessale at gmail.com>
> IRC: irc.freenode.net #freeswitch
>
> FreeSWITCH Developer Conference
> sip:888 at conference.freeswitch.org <sip%3A888 at conference.freeswitch.org>
> googletalk:conf+888 at conference.freeswitch.org<googletalk%3Aconf%2B888 at conference.freeswitch.org>
> pstn:+19193869900
>
> _______________________________________________
> FreeSWITCH-dev mailing list
> FreeSWITCH-dev at lists.freeswitch.org
> http://lists.freeswitch.org/mailman/listinfo/freeswitch-dev
> UNSUBSCRIBE:http://lists.freeswitch.org/mailman/options/freeswitch-dev
> http://www.freeswitch.org
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.freeswitch.org/pipermail/freeswitch-dev/attachments/20100713/d507bfbf/attachment-0001.html 


More information about the FreeSWITCH-dev mailing list