stream-deploy/ZLM/3rdpart/media-server/librtp/rtpext/rtp-ext-video-orientation.c

91 lines
4.0 KiB
C++

#include "rtp-ext.h"
#include <inttypes.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <stdio.h>
// https://www.arib.or.jp/english/html/overview/doc/STD-T63V12_00/5_Appendix/Rel13/26/26114-d30.pdf
/*
7.4.5 Coordination of Video Orientation
Coordination of Video Orientation consists in signalling of the current orientation of the image captured on the sender
side to the receiver for appropriate rendering and displaying. When CVO is succesfully negotiated it shall be signalled
by the MTSI client. The signalling of the CVO uses RTP Header Extensions as specified in IETF RFC 5285 [95]. The
one-byte form of the header should be used. CVO information for a 2 bit granularity of Rotation (corresponding to
urn:3gpp:video-orientation) is carried as a byte formatted as follows:
0 1
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| ID | len=0 |0 0 0 0 C F R R|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Bit# 7 6 5 4 3 2 1 0(LSB)
Definition 0 0 0 0 C F R1 R0
With the following definitions:
C = Camera: indicates the direction of the camera used for this video stream. It can be used by the MTSI client in
receiver to e.g. display the received video differently depending on the source camera.
0: Front-facing camera, facing the user. If camera direction is unknown by the sending MTSI client in the terminal then this is the default value used.
1: Back-facing camera, facing away from the user.
F = Flip: indicates a horizontal (left-right flip) mirror operation on the video as sent on the link.
0: No flip operation. If the sending MTSI client in terminal does not know if a horizontal mirror operation is necessary, then this is the default value used.
1: Horizontal flip operation
R1, R0 = Rotation: indicates the rotation of the video as transmitted on the link. The receiver should rotate the video to
compensate that rotation. E.g. a 90¡ã Counter Clockwise rotation should be compensated by the receiver with a 90¡ã
Clockwise rotation prior to displaying.
Table 7.2: Rotation signalling for 2 bit granularity
R1 R0 Rotation of the video as sent on the link Rotation on the receiver before display
0 0 0¡ã rotation None
0 1 90¡ã Counter Clockwise (CCW) rotation or 90¡ã CW rotation
270¡ã Clockwise (CW) rotation
1 0 180¡ã CCW rotation or 180¡ã CW rotation 180¡ã CW rotation
1 1 270¡ã CCW rotation or 90¡ã CW rotation 90¡ã CCW rotation
CVO information for a higher granularity of Rotation (corresponding to urn:3GPP:video-orientation:6) is carried as a
byte formatted as follows:
Bit# 7 6 5 4 3 2 1 0(LSB)
Definition R5 R4 R3 R2 C F R1 R0
where C and F are as defined above and the bits R5,R4,R3,R2,R1,R0 represent the Rotation, which indicates the
rotation of the video as transmitted on the link. Table 7.3 describes the rotation to be applied by the receiver based on
the rotation bits.
Table 7.3: Rotation signalling for 6 bit granularity
R1 R0 R5 R4 R3 R2 Rotation of the video as Rotation on the receiver
sent on the link before display
0 0 0 0 0 0 0¡ã rotation None
0 0 0 0 0 1 (360/64)¡ã Counter Clockwise (360/64)¡ã CW rotation
(CCW) rotation
0 0 0 0 1 0 (2*360/64)¡ã CCW rotation (2*360/64)¡ã CW rotation
. . . . . . . .
. . . . . . . .
. . . . . . . .
1 1 1 1 1 0 (62*360/64)¡ã CCW rotation (2*360/64)¡ã CCW rotation
1 1 1 1 1 1 (63*360/64)¡ã CCW rotation (360/64)¡ã CCW rotation
*/
int rtp_ext_video_orientation_parse(const uint8_t* data, int bytes, struct rtp_ext_video_orientation_t *ext)
{
assert(1 == bytes);
if (bytes < 1)
return -1;
ext->camera = (data[0] >> 3) & 0x01;
ext->flip = (data[0] >> 2) & 0x01;
ext->rotaion = (data[0] & 0x03) * 90;
return 0;
}
int rtp_ext_video_orientation_write(uint8_t* data, int bytes, const struct rtp_ext_video_orientation_t* ext)
{
if (bytes < 1)
return -1;
data[0] = ext->camera ? 0x04 : 0;
data[0] |= ext->flip ? 0x03 : 0;
data[0] |= (ext->rotaion / 90) & 0x03;
return 1;
}