|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990 |
- #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;
- }
|