RCS video sharing 服务中视频方向和camera选项编解码

使用情景:算法

视频创建之后,发送方颇有可能会随意旋转设备的方向,这样其采集的数据也是旋转过的,到了接收方后,显示就会有问题(如,颠倒等)。为了维护发送方和接收方可以实时的同步视频方向,会话须要协同它们的方向步调。tcp

         若是须要支持该功能,须要在发送方invite消息的SDP协议消息中加入如下属性:ide

a=extmap:7 urn:3gpp:video-orientation,接收方收到之后,也会在响应中加入该tag属性,这样就完成了该功能的协商。Tag中的7是扩展数据帧的扩展id,能够是1-15中的任何一个,用来标识该方向数据的位置,具体参考RFC5285。更多描述参考RCC.07- 2.7.1.2.2。以上所述的视频方向其实包含了数据的方向和发送方camera的选项(前置或者后置),为了方便起见,一下都称为视频方向数据。编码

获取本身的视频方向:spa

获取本身的视频实时方向,须要用到AndroidDisplaySurface两个类,经过他们的配合就能够获取出当前camera视频的方向,最终是一个int值。值得注意的是,这两个类获取出来的方向的整数值不必定同样,这须要看设备的环境,好比先后摄像头等。视频

获取对方的视频方向:同步

视频发送方将其视频方向进行封装(具体方式见9.3),封装之后,放在视频数据帧的一个扩展位置,而后随视频帧一块儿打包后经过rtp/rtcp/udp发送给接收方。接收方收到视频帧数据后,能够在帧的扩展位置将视频方向获取出来,而后,在实时的调整到surface view上面。这样,接收方就能够实时的根据发送方的视频方向来调整本身的显示方向。it

具体封装打包,参考RFC3550io

视频方向格式及编解码class

9-1RCC.07- 2.7.1.2.2中定义的rtp帧中的扩展数据,该数据是用一个8位字节进行编码的。前面四位是预留位,用于其余未来用途,后面四位中,从高到低,第一位是视频发送方camera的选项,可编码出2camera选项;后三位是视频数据的方向,能够编码出8种视频方向。

 

9-1 视频方向数据格式

9-1 发送方的方向编码


如表9-1所示为视频方向中的前4种旋转编码。

如表9-2所示为camera2中选项编码。

9-2 发送方camera选项编码

这样配合图9-1,表9-1和表9-2就能够完成一帧视频数据的方向编解码了,具体以下:

编码:

camera选项位和视频方向位四位编码后的数据映射成十进制数字,就是该帧方向编码后的整数值了。好比发送方当前是后置摄像头而且视频顺时针旋转了90度,那么四位编码则是1011,转换成十进制就是11,那么接收方经过帧中的扩展位数据获得的就是11

位运算法则:total = (camera << 3) | orientation

 

解码:

接收方的到11后,对应的转换成二进制就是1011,获取第四位就是发送方camera的选项,获取后三位就是视频的方向。

位运算法则:

Camera = (total & 0x08) >> 3;

Orientation = total & 0x07;