Commit 1720791e authored by Kirill Gavrilov's avatar Kirill Gavrilov Committed by Vittorio Giovara

png: read and write stereo3d frame side data information

Use optional sTER chunk defining side-by-side stereo pair
within "Extensions to the PNG 1.2 Specification", version 1.3.0.
Signed-off-by: 's avatarVittorio Giovara <vittorio.giovara@gmail.com>
parent 00b62968
...@@ -21,6 +21,8 @@ ...@@ -21,6 +21,8 @@
#include "libavutil/avstring.h" #include "libavutil/avstring.h"
#include "libavutil/imgutils.h" #include "libavutil/imgutils.h"
#include "libavutil/stereo3d.h"
#include "avcodec.h" #include "avcodec.h"
#include "bytestream.h" #include "bytestream.h"
#include "internal.h" #include "internal.h"
...@@ -608,6 +610,22 @@ static int decode_frame(AVCodecContext *avctx, ...@@ -608,6 +610,22 @@ static int decode_frame(AVCodecContext *avctx,
bytestream2_skip(&s->gb, 4); /* crc */ bytestream2_skip(&s->gb, 4); /* crc */
} }
break; break;
case MKTAG('s', 'T', 'E', 'R'): {
int mode = bytestream2_get_byte(&s->gb);
AVStereo3D *stereo3d = av_stereo3d_create_side_data(p);
if (!stereo3d)
goto the_end;
if (mode == 0 || mode == 1) {
stereo3d->type = AV_STEREO3D_SIDEBYSIDE;
stereo3d->flags = mode ? 0 : AV_STEREO3D_FLAG_INVERT;
} else {
av_log(avctx, AV_LOG_WARNING,
"Unknown value in sTER chunk (%d)\n", mode);
}
bytestream2_skip(&s->gb, 4); /* crc */
break;
}
case MKTAG('I', 'E', 'N', 'D'): case MKTAG('I', 'E', 'N', 'D'):
if (!(s->state & PNG_ALLIMAGE)) if (!(s->state & PNG_ALLIMAGE))
goto fail; goto fail;
......
...@@ -19,6 +19,8 @@ ...@@ -19,6 +19,8 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/ */
#include "libavutil/stereo3d.h"
#include "avcodec.h" #include "avcodec.h"
#include "bytestream.h" #include "bytestream.h"
#include "huffyuvencdsp.h" #include "huffyuvencdsp.h"
...@@ -233,6 +235,7 @@ static int encode_frame(AVCodecContext *avctx, AVPacket *pkt, ...@@ -233,6 +235,7 @@ static int encode_frame(AVCodecContext *avctx, AVPacket *pkt,
const AVFrame *pict, int *got_packet) const AVFrame *pict, int *got_packet)
{ {
PNGEncContext *s = avctx->priv_data; PNGEncContext *s = avctx->priv_data;
AVFrameSideData *side_data;
const AVFrame *const p = pict; const AVFrame *const p = pict;
int bit_depth, color_type, y, len, row_size, ret, is_progressive; int bit_depth, color_type, y, len, row_size, ret, is_progressive;
int bits_per_pixel, pass_row_size, enc_row_size, max_packet_size; int bits_per_pixel, pass_row_size, enc_row_size, max_packet_size;
...@@ -371,6 +374,25 @@ static int encode_frame(AVCodecContext *avctx, AVPacket *pkt, ...@@ -371,6 +374,25 @@ static int encode_frame(AVCodecContext *avctx, AVPacket *pkt,
} }
} }
/* write stereoscopic information */
side_data = av_frame_get_side_data(pict, AV_FRAME_DATA_STEREO3D);
if (side_data) {
AVStereo3D *stereo3d = (AVStereo3D *)side_data->data;
uint8_t sm;
switch (stereo3d->type) {
case AV_STEREO3D_SIDEBYSIDE:
sm = !(stereo3d->flags & AV_STEREO3D_FLAG_INVERT);
png_write_chunk(&s->bytestream, MKTAG('s', 'T', 'E', 'R'), &sm, 1);
break;
case AV_STEREO3D_2D:
break;
default:
av_log(avctx, AV_LOG_WARNING,
"Only side-by-side stereo3d flag can be defined within sTER chunk\n");
break;
}
}
/* now put each row */ /* now put each row */
s->zstream.avail_out = IOBUF_SIZE; s->zstream.avail_out = IOBUF_SIZE;
s->zstream.next_out = s->buf; s->zstream.next_out = s->buf;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment