--- Changelog | 1 + doc/APIchanges | 4 ++ libavutil/Makefile | 2 + libavutil/frame.h | 4 ++ libavutil/stereo3d.c | 53 ++++++++++++++++++ libavutil/stereo3d.h | 152 ++++++++++++++++++++++++++++++++++++++++++++++++++ libavutil/version.h | 2 +- 7 files changed, 217 insertions(+), 1 deletion(-) create mode 100644 libavutil/stereo3d.c create mode 100644 libavutil/stereo3d.h
diff --git a/Changelog b/Changelog index 9747720..78b3338 100644 --- a/Changelog +++ b/Changelog @@ -50,6 +50,7 @@ version 10: - VP9 decoder - support for decoding through VDPAU in avconv (the -hwaccel option) - remove mp3_header_(de)compress bitstream filters +- codec level stereoscopic metadata handling version 9: diff --git a/doc/APIchanges b/doc/APIchanges index 1e380e9..cef97f2 100644 --- a/doc/APIchanges +++ b/doc/APIchanges @@ -13,6 +13,10 @@ libavutil: 2012-10-22 API changes, most recent first: +2013-11-xx - xxxxxxx- - lavu 52.20.0 - frame.h + Add AV_FRAME_DATA_STEREO3D value to the AVFrameSideDataType enum, which + identifies codec-independent stereo3d information. + 2013-11-xx - xxxxxxx- - lavu 52.19.0 - frame.h Add AV_FRAME_DATA_A53_CC value to the AVFrameSideDataType enum, which identifies ATSC A53 Part 4 Closed Captions data. diff --git a/libavutil/Makefile b/libavutil/Makefile index 9381c77..a635725 100644 --- a/libavutil/Makefile +++ b/libavutil/Makefile @@ -41,6 +41,7 @@ HEADERS = adler32.h \ rational.h \ samplefmt.h \ sha.h \ + stereo3d.h \ time.h \ version.h \ xtea.h \ @@ -93,6 +94,7 @@ OBJS = adler32.o \ rc4.o \ samplefmt.o \ sha.o \ + stereo3d.o \ time.o \ tree.o \ utils.o \ diff --git a/libavutil/frame.h b/libavutil/frame.h index d869d83..e4e57a0 100644 --- a/libavutil/frame.h +++ b/libavutil/frame.h @@ -41,6 +41,10 @@ enum AVFrameSideDataType { * The number of bytes of CC data is AVFrameSideData.size. */ AV_FRAME_DATA_A53_CC, + /** + * Codec independent stereo3d metadata, defined in libavutil/stereo3d.h. + */ + AV_FRAME_DATA_STEREO3D, }; typedef struct AVFrameSideData { diff --git a/libavutil/stereo3d.c b/libavutil/stereo3d.c new file mode 100644 index 0000000..559b43d --- /dev/null +++ b/libavutil/stereo3d.c @@ -0,0 +1,53 @@ +/* + * Copyright (c) 2013 Vittorio Giovara <vittorio.giov...@gmail.com> + * + * This file is part of Libav. + * + * Libav is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * Libav is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with Libav; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include <stdint.h> + +#include "common.h" +#include "stereo3d.h" + +AVStereo3D *av_stereo3d_alloc(void) +{ + AVStereo3D *data = av_mallocz(sizeof(*data)); + + if (!data) + return NULL; + + return data; +} + +void av_stereo3d_free(AVStereo3D **data) +{ + if (!data || !*data) + return; + + av_freep(data); +} + +AVStereo3D *av_stereo3d_create_side_data(AVFrame *frame) +{ + AVFrameSideData *side_data = av_frame_new_side_data(frame, + AV_FRAME_DATA_STEREO3D, + sizeof(AVStereo3D)); + if (!side_data) + return NULL; + + return (AVStereo3D *)side_data->data; +} diff --git a/libavutil/stereo3d.h b/libavutil/stereo3d.h new file mode 100644 index 0000000..31f4ae7 --- /dev/null +++ b/libavutil/stereo3d.h @@ -0,0 +1,152 @@ +/* + * Copyright (c) 2013 Vittorio Giovara <vittorio.giov...@gmail.com> + * + * This file is part of Libav. + * + * Libav is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * Libav is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with Libav; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include <stdint.h> + +#include "frame.h" + +/** + * List of possible 3D Types + */ +enum AVStereo3DType { + /** + * Video is not stereoscopic (and metadata has to be there). + */ + AV_STEREO3D_2D, + + /** + * Views are next to each other. + * + * LLLLRRRR + * LLLLRRRR + * LLLLRRRR + * ... + */ + AV_STEREO3D_SIDEBYSIDE, + + /** + * Views are on top of each other. + * + * LLLLLLLL + * LLLLLLLL + * RRRRRRRR + * RRRRRRRR + */ + AV_STEREO3D_TOPBOTTOM, + + /** + * Views are alternated temporally. + * + * frame0 frame1 frame2 ... + * LLLLLLLL RRRRRRRR LLLLLLLL + * LLLLLLLL RRRRRRRR LLLLLLLL + * LLLLLLLL RRRRRRRR LLLLLLLL + * ... ... ... + */ + AV_STEREO3D_FRAMESEQUENCE, + + /** + * Views are packed in a checkerboard-like structure per pixel. + * + * LRLRLRLR + * RLRLRLRL + * LRLRLRLR + * ... + */ + AV_STEREO3D_CHECKERBOARD, + + /** + * Views are next to each other, but when upscaling + * apply a checkerboard pattern. + * + * LLLLRRRR L L L L R R R R + * LLLLRRRR => L L L L R R R R + * LLLLRRRR L L L L R R R R + * LLLLRRRR L L L L R R R R + */ + AV_STEREO3D_SIDEBYSIDE_QUINCUNX, + + /** + * Views are packed per line, as if interlaced. + * + * LLLLLLLL + * RRRRRRRR + * LLLLLLLL + * ... + */ + AV_STEREO3D_LINES, + + /** + * Views are packed per column. + * + * LRLRLRLR + * LRLRLRLR + * LRLRLRLR + * ... + */ + AV_STEREO3D_COLUMNS, +}; + + +/** + * Inverted views, Right/Bottom represents the left view. + */ +#define AV_STEREO3D_FLAG_INVERT (1 << 0) + +/** + * Stereo 3D type: this structure describes how two videos are packed + * within a single video surface, with additional information like views + * order and subsampling if available. + */ +typedef struct AVStereo3D { + /** + * How views are packed within the video. + */ + enum AVStereo3DType type; + + /** + * Additional information about the frame packing. + */ + int flags; +} AVStereo3D; + +/** + * Allocate an AVStereo3D structure and set its fields to default values. + * The resulting struct must be freed using av_stereo3d_free(). + * + * @return An AVStereo3D filled with default values or NULL on failure. + */ +AVStereo3D *av_stereo3d_alloc(void); + +/** + * Free the AVStereo3D structure. + * + * @param The stereo struct to be freed. The pointer will be set to NULL. + */ +void av_stereo3d_free(AVStereo3D **data); + +/** + * Allocates a complete AVFrameSideData and adds it to the frame. + * + * @param The frame on which the side data is added to. + * + * @return The AVStereo3D structure to be filled by caller. + */ +AVStereo3D *av_stereo3d_create_side_data(AVFrame *frame); diff --git a/libavutil/version.h b/libavutil/version.h index fa1f53b..dad8e2f 100644 --- a/libavutil/version.h +++ b/libavutil/version.h @@ -37,7 +37,7 @@ */ #define LIBAVUTIL_VERSION_MAJOR 52 -#define LIBAVUTIL_VERSION_MINOR 19 +#define LIBAVUTIL_VERSION_MINOR 20 #define LIBAVUTIL_VERSION_MICRO 0 #define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \ -- 1.7.9.5 _______________________________________________ libav-devel mailing list libav-devel@libav.org https://lists.libav.org/mailman/listinfo/libav-devel