summaryrefslogtreecommitdiffstats
path: root/libavformat/matroskaenc.c
diff options
context:
space:
mode:
authorJames Almer <jamrial@gmail.com>2017-10-21 12:56:33 -0300
committerJames Almer <jamrial@gmail.com>2017-10-21 13:19:36 -0300
commitfd59207c1c86c6a76059b3565d340da9f8f47530 (patch)
tree33323becf3ca7c3b4845acdf4df3bd080d4e92e1 /libavformat/matroskaenc.c
parent13c84b077acecd1e850d41a93dec5c1735d69331 (diff)
parent827a05eaa9482e9ac2a17f7f2e42ead07c1d7574 (diff)
downloadffmpeg-streaming-fd59207c1c86c6a76059b3565d340da9f8f47530.zip
ffmpeg-streaming-fd59207c1c86c6a76059b3565d340da9f8f47530.tar.gz
Merge commit '827a05eaa9482e9ac2a17f7f2e42ead07c1d7574'
* commit '827a05eaa9482e9ac2a17f7f2e42ead07c1d7574': matroskaenc: add support for Spherical Video elements See 58eb0f57f6702d57b6f97ec5010657bb2c076eff. Merged for cosmetics purposes. Also includes changes from d32d59bc977b43031007bb2ab21e232f96d2ebcb Merged-by: James Almer <jamrial@gmail.com>
Diffstat (limited to 'libavformat/matroskaenc.c')
-rw-r--r--libavformat/matroskaenc.c125
1 files changed, 63 insertions, 62 deletions
diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c
index 6f094c4..dad6d6c 100644
--- a/libavformat/matroskaenc.c
+++ b/libavformat/matroskaenc.c
@@ -953,78 +953,79 @@ static int mkv_write_video_color(AVIOContext *pb, AVCodecParameters *par, AVStre
return 0;
}
-static int mkv_write_video_projection(AVFormatContext *s, AVIOContext *pb, AVStream *st)
+static int mkv_write_video_projection(AVFormatContext *s, AVIOContext *pb,
+ AVStream *st)
{
+ AVIOContext b;
+ AVIOContext *dyn_cp;
int side_data_size = 0;
+ int ret, projection_size;
+ uint8_t *projection_ptr;
+ uint8_t private[20];
+
const AVSphericalMapping *spherical =
- (const AVSphericalMapping*) av_stream_get_side_data(st, AV_PKT_DATA_SPHERICAL,
+ (const AVSphericalMapping *)av_stream_get_side_data(st, AV_PKT_DATA_SPHERICAL,
&side_data_size);
- if (side_data_size) {
- AVIOContext *dyn_cp;
- uint8_t *projection_ptr;
- int ret, projection_size;
+ if (!side_data_size)
+ return 0;
- ret = avio_open_dyn_buf(&dyn_cp);
- if (ret < 0)
- return ret;
+ ret = avio_open_dyn_buf(&dyn_cp);
+ if (ret < 0)
+ return ret;
- switch (spherical->projection) {
- case AV_SPHERICAL_EQUIRECTANGULAR:
- put_ebml_uint(dyn_cp, MATROSKA_ID_VIDEOPROJECTIONTYPE,
- MATROSKA_VIDEO_PROJECTION_TYPE_EQUIRECTANGULAR);
- break;
- case AV_SPHERICAL_EQUIRECTANGULAR_TILE:
- {
- AVIOContext b;
- uint8_t private[20];
- ffio_init_context(&b, private, sizeof(private),
- 1, NULL, NULL, NULL, NULL);
- put_ebml_uint(dyn_cp, MATROSKA_ID_VIDEOPROJECTIONTYPE,
- MATROSKA_VIDEO_PROJECTION_TYPE_EQUIRECTANGULAR);
- avio_wb32(&b, 0); // version + flags
- avio_wb32(&b, spherical->bound_top);
- avio_wb32(&b, spherical->bound_bottom);
- avio_wb32(&b, spherical->bound_left);
- avio_wb32(&b, spherical->bound_right);
- put_ebml_binary(dyn_cp, MATROSKA_ID_VIDEOPROJECTIONPRIVATE, private, sizeof(private));
- break;
- }
- case AV_SPHERICAL_CUBEMAP:
- {
- AVIOContext b;
- uint8_t private[12];
- ffio_init_context(&b, private, sizeof(private),
- 1, NULL, NULL, NULL, NULL);
- put_ebml_uint(dyn_cp, MATROSKA_ID_VIDEOPROJECTIONTYPE,
- MATROSKA_VIDEO_PROJECTION_TYPE_CUBEMAP);
- avio_wb32(&b, 0); // version + flags
- avio_wb32(&b, 0); // layout
- avio_wb32(&b, spherical->padding);
- put_ebml_binary(dyn_cp, MATROSKA_ID_VIDEOPROJECTIONPRIVATE, private, sizeof(private));
- break;
- }
- default:
- av_log(s, AV_LOG_WARNING, "Unknown projection type\n");
- goto end;
- }
+ switch (spherical->projection) {
+ case AV_SPHERICAL_EQUIRECTANGULAR:
+ put_ebml_uint(dyn_cp, MATROSKA_ID_VIDEOPROJECTIONTYPE,
+ MATROSKA_VIDEO_PROJECTION_TYPE_EQUIRECTANGULAR);
+ break;
+ case AV_SPHERICAL_EQUIRECTANGULAR_TILE:
+ ffio_init_context(&b, private, 20, 1, NULL, NULL, NULL, NULL);
+ put_ebml_uint(dyn_cp, MATROSKA_ID_VIDEOPROJECTIONTYPE,
+ MATROSKA_VIDEO_PROJECTION_TYPE_EQUIRECTANGULAR);
+ avio_wb32(&b, 0); // version + flags
+ avio_wb32(&b, spherical->bound_top);
+ avio_wb32(&b, spherical->bound_bottom);
+ avio_wb32(&b, spherical->bound_left);
+ avio_wb32(&b, spherical->bound_right);
+ put_ebml_binary(dyn_cp, MATROSKA_ID_VIDEOPROJECTIONPRIVATE,
+ private, avio_tell(&b));
+ break;
+ case AV_SPHERICAL_CUBEMAP:
+ ffio_init_context(&b, private, 12, 1, NULL, NULL, NULL, NULL);
+ put_ebml_uint(dyn_cp, MATROSKA_ID_VIDEOPROJECTIONTYPE,
+ MATROSKA_VIDEO_PROJECTION_TYPE_CUBEMAP);
+ avio_wb32(&b, 0); // version + flags
+ avio_wb32(&b, 0); // layout
+ avio_wb32(&b, spherical->padding);
+ put_ebml_binary(dyn_cp, MATROSKA_ID_VIDEOPROJECTIONPRIVATE,
+ private, avio_tell(&b));
+ break;
+ default:
+ av_log(s, AV_LOG_WARNING, "Unknown projection type\n");
+ goto end;
+ }
- if (spherical->yaw)
- put_ebml_float(dyn_cp, MATROSKA_ID_VIDEOPROJECTIONPOSEYAW, (double)spherical->yaw / (1 << 16));
- if (spherical->pitch)
- put_ebml_float(dyn_cp, MATROSKA_ID_VIDEOPROJECTIONPOSEPITCH, (double)spherical->pitch / (1 << 16));
- if (spherical->roll)
- put_ebml_float(dyn_cp, MATROSKA_ID_VIDEOPROJECTIONPOSEROLL, (double)spherical->roll / (1 << 16));
+ if (spherical->yaw)
+ put_ebml_float(dyn_cp, MATROSKA_ID_VIDEOPROJECTIONPOSEYAW,
+ (double) spherical->yaw / (1 << 16));
+ if (spherical->pitch)
+ put_ebml_float(dyn_cp, MATROSKA_ID_VIDEOPROJECTIONPOSEPITCH,
+ (double) spherical->pitch / (1 << 16));
+ if (spherical->roll)
+ put_ebml_float(dyn_cp, MATROSKA_ID_VIDEOPROJECTIONPOSEROLL,
+ (double) spherical->roll / (1 << 16));
end:
- projection_size = avio_close_dyn_buf(dyn_cp, &projection_ptr);
- if (projection_size) {
- ebml_master projection = start_ebml_master(pb, MATROSKA_ID_VIDEOPROJECTION, projection_size);
- avio_write(pb, projection_ptr, projection_size);
- end_ebml_master(pb, projection);
- }
- av_freep(&projection_ptr);
- }
+ projection_size = avio_close_dyn_buf(dyn_cp, &projection_ptr);
+ if (projection_size) {
+ ebml_master projection = start_ebml_master(pb,
+ MATROSKA_ID_VIDEOPROJECTION,
+ projection_size);
+ avio_write(pb, projection_ptr, projection_size);
+ end_ebml_master(pb, projection);
+ }
+ av_freep(&projection_ptr);
return 0;
}
OpenPOWER on IntegriCloud