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

Reply via email to