On Fri, 6 Dec 2013 10:30:52 +0100, Vittorio Giovara
<[email protected]> wrote:
> ---
> All comments addressed.
> Added a note that mentions this data structure is to be used as side data and
> can be freed with av_freep().
> Vittorio
>
> Changelog | 1 +
> doc/APIchanges | 4 ++
> libavutil/Makefile | 2 +
> libavutil/frame.h | 6 +++
> libavutil/stereo3d.c | 40 ++++++++++++++
> libavutil/stereo3d.h | 147
> ++++++++++++++++++++++++++++++++++++++++++++++++++
> libavutil/version.h | 2 +-
> 7 files changed, 201 insertions(+), 1 deletion(-)
> create mode 100644 libavutil/stereo3d.c
> create mode 100644 libavutil/stereo3d.h
>
> diff --git a/Changelog b/Changelog
> index 9747720..2fd3ff4 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
> +- stereoscopic 3d 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.
mention the stereo3d header and its contents too (no need to enumerate all of
them I think, just summarize what's there)
> +
> 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..7dc9b9d 100644
> --- a/libavutil/frame.h
> +++ b/libavutil/frame.h
> @@ -41,6 +41,12 @@ enum AVFrameSideDataType {
> * The number of bytes of CC data is AVFrameSideData.size.
> */
> AV_FRAME_DATA_A53_CC,
> + /**
> + * Stereoscopic 3d metadata.
> + * Data is saved in an AVStereo3D struct, defined in
> libavutil/stereo3d.h,
> + * and then saved in the AVFrameSideData.data field.
nit: I'd write this simply as 'The data is the AVStereo3D struct defined in ...'
> + */
> + AV_FRAME_DATA_STEREO3D,
> };
>
> typedef struct AVFrameSideData {
> diff --git a/libavutil/stereo3d.c b/libavutil/stereo3d.c
> new file mode 100644
> index 0000000..850fd75
> --- /dev/null
> +++ b/libavutil/stereo3d.c
> @@ -0,0 +1,40 @@
> +/*
> + * Copyright (c) 2013 Vittorio Giovara <[email protected]>
> + *
> + * 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 "mem.h"
> +#include "stereo3d.h"
> +
> +AVStereo3D *av_stereo3d_alloc(void)
> +{
> + return av_mallocz(sizeof(AVStereo3D));
> +}
> +
> +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..6337fe4
> --- /dev/null
> +++ b/libavutil/stereo3d.h
> @@ -0,0 +1,147 @@
> +/*
> + * Copyright (c) 2013 Vittorio Giovara <[email protected]>
> + *
> + * 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.
Mention that the struct must be allocated with av_stereo3d_alloc() and that its
size is not a part of the public ABI.
Otherwise I think this is fine.
--
Anton Khirnov
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel