On Thu, 28 Nov 2013 15:02:58 +0100, Vittorio Giovara
<[email protected]> wrote:
> ---
> 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
"codec level"?
>
>
> 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.
"codec independent" carries no information IMO.
OTOH it should more explicitly say that the data is the AVStereo3D struct
> + */
> + 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 <[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 "common.h"
what is common.h for?
> +#include "stereo3d.h"
> +
> +AVStereo3D *av_stereo3d_alloc(void)
> +{
> + AVStereo3D *data = av_mallocz(sizeof(*data));
> +
> + if (!data)
> + return NULL;
> +
> + return data;
return av_mallocz(sizeof(AVStereo3D));
> +}
> +
> +void av_stereo3d_free(AVStereo3D **data)
I wonder how much point is there in a dedicated destructor, if we want to use
this as side data, since that doesn't allow the side data to have further
substructure.
> +{
> + 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 <[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.
> + */
> +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.
Keep the style consistent. I.e.
Allocate a sidedata and add it to the frame
--
Anton Khirnov
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel