Browse code

Merge commit '1b891d17c531e8a63c2974aab4bf997ce70746f3'

* commit '1b891d17c531e8a63c2974aab4bf997ce70746f3':
avconv: fix bitrate report when writing to /dev/null
avfilter: fix graphparser memleaks on error paths
rawdec: remove ff_raw_read_header
pcmdec: remove dependency from rawdec
g722: refactor out of rawdec.c
rawvideo: use a specific read_header

Conflicts:
ffmpeg.c
libavformat/Makefile
libavformat/rawdec.c

Merged-by: Michael Niedermayer <michaelni@gmx.at>

Michael Niedermayer authored on 2012/10/26 21:07:04
Showing 8 changed files
... ...
@@ -1082,10 +1082,14 @@ static void print_report(int is_last_report, int64_t timer_start, int64_t cur_ti
1082 1082
     oc = output_files[0]->ctx;
1083 1083
 
1084 1084
     total_size = avio_size(oc->pb);
1085
-    if (total_size < 0) { // FIXME improve avio_size() so it works with non seekable output too
1085
+    if (total_size <= 0) // FIXME improve avio_size() so it works with non seekable output too
1086 1086
         total_size = avio_tell(oc->pb);
1087
-        if (total_size < 0)
1088
-            total_size = 0;
1087
+    if (total_size < 0) {
1088
+        char errbuf[128];
1089
+        av_strerror(total_size, errbuf, sizeof(errbuf));
1090
+        av_log(NULL, AV_LOG_VERBOSE, "Bitrate not available, "
1091
+               "avio_tell() failed: %s\n", errbuf);
1092
+        total_size = 0;
1089 1093
     }
1090 1094
 
1091 1095
     buf[0] = '\0';
... ...
@@ -239,10 +239,11 @@ static int link_filter_inouts(AVFilterContext *filt_ctx,
239 239
             return AVERROR(ENOMEM);
240 240
 
241 241
         if (p->filter_ctx) {
242
-            if ((ret = link_filter(p->filter_ctx, p->pad_idx, filt_ctx, pad, log_ctx)) < 0)
243
-                return ret;
242
+            ret = link_filter(p->filter_ctx, p->pad_idx, filt_ctx, pad, log_ctx);
244 243
             av_free(p->name);
245 244
             av_free(p);
245
+            if (ret < 0)
246
+                return ret;
246 247
         } else {
247 248
             p->filter_ctx = filt_ctx;
248 249
             p->pad_idx = pad;
... ...
@@ -290,8 +291,10 @@ static int parse_inputs(const char **buf, AVFilterInOut **curr_inputs,
290 290
             av_free(name);
291 291
         } else {
292 292
             /* Not in the list, so add it as an input */
293
-            if (!(match = av_mallocz(sizeof(AVFilterInOut))))
293
+            if (!(match = av_mallocz(sizeof(AVFilterInOut)))) {
294
+                av_free(name);
294 295
                 return AVERROR(ENOMEM);
296
+            }
295 297
             match->name    = name;
296 298
             match->pad_idx = pad;
297 299
         }
... ...
@@ -319,24 +322,27 @@ static int parse_outputs(const char **buf, AVFilterInOut **curr_inputs,
319 319
         AVFilterInOut *match;
320 320
 
321 321
         AVFilterInOut *input = *curr_inputs;
322
+
323
+        if (!name)
324
+            return AVERROR(EINVAL);
325
+
322 326
         if (!input) {
323 327
             av_log(log_ctx, AV_LOG_ERROR,
324
-                   "No output pad can be associated to link label '%s'.\n",
325
-                   name);
328
+                   "No output pad can be associated to link label '%s'.\n", name);
329
+            av_free(name);
326 330
             return AVERROR(EINVAL);
327 331
         }
328 332
         *curr_inputs = (*curr_inputs)->next;
329 333
 
330
-        if (!name)
331
-            return AVERROR(EINVAL);
332
-
333 334
         /* First check if the label is not in the open_inputs list */
334 335
         match = extract_inout(name, open_inputs);
335 336
 
336 337
         if (match) {
337 338
             if ((ret = link_filter(input->filter_ctx, input->pad_idx,
338
-                                   match->filter_ctx, match->pad_idx, log_ctx)) < 0)
339
+                                   match->filter_ctx, match->pad_idx, log_ctx)) < 0) {
340
+                av_free(name);
339 341
                 return ret;
342
+            }
340 343
             av_free(match->name);
341 344
             av_free(name);
342 345
             av_free(match);
... ...
@@ -112,7 +112,7 @@ OBJS-$(CONFIG_GIF_MUXER)                 += gif.o
112 112
 OBJS-$(CONFIG_GSM_DEMUXER)               += gsmdec.o
113 113
 OBJS-$(CONFIG_GXF_DEMUXER)               += gxf.o
114 114
 OBJS-$(CONFIG_GXF_MUXER)                 += gxfenc.o audiointerleave.o
115
-OBJS-$(CONFIG_G722_DEMUXER)              += rawdec.o
115
+OBJS-$(CONFIG_G722_DEMUXER)              += g722.o rawdec.o
116 116
 OBJS-$(CONFIG_G722_MUXER)                += rawenc.o
117 117
 OBJS-$(CONFIG_G723_1_DEMUXER)            += g723_1.o
118 118
 OBJS-$(CONFIG_G723_1_MUXER)              += rawenc.o
... ...
@@ -220,51 +220,51 @@ OBJS-$(CONFIG_OGG_MUXER)                 += oggenc.o \
220 220
 OBJS-$(CONFIG_OMA_DEMUXER)               += omadec.o pcm.o oma.o
221 221
 OBJS-$(CONFIG_OMA_MUXER)                 += omaenc.o rawenc.o oma.o id3v2enc.o
222 222
 OBJS-$(CONFIG_PAF_DEMUXER)               += paf.o
223
-OBJS-$(CONFIG_PCM_ALAW_DEMUXER)          += pcmdec.o pcm.o rawdec.o
223
+OBJS-$(CONFIG_PCM_ALAW_DEMUXER)          += pcmdec.o pcm.o
224 224
 OBJS-$(CONFIG_PCM_ALAW_MUXER)            += pcmenc.o rawenc.o
225
-OBJS-$(CONFIG_PCM_F32BE_DEMUXER)         += pcmdec.o pcm.o rawdec.o
225
+OBJS-$(CONFIG_PCM_F32BE_DEMUXER)         += pcmdec.o pcm.o
226 226
 OBJS-$(CONFIG_PCM_F32BE_MUXER)           += pcmenc.o rawenc.o
227
-OBJS-$(CONFIG_PCM_F32LE_DEMUXER)         += pcmdec.o pcm.o rawdec.o
227
+OBJS-$(CONFIG_PCM_F32LE_DEMUXER)         += pcmdec.o pcm.o
228 228
 OBJS-$(CONFIG_PCM_F32LE_MUXER)           += pcmenc.o rawenc.o
229
-OBJS-$(CONFIG_PCM_F64BE_DEMUXER)         += pcmdec.o pcm.o rawdec.o
229
+OBJS-$(CONFIG_PCM_F64BE_DEMUXER)         += pcmdec.o pcm.o
230 230
 OBJS-$(CONFIG_PCM_F64BE_MUXER)           += pcmenc.o rawenc.o
231
-OBJS-$(CONFIG_PCM_F64LE_DEMUXER)         += pcmdec.o pcm.o rawdec.o
231
+OBJS-$(CONFIG_PCM_F64LE_DEMUXER)         += pcmdec.o pcm.o
232 232
 OBJS-$(CONFIG_PCM_F64LE_MUXER)           += pcmenc.o rawenc.o
233
-OBJS-$(CONFIG_PCM_MULAW_DEMUXER)         += pcmdec.o pcm.o rawdec.o
233
+OBJS-$(CONFIG_PCM_MULAW_DEMUXER)         += pcmdec.o pcm.o
234 234
 OBJS-$(CONFIG_PCM_MULAW_MUXER)           += pcmenc.o rawenc.o
235
-OBJS-$(CONFIG_PCM_S16BE_DEMUXER)         += pcmdec.o pcm.o rawdec.o
235
+OBJS-$(CONFIG_PCM_S16BE_DEMUXER)         += pcmdec.o pcm.o
236 236
 OBJS-$(CONFIG_PCM_S16BE_MUXER)           += pcmenc.o rawenc.o
237
-OBJS-$(CONFIG_PCM_S16LE_DEMUXER)         += pcmdec.o pcm.o rawdec.o
237
+OBJS-$(CONFIG_PCM_S16LE_DEMUXER)         += pcmdec.o pcm.o
238 238
 OBJS-$(CONFIG_PCM_S16LE_MUXER)           += pcmenc.o rawenc.o
239
-OBJS-$(CONFIG_PCM_S24BE_DEMUXER)         += pcmdec.o pcm.o rawdec.o
239
+OBJS-$(CONFIG_PCM_S24BE_DEMUXER)         += pcmdec.o pcm.o
240 240
 OBJS-$(CONFIG_PCM_S24BE_MUXER)           += pcmenc.o rawenc.o
241
-OBJS-$(CONFIG_PCM_S24LE_DEMUXER)         += pcmdec.o pcm.o rawdec.o
241
+OBJS-$(CONFIG_PCM_S24LE_DEMUXER)         += pcmdec.o pcm.o
242 242
 OBJS-$(CONFIG_PCM_S24LE_MUXER)           += pcmenc.o rawenc.o
243
-OBJS-$(CONFIG_PCM_S32BE_DEMUXER)         += pcmdec.o pcm.o rawdec.o
243
+OBJS-$(CONFIG_PCM_S32BE_DEMUXER)         += pcmdec.o pcm.o
244 244
 OBJS-$(CONFIG_PCM_S32BE_MUXER)           += pcmenc.o rawenc.o
245
-OBJS-$(CONFIG_PCM_S32LE_DEMUXER)         += pcmdec.o pcm.o rawdec.o
245
+OBJS-$(CONFIG_PCM_S32LE_DEMUXER)         += pcmdec.o pcm.o
246 246
 OBJS-$(CONFIG_PCM_S32LE_MUXER)           += pcmenc.o rawenc.o
247
-OBJS-$(CONFIG_PCM_S8_DEMUXER)            += pcmdec.o pcm.o rawdec.o
247
+OBJS-$(CONFIG_PCM_S8_DEMUXER)            += pcmdec.o pcm.o
248 248
 OBJS-$(CONFIG_PCM_S8_MUXER)              += pcmenc.o rawenc.o
249
-OBJS-$(CONFIG_PCM_U16BE_DEMUXER)         += pcmdec.o pcm.o rawdec.o
249
+OBJS-$(CONFIG_PCM_U16BE_DEMUXER)         += pcmdec.o pcm.o
250 250
 OBJS-$(CONFIG_PCM_U16BE_MUXER)           += pcmenc.o rawenc.o
251
-OBJS-$(CONFIG_PCM_U16LE_DEMUXER)         += pcmdec.o pcm.o rawdec.o
251
+OBJS-$(CONFIG_PCM_U16LE_DEMUXER)         += pcmdec.o pcm.o
252 252
 OBJS-$(CONFIG_PCM_U16LE_MUXER)           += pcmenc.o rawenc.o
253
-OBJS-$(CONFIG_PCM_U24BE_DEMUXER)         += pcmdec.o pcm.o rawdec.o
253
+OBJS-$(CONFIG_PCM_U24BE_DEMUXER)         += pcmdec.o pcm.o
254 254
 OBJS-$(CONFIG_PCM_U24BE_MUXER)           += pcmenc.o rawenc.o
255
-OBJS-$(CONFIG_PCM_U24LE_DEMUXER)         += pcmdec.o pcm.o rawdec.o
255
+OBJS-$(CONFIG_PCM_U24LE_DEMUXER)         += pcmdec.o pcm.o
256 256
 OBJS-$(CONFIG_PCM_U24LE_MUXER)           += pcmenc.o rawenc.o
257
-OBJS-$(CONFIG_PCM_U32BE_DEMUXER)         += pcmdec.o pcm.o rawdec.o
257
+OBJS-$(CONFIG_PCM_U32BE_DEMUXER)         += pcmdec.o pcm.o
258 258
 OBJS-$(CONFIG_PCM_U32BE_MUXER)           += pcmenc.o rawenc.o
259
-OBJS-$(CONFIG_PCM_U32LE_DEMUXER)         += pcmdec.o pcm.o rawdec.o
259
+OBJS-$(CONFIG_PCM_U32LE_DEMUXER)         += pcmdec.o pcm.o
260 260
 OBJS-$(CONFIG_PCM_U32LE_MUXER)           += pcmenc.o rawenc.o
261
-OBJS-$(CONFIG_PCM_U8_DEMUXER)            += pcmdec.o pcm.o rawdec.o
261
+OBJS-$(CONFIG_PCM_U8_DEMUXER)            += pcmdec.o pcm.o
262 262
 OBJS-$(CONFIG_PCM_U8_MUXER)              += pcmenc.o rawenc.o
263 263
 OBJS-$(CONFIG_PMP_DEMUXER)               += pmpdec.o
264 264
 OBJS-$(CONFIG_PVA_DEMUXER)               += pva.o
265 265
 OBJS-$(CONFIG_QCP_DEMUXER)               += qcp.o
266 266
 OBJS-$(CONFIG_R3D_DEMUXER)               += r3d.o
267
-OBJS-$(CONFIG_RAWVIDEO_DEMUXER)          += rawvideodec.o rawdec.o
267
+OBJS-$(CONFIG_RAWVIDEO_DEMUXER)          += rawvideodec.o
268 268
 OBJS-$(CONFIG_RAWVIDEO_MUXER)            += rawenc.o
269 269
 OBJS-$(CONFIG_REALTEXT_DEMUXER)          += realtextdec.o
270 270
 OBJS-$(CONFIG_RL2_DEMUXER)               += rl2.o
271 271
new file mode 100644
... ...
@@ -0,0 +1,57 @@
0
+/*
1
+ * g722 raw demuxer
2
+ * Copyright (c) 2010 Martin Storsjo
3
+ *
4
+ * This file is part of FFmpeg.
5
+ *
6
+ * FFmpeg is free software; you can redistribute it and/or
7
+ * modify it under the terms of the GNU Lesser General Public
8
+ * License as published by the Free Software Foundation; either
9
+ * version 2.1 of the License, or (at your option) any later version.
10
+ *
11
+ * FFmpeg is distributed in the hope that it will be useful,
12
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14
+ * Lesser General Public License for more details.
15
+ *
16
+ * You should have received a copy of the GNU Lesser General Public
17
+ * License along with FFmpeg; if not, write to the Free Software
18
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19
+ */
20
+
21
+#include "libavutil/avassert.h"
22
+#include "avformat.h"
23
+#include "internal.h"
24
+#include "rawdec.h"
25
+
26
+static int g722_read_header(AVFormatContext *s)
27
+{
28
+    AVStream *st;
29
+
30
+    st = avformat_new_stream(s, NULL);
31
+    if (!st)
32
+        return AVERROR(ENOMEM);
33
+
34
+    st->codec->codec_type  = AVMEDIA_TYPE_AUDIO;
35
+    st->codec->codec_id    = AV_CODEC_ID_ADPCM_G722;
36
+    st->codec->sample_rate = 16000;
37
+    st->codec->channels    = 1;
38
+
39
+    st->codec->bits_per_coded_sample =
40
+        av_get_bits_per_sample(st->codec->codec_id);
41
+
42
+    av_assert0(st->codec->bits_per_coded_sample > 0);
43
+
44
+    avpriv_set_pts_info(st, 64, 1, st->codec->sample_rate);
45
+    return 0;
46
+}
47
+
48
+AVInputFormat ff_g722_demuxer = {
49
+    .name           = "g722",
50
+    .long_name      = NULL_IF_CONFIG_SMALL("raw G.722"),
51
+    .read_header    = g722_read_header,
52
+    .read_packet    = ff_raw_read_partial_packet,
53
+    .flags          = AVFMT_GENERIC_INDEX,
54
+    .extensions     = "g722,722",
55
+    .raw_codec_id   = AV_CODEC_ID_ADPCM_G722,
56
+};
... ...
@@ -20,7 +20,7 @@
20 20
  */
21 21
 
22 22
 #include "avformat.h"
23
-#include "rawdec.h"
23
+#include "internal.h"
24 24
 #include "pcm.h"
25 25
 #include "libavutil/log.h"
26 26
 #include "libavutil/opt.h"
... ...
@@ -28,6 +28,39 @@
28 28
 
29 29
 #define RAW_SAMPLES     1024
30 30
 
31
+typedef struct RawAudioDemuxerContext {
32
+    AVClass *class;
33
+    int sample_rate;
34
+    int channels;
35
+} RawAudioDemuxerContext;
36
+
37
+static int raw_read_header(AVFormatContext *s)
38
+{
39
+    RawAudioDemuxerContext *s1 = s->priv_data;
40
+    AVStream *st;
41
+
42
+    st = avformat_new_stream(s, NULL);
43
+    if (!st)
44
+        return AVERROR(ENOMEM);
45
+
46
+
47
+    st->codec->codec_type  = AVMEDIA_TYPE_AUDIO;
48
+    st->codec->codec_id    = s->iformat->raw_codec_id;
49
+    st->codec->sample_rate = s1->sample_rate;
50
+    st->codec->channels    = s1->channels;
51
+
52
+    st->codec->bits_per_coded_sample =
53
+        av_get_bits_per_sample(st->codec->codec_id);
54
+
55
+    av_assert0(st->codec->bits_per_coded_sample > 0);
56
+
57
+    st->codec->block_align =
58
+        st->codec->bits_per_coded_sample * st->codec->channels / 8;
59
+
60
+    avpriv_set_pts_info(st, 64, 1, st->codec->sample_rate);
61
+    return 0;
62
+}
63
+
31 64
 static int raw_read_packet(AVFormatContext *s, AVPacket *pkt)
32 65
 {
33 66
     int ret, size, bps;
... ...
@@ -51,8 +84,8 @@ static int raw_read_packet(AVFormatContext *s, AVPacket *pkt)
51 51
 }
52 52
 
53 53
 static const AVOption pcm_options[] = {
54
-    { "sample_rate", "", offsetof(RawAudioDemuxerContext, sample_rate), AV_OPT_TYPE_INT, {.i64 = 0}, 0, INT_MAX, AV_OPT_FLAG_DECODING_PARAM },
55
-    { "channels",    "", offsetof(RawAudioDemuxerContext, channels),    AV_OPT_TYPE_INT, {.i64 = 0}, 0, INT_MAX, AV_OPT_FLAG_DECODING_PARAM },
54
+    { "sample_rate", "", offsetof(RawAudioDemuxerContext, sample_rate), AV_OPT_TYPE_INT, {.i64 = 44100}, 0, INT_MAX, AV_OPT_FLAG_DECODING_PARAM },
55
+    { "channels",    "", offsetof(RawAudioDemuxerContext, channels),    AV_OPT_TYPE_INT, {.i64 = 1}, 0, INT_MAX, AV_OPT_FLAG_DECODING_PARAM },
56 56
     { NULL },
57 57
 };
58 58
 
... ...
@@ -67,7 +100,7 @@ AVInputFormat ff_pcm_ ## name_ ## _demuxer = {              \
67 67
     .name           = #name_,                               \
68 68
     .long_name      = NULL_IF_CONFIG_SMALL(long_name_),     \
69 69
     .priv_data_size = sizeof(RawAudioDemuxerContext),       \
70
-    .read_header    = ff_raw_read_header,                   \
70
+    .read_header    = raw_read_header,                      \
71 71
     .read_packet    = raw_read_packet,                      \
72 72
     .read_seek      = ff_pcm_read_seek,                     \
73 73
     .flags          = AVFMT_GENERIC_INDEX,                  \
... ...
@@ -29,82 +29,6 @@
29 29
 #include "libavutil/pixdesc.h"
30 30
 #include "libavutil/avassert.h"
31 31
 
32
-/* raw input */
33
-int ff_raw_read_header(AVFormatContext *s)
34
-{
35
-    AVStream *st;
36
-    enum AVCodecID id;
37
-
38
-    st = avformat_new_stream(s, NULL);
39
-    if (!st)
40
-        return AVERROR(ENOMEM);
41
-
42
-        id = s->iformat->raw_codec_id;
43
-        if (id == AV_CODEC_ID_RAWVIDEO) {
44
-            st->codec->codec_type = AVMEDIA_TYPE_VIDEO;
45
-        } else {
46
-            st->codec->codec_type = AVMEDIA_TYPE_AUDIO;
47
-        }
48
-        st->codec->codec_id = id;
49
-
50
-        switch(st->codec->codec_type) {
51
-        case AVMEDIA_TYPE_AUDIO: {
52
-            RawAudioDemuxerContext *s1 = s->priv_data;
53
-
54
-            st->codec->channels = 1;
55
-
56
-            if (id == AV_CODEC_ID_ADPCM_G722)
57
-                st->codec->sample_rate = 16000;
58
-
59
-            if (s1 && s1->sample_rate)
60
-                st->codec->sample_rate = s1->sample_rate;
61
-            if (st->codec->sample_rate <= 0) {
62
-                av_log(s, AV_LOG_WARNING, "Invalid sample rate %d specified using default of 44100\n",
63
-                       st->codec->sample_rate);
64
-                st->codec->sample_rate= 44100;
65
-            }
66
-
67
-            if (s1 && s1->channels)
68
-                st->codec->channels    = s1->channels;
69
-
70
-            st->codec->bits_per_coded_sample = av_get_bits_per_sample(st->codec->codec_id);
71
-            av_assert0(st->codec->bits_per_coded_sample > 0);
72
-            st->codec->block_align = st->codec->bits_per_coded_sample*st->codec->channels/8;
73
-            avpriv_set_pts_info(st, 64, 1, st->codec->sample_rate);
74
-            break;
75
-            }
76
-        case AVMEDIA_TYPE_VIDEO: {
77
-            FFRawVideoDemuxerContext *s1 = s->priv_data;
78
-            int width = 0, height = 0, ret = 0;
79
-            enum AVPixelFormat pix_fmt;
80
-            AVRational framerate;
81
-
82
-            if (s1->video_size && (ret = av_parse_video_size(&width, &height, s1->video_size)) < 0) {
83
-                av_log(s, AV_LOG_ERROR, "Couldn't parse video size.\n");
84
-                goto fail;
85
-            }
86
-            if ((pix_fmt = av_get_pix_fmt(s1->pixel_format)) == AV_PIX_FMT_NONE) {
87
-                av_log(s, AV_LOG_ERROR, "No such pixel format: %s.\n", s1->pixel_format);
88
-                ret = AVERROR(EINVAL);
89
-                goto fail;
90
-            }
91
-            if ((ret = av_parse_video_rate(&framerate, s1->framerate)) < 0) {
92
-                av_log(s, AV_LOG_ERROR, "Could not parse framerate: %s.\n", s1->framerate);
93
-                goto fail;
94
-            }
95
-            avpriv_set_pts_info(st, 64, framerate.den, framerate.num);
96
-            st->codec->width  = width;
97
-            st->codec->height = height;
98
-            st->codec->pix_fmt = pix_fmt;
99
-fail:
100
-            return ret;
101
-            }
102
-        default:
103
-            return -1;
104
-        }
105
-    return 0;
106
-}
107
-
108 32
 #define RAW_PACKET_SIZE 1024
109 33
 
110 34
 int ff_raw_read_partial_packet(AVFormatContext *s, AVPacket *pkt)
... ...
@@ -181,18 +105,6 @@ const AVOption ff_rawvideo_options[] = {
181 181
     { NULL },
182 182
 };
183 183
 
184
-#if CONFIG_G722_DEMUXER
185
-AVInputFormat ff_g722_demuxer = {
186
-    .name           = "g722",
187
-    .long_name      = NULL_IF_CONFIG_SMALL("raw G.722"),
188
-    .read_header    = ff_raw_read_header,
189
-    .read_packet    = ff_raw_read_partial_packet,
190
-    .flags          = AVFMT_GENERIC_INDEX,
191
-    .extensions     = "g722,722",
192
-    .raw_codec_id   = AV_CODEC_ID_ADPCM_G722,
193
-};
194
-#endif
195
-
196 184
 #if CONFIG_LATM_DEMUXER
197 185
 AVInputFormat ff_latm_demuxer = {
198 186
     .name           = "latm",
... ...
@@ -26,12 +26,6 @@
26 26
 #include "libavutil/log.h"
27 27
 #include "libavutil/opt.h"
28 28
 
29
-typedef struct RawAudioDemuxerContext {
30
-    AVClass *class;
31
-    int sample_rate;
32
-    int channels;
33
-} RawAudioDemuxerContext;
34
-
35 29
 typedef struct FFRawVideoDemuxerContext {
36 30
     const AVClass *class;     /**< Class for private options. */
37 31
     char *video_size;         /**< String describing video size, set by a private option. */
... ...
@@ -41,8 +35,6 @@ typedef struct FFRawVideoDemuxerContext {
41 41
 
42 42
 extern const AVOption ff_rawvideo_options[];
43 43
 
44
-int ff_raw_read_header(AVFormatContext *s);
45
-
46 44
 int ff_raw_read_partial_packet(AVFormatContext *s, AVPacket *pkt);
47 45
 
48 46
 int ff_raw_audio_read_header(AVFormatContext *s);
... ...
@@ -19,8 +19,63 @@
19 19
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20 20
  */
21 21
 
22
+#include "libavutil/parseutils.h"
23
+#include "libavutil/pixdesc.h"
24
+#include "libavutil/opt.h"
25
+#include "internal.h"
22 26
 #include "avformat.h"
23
-#include "rawdec.h"
27
+
28
+typedef struct RawVideoDemuxerContext {
29
+    const AVClass *class;     /**< Class for private options. */
30
+    char *video_size;         /**< String describing video size, set by a private option. */
31
+    char *pixel_format;       /**< Set by a private option. */
32
+    char *framerate;          /**< String describing framerate, set by a private option. */
33
+} RawVideoDemuxerContext;
34
+
35
+
36
+static int rawvideo_read_header(AVFormatContext *ctx)
37
+{
38
+    RawVideoDemuxerContext *s = ctx->priv_data;
39
+    int width = 0, height = 0, ret = 0;
40
+    enum AVPixelFormat pix_fmt;
41
+    AVRational framerate;
42
+    AVStream *st;
43
+
44
+    st = avformat_new_stream(ctx, NULL);
45
+    if (!st)
46
+        return AVERROR(ENOMEM);
47
+
48
+    st->codec->codec_type = AVMEDIA_TYPE_VIDEO;
49
+
50
+    st->codec->codec_id = ctx->iformat->raw_codec_id;
51
+
52
+    if (s->video_size &&
53
+        (ret = av_parse_video_size(&width, &height, s->video_size)) < 0) {
54
+        av_log(ctx, AV_LOG_ERROR, "Couldn't parse video size.\n");
55
+        return ret;
56
+    }
57
+
58
+    if ((pix_fmt = av_get_pix_fmt(s->pixel_format)) == AV_PIX_FMT_NONE) {
59
+        av_log(ctx, AV_LOG_ERROR, "No such pixel format: %s.\n",
60
+               s->pixel_format);
61
+        return AVERROR(EINVAL);
62
+    }
63
+
64
+    if ((ret = av_parse_video_rate(&framerate, s->framerate)) < 0) {
65
+        av_log(ctx, AV_LOG_ERROR, "Could not parse framerate: %s.\n",
66
+               s->framerate);
67
+        return ret;
68
+    }
69
+
70
+    avpriv_set_pts_info(st, 64, framerate.den, framerate.num);
71
+
72
+    st->codec->width  = width;
73
+    st->codec->height = height;
74
+    st->codec->pix_fmt = pix_fmt;
75
+
76
+    return 0;
77
+}
78
+
24 79
 
25 80
 static int rawvideo_read_packet(AVFormatContext *s, AVPacket *pkt)
26 81
 {
... ...
@@ -34,9 +89,8 @@ static int rawvideo_read_packet(AVFormatContext *s, AVPacket *pkt)
34 34
     if (packet_size < 0)
35 35
         return -1;
36 36
 
37
-    ret= av_get_packet(s->pb, pkt, packet_size);
38
-    pkt->pts=
39
-    pkt->dts= pkt->pos / packet_size;
37
+    ret = av_get_packet(s->pb, pkt, packet_size);
38
+    pkt->pts = pkt->dts = pkt->pos / packet_size;
40 39
 
41 40
     pkt->stream_index = 0;
42 41
     if (ret < 0)
... ...
@@ -44,7 +98,7 @@ static int rawvideo_read_packet(AVFormatContext *s, AVPacket *pkt)
44 44
     return 0;
45 45
 }
46 46
 
47
-#define OFFSET(x) offsetof(FFRawVideoDemuxerContext, x)
47
+#define OFFSET(x) offsetof(RawVideoDemuxerContext, x)
48 48
 #define DEC AV_OPT_FLAG_DECODING_PARAM
49 49
 static const AVOption rawvideo_options[] = {
50 50
     { "video_size", "A string describing frame size, such as 640x480 or hd720.", OFFSET(video_size), AV_OPT_TYPE_STRING, {.str = NULL}, 0, 0, DEC },
... ...
@@ -63,8 +117,8 @@ static const AVClass rawvideo_demuxer_class = {
63 63
 AVInputFormat ff_rawvideo_demuxer = {
64 64
     .name           = "rawvideo",
65 65
     .long_name      = NULL_IF_CONFIG_SMALL("raw video"),
66
-    .priv_data_size = sizeof(FFRawVideoDemuxerContext),
67
-    .read_header    = ff_raw_read_header,
66
+    .priv_data_size = sizeof(RawVideoDemuxerContext),
67
+    .read_header    = rawvideo_read_header,
68 68
     .read_packet    = rawvideo_read_packet,
69 69
     .flags          = AVFMT_GENERIC_INDEX,
70 70
     .extensions     = "yuv,cif,qcif,rgb",