[FFmpeg-cvslog] png: read and write stereo3d frame side data information

Kirill Gavrilov git at videolan.org
Mon Nov 2 11:54:21 CET 2015


ffmpeg | branch: master | Kirill Gavrilov <kirill at sview.ru> | Tue Oct 27 18:27:03 2015 +0100| [1720791e36f9cc24c05efea5bb275ab52156ce50] | committer: 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: Vittorio Giovara <vittorio.giovara at gmail.com>

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=1720791e36f9cc24c05efea5bb275ab52156ce50
---

 libavcodec/pngdec.c |   18 ++++++++++++++++++
 libavcodec/pngenc.c |   22 ++++++++++++++++++++++
 2 files changed, 40 insertions(+)

diff --git a/libavcodec/pngdec.c b/libavcodec/pngdec.c
index 5fa7a2d..b52bf60 100644
--- a/libavcodec/pngdec.c
+++ b/libavcodec/pngdec.c
@@ -21,6 +21,8 @@
 
 #include "libavutil/avstring.h"
 #include "libavutil/imgutils.h"
+#include "libavutil/stereo3d.h"
+
 #include "avcodec.h"
 #include "bytestream.h"
 #include "internal.h"
@@ -608,6 +610,22 @@ static int decode_frame(AVCodecContext *avctx,
             bytestream2_skip(&s->gb, 4);     /* crc */
         }
         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'):
             if (!(s->state & PNG_ALLIMAGE))
                 goto fail;
diff --git a/libavcodec/pngenc.c b/libavcodec/pngenc.c
index 6ab4b7f..28df5af 100644
--- a/libavcodec/pngenc.c
+++ b/libavcodec/pngenc.c
@@ -19,6 +19,8 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
+#include "libavutil/stereo3d.h"
+
 #include "avcodec.h"
 #include "bytestream.h"
 #include "huffyuvencdsp.h"
@@ -233,6 +235,7 @@ static int encode_frame(AVCodecContext *avctx, AVPacket *pkt,
                         const AVFrame *pict, int *got_packet)
 {
     PNGEncContext *s       = avctx->priv_data;
+    AVFrameSideData *side_data;
     const AVFrame *const p = pict;
     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;
@@ -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 */
     s->zstream.avail_out = IOBUF_SIZE;
     s->zstream.next_out  = s->buf;



More information about the ffmpeg-cvslog mailing list