* 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
Unified · Split
| @@ -1082,10 +1082,14 @@ static void print_report(int is_last_report, int64_t timer_start, int64_t cur_ti · 1081 unmodified lines | |||
| 1082 | oc = output_files[0]->ctx; | 1082 | oc = output_files[0]->ctx; |
| 1083 | 1083 | ||
| 1084 | total_size = avio_size(oc->pb); | 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 | total_size = avio_tell(oc->pb); | 1086 | total_size = avio_tell(oc->pb); |
| 1087 | if (total_size < 0) | 1087 | if (total_size < 0) { |
| 1088 | 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 | buf[0] = '\0'; | 1095 | buf[0] = '\0'; |
| @@ -239,10 +239,11 @@ static int link_filter_inouts(AVFilterContext *filt_ctx, · 238 unmodified lines | |||
| 239 | return AVERROR(ENOMEM); | 239 | return AVERROR(ENOMEM); |
| 240 | 240 | ||
| 241 | if (p->filter_ctx) { | 241 | if (p->filter_ctx) { |
| 242 | if ((ret = link_filter(p->filter_ctx, p->pad_idx, filt_ctx, pad, log_ctx)) < 0) | 242 | ret = link_filter(p->filter_ctx, p->pad_idx, filt_ctx, pad, log_ctx); |
| 243 | return ret; | ||
| 244 | av_free(p->name); | 243 | av_free(p->name); |
| 245 | av_free(p); | 244 | av_free(p); |
| 245 | if (ret < 0) | ||
| 246 | return ret; | ||
| 246 | } else { | 247 | } else { |
| 247 | p->filter_ctx = filt_ctx; | 248 | p->filter_ctx = filt_ctx; |
| 248 | p->pad_idx = pad; | 249 | p->pad_idx = pad; |
| @@ -290,8 +291,10 @@ static int parse_inputs(const char **buf, AVFilterInOut **curr_inputs, · 41 unmodified lines | |||
| 290 | av_free(name); | 291 | av_free(name); |
| 291 | } else { | 292 | } else { |
| 292 | /* Not in the list, so add it as an input */ | 293 | /* 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); | ||
| 294 | return AVERROR(ENOMEM); | 296 | return AVERROR(ENOMEM); |
| 297 | } | ||
| 295 | match->name = name; | 298 | match->name = name; |
| 296 | match->pad_idx = pad; | 299 | match->pad_idx = pad; |
| 297 | } | 300 | } |
| @@ -319,24 +322,27 @@ static int parse_outputs(const char **buf, AVFilterInOut **curr_inputs, · 21 unmodified lines | |||
| 319 | AVFilterInOut *match; | 322 | AVFilterInOut *match; |
| 320 | 323 | ||
| 321 | AVFilterInOut *input = *curr_inputs; | 324 | AVFilterInOut *input = *curr_inputs; |
| 325 | |||
| 326 | if (!name) | ||
| 327 | return AVERROR(EINVAL); | ||
| 328 | |||
| 322 | if (!input) { | 329 | if (!input) { |
| 323 | av_log(log_ctx, AV_LOG_ERROR, | 330 | av_log(log_ctx, AV_LOG_ERROR, |
| 324 | "No output pad can be associated to link label '%s'.\n", | 331 | "No output pad can be associated to link label '%s'.\n", name); |
| 325 | name); | 332 | av_free(name); |
| 326 | return AVERROR(EINVAL); | 333 | return AVERROR(EINVAL); |
| 327 | } | 334 | } |
| 328 | *curr_inputs = (*curr_inputs)->next; | 335 | *curr_inputs = (*curr_inputs)->next; |
| 329 | 336 | ||
| 330 | if (!name) | ||
| 331 | return AVERROR(EINVAL); | ||
| 332 | |||
| 333 | /* First check if the label is not in the open_inputs list */ | 337 | /* First check if the label is not in the open_inputs list */ |
| 334 | match = extract_inout(name, open_inputs); | 338 | match = extract_inout(name, open_inputs); |
| 335 | 339 | ||
| 336 | if (match) { | 340 | if (match) { |
| 337 | if ((ret = link_filter(input->filter_ctx, input->pad_idx, | 341 | 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); | ||
| 339 | return ret; | 344 | return ret; |
| 345 | } | ||
| 340 | av_free(match->name); | 346 | av_free(match->name); |
| 341 | av_free(name); | 347 | av_free(name); |
| 342 | av_free(match); | 348 | av_free(match); |
| @@ -112,7 +112,7 @@ OBJS-$(CONFIG_GIF_MUXER) += gif.o · 111 unmodified lines | |||
| 112 | OBJS-$(CONFIG_GSM_DEMUXER) += gsmdec.o | 112 | OBJS-$(CONFIG_GSM_DEMUXER) += gsmdec.o |
| 113 | OBJS-$(CONFIG_GXF_DEMUXER) += gxf.o | 113 | OBJS-$(CONFIG_GXF_DEMUXER) += gxf.o |
| 114 | OBJS-$(CONFIG_GXF_MUXER) += gxfenc.o audiointerleave.o | 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 | OBJS-$(CONFIG_G722_MUXER) += rawenc.o | 116 | OBJS-$(CONFIG_G722_MUXER) += rawenc.o |
| 117 | OBJS-$(CONFIG_G723_1_DEMUXER) += g723_1.o | 117 | OBJS-$(CONFIG_G723_1_DEMUXER) += g723_1.o |
| 118 | OBJS-$(CONFIG_G723_1_MUXER) += rawenc.o | 118 | OBJS-$(CONFIG_G723_1_MUXER) += rawenc.o |
| @@ -220,51 +220,51 @@ OBJS-$(CONFIG_OGG_MUXER) += oggenc.o \ · 101 unmodified lines | |||
| 220 | OBJS-$(CONFIG_OMA_DEMUXER) += omadec.o pcm.o oma.o | 220 | OBJS-$(CONFIG_OMA_DEMUXER) += omadec.o pcm.o oma.o |
| 221 | OBJS-$(CONFIG_OMA_MUXER) += omaenc.o rawenc.o oma.o id3v2enc.o | 221 | OBJS-$(CONFIG_OMA_MUXER) += omaenc.o rawenc.o oma.o id3v2enc.o |
| 222 | OBJS-$(CONFIG_PAF_DEMUXER) += paf.o | 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 | OBJS-$(CONFIG_PCM_ALAW_MUXER) += pcmenc.o rawenc.o | 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 | OBJS-$(CONFIG_PCM_F32BE_MUXER) += pcmenc.o rawenc.o | 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 | OBJS-$(CONFIG_PCM_F32LE_MUXER) += pcmenc.o rawenc.o | 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 | OBJS-$(CONFIG_PCM_F64BE_MUXER) += pcmenc.o rawenc.o | 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 | OBJS-$(CONFIG_PCM_F64LE_MUXER) += pcmenc.o rawenc.o | 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 | OBJS-$(CONFIG_PCM_MULAW_MUXER) += pcmenc.o rawenc.o | 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 | OBJS-$(CONFIG_PCM_S16BE_MUXER) += pcmenc.o rawenc.o | 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 | OBJS-$(CONFIG_PCM_S16LE_MUXER) += pcmenc.o rawenc.o | 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 | OBJS-$(CONFIG_PCM_S24BE_MUXER) += pcmenc.o rawenc.o | 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 | OBJS-$(CONFIG_PCM_S24LE_MUXER) += pcmenc.o rawenc.o | 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 | OBJS-$(CONFIG_PCM_S32BE_MUXER) += pcmenc.o rawenc.o | 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 | OBJS-$(CONFIG_PCM_S32LE_MUXER) += pcmenc.o rawenc.o | 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 | OBJS-$(CONFIG_PCM_S8_MUXER) += pcmenc.o rawenc.o | 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 | OBJS-$(CONFIG_PCM_U16BE_MUXER) += pcmenc.o rawenc.o | 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 | OBJS-$(CONFIG_PCM_U16LE_MUXER) += pcmenc.o rawenc.o | 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 | OBJS-$(CONFIG_PCM_U24BE_MUXER) += pcmenc.o rawenc.o | 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 | OBJS-$(CONFIG_PCM_U24LE_MUXER) += pcmenc.o rawenc.o | 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 | OBJS-$(CONFIG_PCM_U32BE_MUXER) += pcmenc.o rawenc.o | 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 | OBJS-$(CONFIG_PCM_U32LE_MUXER) += pcmenc.o rawenc.o | 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 | OBJS-$(CONFIG_PCM_U8_MUXER) += pcmenc.o rawenc.o | 262 | OBJS-$(CONFIG_PCM_U8_MUXER) += pcmenc.o rawenc.o |
| 263 | OBJS-$(CONFIG_PMP_DEMUXER) += pmpdec.o | 263 | OBJS-$(CONFIG_PMP_DEMUXER) += pmpdec.o |
| 264 | OBJS-$(CONFIG_PVA_DEMUXER) += pva.o | 264 | OBJS-$(CONFIG_PVA_DEMUXER) += pva.o |
| 265 | OBJS-$(CONFIG_QCP_DEMUXER) += qcp.o | 265 | OBJS-$(CONFIG_QCP_DEMUXER) += qcp.o |
| 266 | OBJS-$(CONFIG_R3D_DEMUXER) += r3d.o | 266 | OBJS-$(CONFIG_R3D_DEMUXER) += r3d.o |
| 267 | OBJS-$(CONFIG_RAWVIDEO_DEMUXER) += rawvideodec.o rawdec.o | 267 | OBJS-$(CONFIG_RAWVIDEO_DEMUXER) += rawvideodec.o |
| 268 | OBJS-$(CONFIG_RAWVIDEO_MUXER) += rawenc.o | 268 | OBJS-$(CONFIG_RAWVIDEO_MUXER) += rawenc.o |
| 269 | OBJS-$(CONFIG_REALTEXT_DEMUXER) += realtextdec.o | 269 | OBJS-$(CONFIG_REALTEXT_DEMUXER) += realtextdec.o |
| 270 | OBJS-$(CONFIG_RL2_DEMUXER) += rl2.o | 270 | OBJS-$(CONFIG_RL2_DEMUXER) += rl2.o |
| @@ -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 | }; | ||
| @@ -20,7 +20,7 @@ · 19 unmodified lines | |||
| 20 | */ | 20 | */ |
| 21 | 21 | ||
| 22 | #include "avformat.h" | 22 | #include "avformat.h" |
| 23 | #include "rawdec.h" | 23 | #include "internal.h" |
| 24 | #include "pcm.h" | 24 | #include "pcm.h" |
| 25 | #include "libavutil/log.h" | 25 | #include "libavutil/log.h" |
| 26 | #include "libavutil/opt.h" | 26 | #include "libavutil/opt.h" |
| @@ -28,6 +28,39 @@ · 1 unmodified line | |||
| 28 | 28 | ||
| 29 | #define RAW_SAMPLES 1024 | 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 | static int raw_read_packet(AVFormatContext *s, AVPacket *pkt) | 64 | static int raw_read_packet(AVFormatContext *s, AVPacket *pkt) |
| 32 | { | 65 | { |
| 33 | int ret, size, bps; | 66 | int ret, size, bps; |
| @@ -51,8 +84,8 @@ static int raw_read_packet(AVFormatContext *s, AVPacket *pkt) · 17 unmodified lines | |||
| 51 | } | 84 | } |
| 52 | 85 | ||
| 53 | static const AVOption pcm_options[] = { | 86 | 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 }, | 87 | { "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 = 0}, 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 }, |
| 56 | { NULL }, | 89 | { NULL }, |
| 57 | }; | 90 | }; |
| 58 | 91 | ||
| @@ -67,7 +100,7 @@ AVInputFormat ff_pcm_ ## name_ ## _demuxer = { \ · 8 unmodified lines | |||
| 67 | .name = #name_, \ | 100 | .name = #name_, \ |
| 68 | .long_name = NULL_IF_CONFIG_SMALL(long_name_), \ | 101 | .long_name = NULL_IF_CONFIG_SMALL(long_name_), \ |
| 69 | .priv_data_size = sizeof(RawAudioDemuxerContext), \ | 102 | .priv_data_size = sizeof(RawAudioDemuxerContext), \ |
| 70 | .read_header = ff_raw_read_header, \ | 103 | .read_header = raw_read_header, \ |
| 71 | .read_packet = raw_read_packet, \ | 104 | .read_packet = raw_read_packet, \ |
| 72 | .read_seek = ff_pcm_read_seek, \ | 105 | .read_seek = ff_pcm_read_seek, \ |
| 73 | .flags = AVFMT_GENERIC_INDEX, \ | 106 | .flags = AVFMT_GENERIC_INDEX, \ |
| @@ -29,82 +29,6 @@ · 28 unmodified lines | |||
| 29 | #include "libavutil/pixdesc.h" | 29 | #include "libavutil/pixdesc.h" |
| 30 | #include "libavutil/avassert.h" | 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 | #define RAW_PACKET_SIZE 1024 | 32 | #define RAW_PACKET_SIZE 1024 |
| 109 | 33 | ||
| 110 | int ff_raw_read_partial_packet(AVFormatContext *s, AVPacket *pkt) | 34 | int ff_raw_read_partial_packet(AVFormatContext *s, AVPacket *pkt) |
| @@ -181,18 +105,6 @@ const AVOption ff_rawvideo_options[] = { · 70 unmodified lines | |||
| 181 | { NULL }, | 105 | { NULL }, |
| 182 | }; | 106 | }; |
| 183 | 107 | ||
| 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 | #if CONFIG_LATM_DEMUXER | 108 | #if CONFIG_LATM_DEMUXER |
| 197 | AVInputFormat ff_latm_demuxer = { | 109 | AVInputFormat ff_latm_demuxer = { |
| 198 | .name = "latm", | 110 | .name = "latm", |
| @@ -26,12 +26,6 @@ · 25 unmodified lines | |||
| 26 | #include "libavutil/log.h" | 26 | #include "libavutil/log.h" |
| 27 | #include "libavutil/opt.h" | 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 | typedef struct FFRawVideoDemuxerContext { | 29 | typedef struct FFRawVideoDemuxerContext { |
| 36 | const AVClass *class; /**< Class for private options. */ | 30 | const AVClass *class; /**< Class for private options. */ |
| 37 | char *video_size; /**< String describing video size, set by a private option. */ | 31 | char *video_size; /**< String describing video size, set by a private option. */ |
| @@ -41,8 +35,6 @@ typedef struct FFRawVideoDemuxerContext { · 3 unmodified lines | |||
| 41 | 35 | ||
| 42 | extern const AVOption ff_rawvideo_options[]; | 36 | extern const AVOption ff_rawvideo_options[]; |
| 43 | 37 | ||
| 44 | int ff_raw_read_header(AVFormatContext *s); | ||
| 45 | |||
| 46 | int ff_raw_read_partial_packet(AVFormatContext *s, AVPacket *pkt); | 38 | int ff_raw_read_partial_packet(AVFormatContext *s, AVPacket *pkt); |
| 47 | 39 | ||
| 48 | int ff_raw_audio_read_header(AVFormatContext *s); | 40 | int ff_raw_audio_read_header(AVFormatContext *s); |
| @@ -19,8 +19,63 @@ · 18 unmodified lines | |||
| 19 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | 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 | #include "avformat.h" | 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 | static int rawvideo_read_packet(AVFormatContext *s, AVPacket *pkt) | 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) · 7 unmodified lines | |||
| 34 | if (packet_size < 0) | 89 | if (packet_size < 0) |
| 35 | return -1; | 90 | return -1; |
| 36 | 91 | ||
| 37 | ret= av_get_packet(s->pb, pkt, packet_size); | 92 | ret = av_get_packet(s->pb, pkt, packet_size); |
| 38 | pkt->pts= | 93 | pkt->pts = pkt->dts = pkt->pos / packet_size; |
| 39 | pkt->dts= pkt->pos / packet_size; | ||
| 40 | 94 | ||
| 41 | pkt->stream_index = 0; | 95 | pkt->stream_index = 0; |
| 42 | if (ret < 0) | 96 | if (ret < 0) |
| @@ -44,7 +98,7 @@ static int rawvideo_read_packet(AVFormatContext *s, AVPacket *pkt) · 1 unmodified line | |||
| 44 | return 0; | 98 | return 0; |
| 45 | } | 99 | } |
| 46 | 100 | ||
| 47 | #define OFFSET(x) offsetof(FFRawVideoDemuxerContext, x) | 101 | #define OFFSET(x) offsetof(RawVideoDemuxerContext, x) |
| 48 | #define DEC AV_OPT_FLAG_DECODING_PARAM | 102 | #define DEC AV_OPT_FLAG_DECODING_PARAM |
| 49 | static const AVOption rawvideo_options[] = { | 103 | static const AVOption rawvideo_options[] = { |
| 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 }, | 104 | { "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 | |||
| 63 | AVInputFormat ff_rawvideo_demuxer = { | 117 | AVInputFormat ff_rawvideo_demuxer = { |
| 64 | .name = "rawvideo", | 118 | .name = "rawvideo", |
| 65 | .long_name = NULL_IF_CONFIG_SMALL("raw video"), | 119 | .long_name = NULL_IF_CONFIG_SMALL("raw video"), |
| 66 | .priv_data_size = sizeof(FFRawVideoDemuxerContext), | 120 | .priv_data_size = sizeof(RawVideoDemuxerContext), |
| 67 | .read_header = ff_raw_read_header, | 121 | .read_header = rawvideo_read_header, |
| 68 | .read_packet = rawvideo_read_packet, | 122 | .read_packet = rawvideo_read_packet, |
| 69 | .flags = AVFMT_GENERIC_INDEX, | 123 | .flags = AVFMT_GENERIC_INDEX, |
| 70 | .extensions = "yuv,cif,qcif,rgb", | 124 | .extensions = "yuv,cif,qcif,rgb", |