History

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

Michael Niedermayer committed 14 years ago

Commit 507f2942 parents 9f36ec6 1b891d18 files · +199 −141Browse files

Unified · Split

8 files
  1. ffmpeg.c +7 −3
  2. libavfilter/graphparser.c +15 −9
  3. libavformat/Makefile +22 −22
  4. libavformat/g722.c +57 −0
  5. libavformat/pcmdec.c +37 −4
  6. libavformat/rawdec.c +0 −88
  7. libavformat/rawdec.h +0 −8
  8. libavformat/rawvideodec.c +61 −7
ffmpeg.c+7−3
@@ -1082,10 +1082,14 @@ static void print_report(int is_last_report, int64_t timer_start, int64_t cur_ti · 1081 unmodified lines
10821082 oc = output_files[0]->ctx;
10831083
10841084 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
10861086 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;
10891093 }
10901094
10911095 buf[0] = '\0';
libavfilter/graphparser.c+15−9
@@ -239,10 +239,11 @@ static int link_filter_inouts(AVFilterContext *filt_ctx, · 238 unmodified lines
239239 return AVERROR(ENOMEM);
240240
241241 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);
244243 av_free(p->name);
245244 av_free(p);
245+ if (ret < 0)
246+ return ret;
246247 } else {
247248 p->filter_ctx = filt_ctx;
248249 p->pad_idx = pad;
@@ -290,8 +291,10 @@ static int parse_inputs(const char **buf, AVFilterInOut **curr_inputs, · 41 unmodified lines
290291 av_free(name);
291292 } else {
292293 /* Not in the list, so add it as an input */
293− if (!(match = av_mallocz(sizeof(AVFilterInOut))))
294+ if (!(match = av_mallocz(sizeof(AVFilterInOut)))) {
295+ av_free(name);
294296 return AVERROR(ENOMEM);
297+ }
295298 match->name = name;
296299 match->pad_idx = pad;
297300 }
@@ -319,24 +322,27 @@ static int parse_outputs(const char **buf, AVFilterInOut **curr_inputs, · 21 unmodified lines
319322 AVFilterInOut *match;
320323
321324 AVFilterInOut *input = *curr_inputs;
325+
326+ if (!name)
327+ return AVERROR(EINVAL);
328+
322329 if (!input) {
323330 av_log(log_ctx, AV_LOG_ERROR,
324− "No output pad can be associated to link label '%s'.\n",
325− name);
331+ "No output pad can be associated to link label '%s'.\n", name);
332+ av_free(name);
326333 return AVERROR(EINVAL);
327334 }
328335 *curr_inputs = (*curr_inputs)->next;
329336
330− if (!name)
331− return AVERROR(EINVAL);
332−
333337 /* First check if the label is not in the open_inputs list */
334338 match = extract_inout(name, open_inputs);
335339
336340 if (match) {
337341 if ((ret = link_filter(input->filter_ctx, input->pad_idx,
338− match->filter_ctx, match->pad_idx, log_ctx)) < 0)
342+ match->filter_ctx, match->pad_idx, log_ctx)) < 0) {
343+ av_free(name);
339344 return ret;
345+ }
340346 av_free(match->name);
341347 av_free(name);
342348 av_free(match);
libavformat/Makefile+22−22
@@ -112,7 +112,7 @@ OBJS-$(CONFIG_GIF_MUXER) += gif.o · 111 unmodified lines
112112 OBJS-$(CONFIG_GSM_DEMUXER) += gsmdec.o
113113 OBJS-$(CONFIG_GXF_DEMUXER) += gxf.o
114114 OBJS-$(CONFIG_GXF_MUXER) += gxfenc.o audiointerleave.o
115−OBJS-$(CONFIG_G722_DEMUXER) += rawdec.o
115+OBJS-$(CONFIG_G722_DEMUXER) += g722.o rawdec.o
116116 OBJS-$(CONFIG_G722_MUXER) += rawenc.o
117117 OBJS-$(CONFIG_G723_1_DEMUXER) += g723_1.o
118118 OBJS-$(CONFIG_G723_1_MUXER) += rawenc.o
@@ -220,51 +220,51 @@ OBJS-$(CONFIG_OGG_MUXER) += oggenc.o \ · 101 unmodified lines
220220 OBJS-$(CONFIG_OMA_DEMUXER) += omadec.o pcm.o oma.o
221221 OBJS-$(CONFIG_OMA_MUXER) += omaenc.o rawenc.o oma.o id3v2enc.o
222222 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
224224 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
226226 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
228228 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
230230 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
232232 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
234234 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
236236 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
238238 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
240240 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
242242 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
244244 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
246246 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
248248 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
250250 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
252252 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
254254 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
256256 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
258258 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
260260 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
262262 OBJS-$(CONFIG_PCM_U8_MUXER) += pcmenc.o rawenc.o
263263 OBJS-$(CONFIG_PMP_DEMUXER) += pmpdec.o
264264 OBJS-$(CONFIG_PVA_DEMUXER) += pva.o
265265 OBJS-$(CONFIG_QCP_DEMUXER) += qcp.o
266266 OBJS-$(CONFIG_R3D_DEMUXER) += r3d.o
267−OBJS-$(CONFIG_RAWVIDEO_DEMUXER) += rawvideodec.o rawdec.o
267+OBJS-$(CONFIG_RAWVIDEO_DEMUXER) += rawvideodec.o
268268 OBJS-$(CONFIG_RAWVIDEO_MUXER) += rawenc.o
269269 OBJS-$(CONFIG_REALTEXT_DEMUXER) += realtextdec.o
270270 OBJS-$(CONFIG_RL2_DEMUXER) += rl2.o
libavformat/g722.c+57−0
@@ -0,0 +1,57 @@
1+/*
2+ * g722 raw demuxer
3+ * Copyright (c) 2010 Martin Storsjo
4+ *
5+ * This file is part of FFmpeg.
6+ *
7+ * FFmpeg is free software; you can redistribute it and/or
8+ * modify it under the terms of the GNU Lesser General Public
9+ * License as published by the Free Software Foundation; either
10+ * version 2.1 of the License, or (at your option) any later version.
11+ *
12+ * FFmpeg is distributed in the hope that it will be useful,
13+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
14+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15+ * Lesser General Public License for more details.
16+ *
17+ * You should have received a copy of the GNU Lesser General Public
18+ * License along with FFmpeg; if not, write to the Free Software
19+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20+ */
21+
22+#include "libavutil/avassert.h"
23+#include "avformat.h"
24+#include "internal.h"
25+#include "rawdec.h"
26+
27+static int g722_read_header(AVFormatContext *s)
28+{
29+ AVStream *st;
30+
31+ st = avformat_new_stream(s, NULL);
32+ if (!st)
33+ return AVERROR(ENOMEM);
34+
35+ st->codec->codec_type = AVMEDIA_TYPE_AUDIO;
36+ st->codec->codec_id = AV_CODEC_ID_ADPCM_G722;
37+ st->codec->sample_rate = 16000;
38+ st->codec->channels = 1;
39+
40+ st->codec->bits_per_coded_sample =
41+ av_get_bits_per_sample(st->codec->codec_id);
42+
43+ av_assert0(st->codec->bits_per_coded_sample > 0);
44+
45+ avpriv_set_pts_info(st, 64, 1, st->codec->sample_rate);
46+ return 0;
47+}
48+
49+AVInputFormat ff_g722_demuxer = {
50+ .name = "g722",
51+ .long_name = NULL_IF_CONFIG_SMALL("raw G.722"),
52+ .read_header = g722_read_header,
53+ .read_packet = ff_raw_read_partial_packet,
54+ .flags = AVFMT_GENERIC_INDEX,
55+ .extensions = "g722,722",
56+ .raw_codec_id = AV_CODEC_ID_ADPCM_G722,
57+};
libavformat/pcmdec.c+37−4
@@ -20,7 +20,7 @@ · 19 unmodified lines
2020 */
2121
2222 #include "avformat.h"
23−#include "rawdec.h"
23+#include "internal.h"
2424 #include "pcm.h"
2525 #include "libavutil/log.h"
2626 #include "libavutil/opt.h"
@@ -28,6 +28,39 @@ · 1 unmodified line
2828
2929 #define RAW_SAMPLES 1024
3030
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+
3164 static int raw_read_packet(AVFormatContext *s, AVPacket *pkt)
3265 {
3366 int ret, size, bps;
@@ -51,8 +84,8 @@ static int raw_read_packet(AVFormatContext *s, AVPacket *pkt) · 17 unmodified lines
5184 }
5285
5386 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 },
87+ { "sample_rate", "", offsetof(RawAudioDemuxerContext, sample_rate), AV_OPT_TYPE_INT, {.i64 = 44100}, 0, INT_MAX, AV_OPT_FLAG_DECODING_PARAM },
88+ { "channels", "", offsetof(RawAudioDemuxerContext, channels), AV_OPT_TYPE_INT, {.i64 = 1}, 0, INT_MAX, AV_OPT_FLAG_DECODING_PARAM },
5689 { NULL },
5790 };
5891
@@ -67,7 +100,7 @@ AVInputFormat ff_pcm_ ## name_ ## _demuxer = { \ · 8 unmodified lines
67100 .name = #name_, \
68101 .long_name = NULL_IF_CONFIG_SMALL(long_name_), \
69102 .priv_data_size = sizeof(RawAudioDemuxerContext), \
70− .read_header = ff_raw_read_header, \
103+ .read_header = raw_read_header, \
71104 .read_packet = raw_read_packet, \
72105 .read_seek = ff_pcm_read_seek, \
73106 .flags = AVFMT_GENERIC_INDEX, \
libavformat/rawdec.c+0−88
@@ -29,82 +29,6 @@ · 28 unmodified lines
2929 #include "libavutil/pixdesc.h"
3030 #include "libavutil/avassert.h"
3131
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−
10832 #define RAW_PACKET_SIZE 1024
10933
11034 int ff_raw_read_partial_packet(AVFormatContext *s, AVPacket *pkt)
@@ -181,18 +105,6 @@ const AVOption ff_rawvideo_options[] = { · 70 unmodified lines
181105 { NULL },
182106 };
183107
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−
196108 #if CONFIG_LATM_DEMUXER
197109 AVInputFormat ff_latm_demuxer = {
198110 .name = "latm",
libavformat/rawdec.h+0−8
@@ -26,12 +26,6 @@ · 25 unmodified lines
2626 #include "libavutil/log.h"
2727 #include "libavutil/opt.h"
2828
29−typedef struct RawAudioDemuxerContext {
30− AVClass *class;
31− int sample_rate;
32− int channels;
33−} RawAudioDemuxerContext;
34−
3529 typedef struct FFRawVideoDemuxerContext {
3630 const AVClass *class; /**< Class for private options. */
3731 char *video_size; /**< String describing video size, set by a private option. */
@@ -41,8 +35,6 @@ typedef struct FFRawVideoDemuxerContext { · 3 unmodified lines
4135
4236 extern const AVOption ff_rawvideo_options[];
4337
44−int ff_raw_read_header(AVFormatContext *s);
45−
4638 int ff_raw_read_partial_packet(AVFormatContext *s, AVPacket *pkt);
4739
4840 int ff_raw_audio_read_header(AVFormatContext *s);
libavformat/rawvideodec.c+61−7
@@ -19,8 +19,63 @@ · 18 unmodified lines
1919 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
2020 */
2121
22+#include "libavutil/parseutils.h"
23+#include "libavutil/pixdesc.h"
24+#include "libavutil/opt.h"
25+#include "internal.h"
2226 #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+
2479
2580 static int rawvideo_read_packet(AVFormatContext *s, AVPacket *pkt)
2681 {
@@ -34,9 +89,8 @@ static int rawvideo_read_packet(AVFormatContext *s, AVPacket *pkt) · 7 unmodified lines
3489 if (packet_size < 0)
3590 return -1;
3691
37− ret= av_get_packet(s->pb, pkt, packet_size);
38− pkt->pts=
39− pkt->dts= pkt->pos / packet_size;
92+ ret = av_get_packet(s->pb, pkt, packet_size);
93+ pkt->pts = pkt->dts = pkt->pos / packet_size;
4094
4195 pkt->stream_index = 0;
4296 if (ret < 0)
@@ -44,7 +98,7 @@ static int rawvideo_read_packet(AVFormatContext *s, AVPacket *pkt) · 1 unmodified line
4498 return 0;
4599 }
46100
47−#define OFFSET(x) offsetof(FFRawVideoDemuxerContext, x)
101+#define OFFSET(x) offsetof(RawVideoDemuxerContext, x)
48102 #define DEC AV_OPT_FLAG_DECODING_PARAM
49103 static const AVOption rawvideo_options[] = {
50104 { "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 = { · 12 unmodified lines
63117 AVInputFormat ff_rawvideo_demuxer = {
64118 .name = "rawvideo",
65119 .long_name = NULL_IF_CONFIG_SMALL("raw video"),
66− .priv_data_size = sizeof(FFRawVideoDemuxerContext),
67− .read_header = ff_raw_read_header,
120+ .priv_data_size = sizeof(RawVideoDemuxerContext),
121+ .read_header = rawvideo_read_header,
68122 .read_packet = rawvideo_read_packet,
69123 .flags = AVFMT_GENERIC_INDEX,
70124 .extensions = "yuv,cif,qcif,rgb",

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t