[FFmpeg-devel] [PATCH 1/4] avformat/img2dec: make image2dec capable to be used from seperate demuxers

Michael Niedermayer michaelni at gmx.at
Fri Mar 28 21:38:55 CET 2014


Signed-off-by: Michael Niedermayer <michaelni at gmx.at>
---
 libavformat/img2.h    |   61 +++++++++++++++++++++++++++++++++++++++++++++++++
 libavformat/img2dec.c |   44 +++++++++--------------------------
 2 files changed, 72 insertions(+), 33 deletions(-)
 create mode 100644 libavformat/img2.h

diff --git a/libavformat/img2.h b/libavformat/img2.h
new file mode 100644
index 0000000..eadc4ff
--- /dev/null
+++ b/libavformat/img2.h
@@ -0,0 +1,61 @@
+/*
+ * Image format
+ * Copyright (c) 2014 Michael Niedermayer
+ *
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg 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.
+ *
+ * FFmpeg 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 FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVFORMAT_IMG2_H
+#define AVFORMAT_IMG2_H
+
+#include <stdint.h>
+#include "avformat.h"
+
+#if HAVE_GLOB
+#include <glob.h>
+#endif
+
+typedef struct {
+    const AVClass *class;  /**< Class for private options. */
+    int img_first;
+    int img_last;
+    int img_number;
+    int64_t pts;
+    int img_count;
+    int is_pipe;
+    int split_planes;       /**< use independent file for each Y, U, V plane */
+    char path[1024];
+    char *pixel_format;     /**< Set by a private option. */
+    int width, height;      /**< Set by a private option. */
+    AVRational framerate;   /**< Set by a private option. */
+    int loop;
+    enum { PT_GLOB_SEQUENCE, PT_GLOB, PT_SEQUENCE } pattern_type;
+    int use_glob;
+#if HAVE_GLOB
+    glob_t globstate;
+#endif
+    int start_number;
+    int start_number_range;
+    int frame_size;
+    int ts_from_file;
+} VideoDemuxData;
+
+int ff_img_read_header(AVFormatContext *s1);
+
+int ff_img_read_packet(AVFormatContext *s1, AVPacket *pkt);
+
+#endif
\ No newline at end of file
diff --git a/libavformat/img2dec.c b/libavformat/img2dec.c
index 5163e69..026fd5f 100644
--- a/libavformat/img2dec.c
+++ b/libavformat/img2dec.c
@@ -28,9 +28,9 @@
 #include "libavutil/parseutils.h"
 #include "avformat.h"
 #include "internal.h"
-#if HAVE_GLOB
-#include <glob.h>
+#include "img2.h"
 
+#if HAVE_GLOB
 /* Locally define as 0 (bitwise-OR no-op) any missing glob options that
    are non-posix glibc/bsd extensions. */
 #ifndef GLOB_NOMAGIC
@@ -42,31 +42,6 @@
 
 #endif /* HAVE_GLOB */
 
-typedef struct {
-    const AVClass *class;  /**< Class for private options. */
-    int img_first;
-    int img_last;
-    int img_number;
-    int64_t pts;
-    int img_count;
-    int is_pipe;
-    int split_planes;       /**< use independent file for each Y, U, V plane */
-    char path[1024];
-    char *pixel_format;     /**< Set by a private option. */
-    int width, height;      /**< Set by a private option. */
-    AVRational framerate;   /**< Set by a private option. */
-    int loop;
-    enum { PT_GLOB_SEQUENCE, PT_GLOB, PT_SEQUENCE } pattern_type;
-    int use_glob;
-#if HAVE_GLOB
-    glob_t globstate;
-#endif
-    int start_number;
-    int start_number_range;
-    int frame_size;
-    int ts_from_file;
-} VideoDemuxData;
-
 static const int sizes[][2] = {
     { 640, 480 },
     { 720, 480 },
@@ -192,7 +167,7 @@ static int img_read_probe(AVProbeData *p)
     return 0;
 }
 
-static int img_read_header(AVFormatContext *s1)
+int ff_img_read_header(AVFormatContext *s1)
 {
     VideoDemuxData *s = s1->priv_data;
     int first_index, last_index;
@@ -313,6 +288,9 @@ static int img_read_header(AVFormatContext *s1)
     } else if (s1->audio_codec_id) {
         st->codec->codec_type = AVMEDIA_TYPE_AUDIO;
         st->codec->codec_id   = s1->audio_codec_id;
+    } else if (s1->iformat->raw_codec_id) {
+        st->codec->codec_type = AVMEDIA_TYPE_VIDEO;
+        st->codec->codec_id   = s1->iformat->raw_codec_id;
     } else {
         const char *str = strrchr(s->path, '.');
         s->split_planes       = str && !av_strcasecmp(str + 1, "y");
@@ -328,7 +306,7 @@ static int img_read_header(AVFormatContext *s1)
     return 0;
 }
 
-static int img_read_packet(AVFormatContext *s1, AVPacket *pkt)
+int ff_img_read_packet(AVFormatContext *s1, AVPacket *pkt)
 {
     VideoDemuxData *s = s1->priv_data;
     char filename_bytes[1024];
@@ -483,8 +461,8 @@ AVInputFormat ff_image2_demuxer = {
     .long_name      = NULL_IF_CONFIG_SMALL("image2 sequence"),
     .priv_data_size = sizeof(VideoDemuxData),
     .read_probe     = img_read_probe,
-    .read_header    = img_read_header,
-    .read_packet    = img_read_packet,
+    .read_header    = ff_img_read_header,
+    .read_packet    = ff_img_read_packet,
     .read_close     = img_read_close,
     .read_seek      = img_read_seek,
     .flags          = AVFMT_NOFILE,
@@ -502,8 +480,8 @@ AVInputFormat ff_image2pipe_demuxer = {
     .name           = "image2pipe",
     .long_name      = NULL_IF_CONFIG_SMALL("piped image2 sequence"),
     .priv_data_size = sizeof(VideoDemuxData),
-    .read_header    = img_read_header,
-    .read_packet    = img_read_packet,
+    .read_header    = ff_img_read_header,
+    .read_packet    = ff_img_read_packet,
     .priv_class     = &img2pipe_class,
 };
 #endif
-- 
1.7.9.5



More information about the ffmpeg-devel mailing list