1
0
mirror of https://github.com/FFmpeg/FFmpeg.git synced 2024-12-23 12:43:46 +02:00

avframe: add codec-independent stereoscopic metadata

This commit is contained in:
Vittorio Giovara 2013-11-28 14:47:13 +01:00
parent d64341e498
commit 7e244c6860
7 changed files with 200 additions and 1 deletions

View File

@ -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:

View File

@ -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 and
stereo3d.h API, that identify 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.

View File

@ -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 \

View File

@ -41,6 +41,11 @@ enum AVFrameSideDataType {
* The number of bytes of CC data is AVFrameSideData.size.
*/
AV_FRAME_DATA_A53_CC,
/**
* Stereoscopic 3d metadata.
* The data is the AVStereo3D struct defined in libavutil/stereo3d.h.
*/
AV_FRAME_DATA_STEREO3D,
};
typedef struct AVFrameSideData {

40
libavutil/stereo3d.c Normal file
View File

@ -0,0 +1,40 @@
/*
* Copyright (c) 2013 Vittorio Giovara <vittorio.giovara@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 "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;
}

147
libavutil/stereo3d.h Normal file
View File

@ -0,0 +1,147 @@
/*
* Copyright (c) 2013 Vittorio Giovara <vittorio.giovara@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 as needed.
*
* @note The struct must be allocated with av_stereo3d_alloc() and
* its size is not a part of the public ABI.
*/
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 can be freed using av_freep().
*
* @return An AVStereo3D filled with default values or NULL on failure.
*/
AVStereo3D *av_stereo3d_alloc(void);
/**
* Allocate a complete AVFrameSideData and add 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);

View File

@ -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, \