Peter Quiring
Peter Quiring

Reputation: 1706

How to packetize H.263 into RTP packets after stream is encoded with FFMPEG

I have a Java based VoIP Softphone (jPhoneLite) that supports H.263+ and H.264. But currently the H.263 (RFC2190) is incomplete. According to the RFC the data must be split up at MB (macroblock?) boundaries but I have no idea how to find them. If you look at FFMPEG source /libavformat/rtpenc_h263_rfc2190.c in function ff_rtp_send_h263_rfc2190() you can see that the mb boundary info is passed to their packetizer from the encoder somehow. I use ffmpeg to encode my video into H263 data but I don't know if ffmpeg provides a function to obtain these MB pointers/offsets.

https://github.com/FFmpeg/FFmpeg/blob/master/libavformat/rtpenc_h263_rfc2190.c

http://jphonelite.sourceforge.net

Any help? Thanks.

Upvotes: 1

Views: 892

Answers (2)

joni
joni

Reputation: 34

The H.26x bit stream is divided in layers, generally each layer starts with unique sequence of bits.

  1. Picture/frame layer: starting with PSC - picture start code. includes list of GOV - group of blocks .
  2. GOV optionally starts with code. includes list of MB - macro blocks
  3. MB - start with header and ends with code.

You can read about it in section: 3.2 GOB Numbering of rfc2190

After reviewing ffmpeg code, the search for the start code is done by: ff_h263_find_resync_marker_reverse() in rtpenc_h263.c .

Upvotes: 1

Maxim Shoustin
Maxim Shoustin

Reputation: 77910

I prefer open source Jitsi written in Java.

Other option is Linphone, open source as well with good mediastramer2 that supports h263/264 (msx264). You can find relevant code there

Upvotes: 0

Related Questions