X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavformat%2Frawdec.c;h=41e1700b8b464bf6be7bf928348a17f8f071656f;hb=342c43d154e586bc022c86b168fe8d36f69da9d3;hp=0b9a0824ff0ff3d8ca06614d5a85b7849dfc37eb;hpb=34d2bf30a082d489487493df40496cc18ca4300b;p=ffmpeg diff --git a/libavformat/rawdec.c b/libavformat/rawdec.c index 0b9a0824ff0..41e1700b8b4 100644 --- a/libavformat/rawdec.c +++ b/libavformat/rawdec.c @@ -21,82 +21,13 @@ */ #include "avformat.h" +#include "internal.h" #include "avio_internal.h" #include "rawdec.h" #include "libavutil/opt.h" #include "libavutil/parseutils.h" #include "libavutil/pixdesc.h" -/* raw input */ -int ff_raw_read_header(AVFormatContext *s, AVFormatParameters *ap) -{ - AVStream *st; - enum CodecID id; - - st = av_new_stream(s, 0); - if (!st) - return AVERROR(ENOMEM); - - id = s->iformat->value; - if (id == CODEC_ID_RAWVIDEO) { - st->codec->codec_type = AVMEDIA_TYPE_VIDEO; - } else { - st->codec->codec_type = AVMEDIA_TYPE_AUDIO; - } - st->codec->codec_id = id; - - switch(st->codec->codec_type) { - case AVMEDIA_TYPE_AUDIO: { - RawAudioDemuxerContext *s1 = s->priv_data; - - st->codec->channels = 1; - - if (id == CODEC_ID_ADPCM_G722) - st->codec->sample_rate = 16000; - - if (s1 && s1->sample_rate) - st->codec->sample_rate = s1->sample_rate; - if (s1 && s1->channels) - st->codec->channels = s1->channels; - - st->codec->bits_per_coded_sample = av_get_bits_per_sample(st->codec->codec_id); - assert(st->codec->bits_per_coded_sample > 0); - st->codec->block_align = st->codec->bits_per_coded_sample*st->codec->channels/8; - av_set_pts_info(st, 64, 1, st->codec->sample_rate); - break; - } - case AVMEDIA_TYPE_VIDEO: { - FFRawVideoDemuxerContext *s1 = s->priv_data; - int width = 0, height = 0, ret = 0; - enum PixelFormat pix_fmt; - AVRational framerate; - - if (s1->video_size && (ret = av_parse_video_size(&width, &height, s1->video_size)) < 0) { - av_log(s, AV_LOG_ERROR, "Couldn't parse video size.\n"); - goto fail; - } - if ((pix_fmt = av_get_pix_fmt(s1->pixel_format)) == PIX_FMT_NONE) { - av_log(s, AV_LOG_ERROR, "No such pixel format: %s.\n", s1->pixel_format); - ret = AVERROR(EINVAL); - goto fail; - } - if ((ret = av_parse_video_rate(&framerate, s1->framerate)) < 0) { - av_log(s, AV_LOG_ERROR, "Could not parse framerate: %s.\n", s1->framerate); - goto fail; - } - av_set_pts_info(st, 64, framerate.den, framerate.num); - st->codec->width = width; - st->codec->height = height; - st->codec->pix_fmt = pix_fmt; -fail: - return ret; - } - default: - return -1; - } - return 0; -} - #define RAW_PACKET_SIZE 1024 int ff_raw_read_partial_packet(AVFormatContext *s, AVPacket *pkt) @@ -114,28 +45,31 @@ int ff_raw_read_partial_packet(AVFormatContext *s, AVPacket *pkt) if (ret < 0) { av_free_packet(pkt); return ret; + } else if (ret < size) { + /* initialize end of packet for partial reads to avoid reading + * uninitialized data on allowed overreads */ + memset(pkt->data + ret, 0, FF_INPUT_BUFFER_PADDING_SIZE); } pkt->size = ret; return ret; } -int ff_raw_audio_read_header(AVFormatContext *s, - AVFormatParameters *ap) +int ff_raw_audio_read_header(AVFormatContext *s) { - AVStream *st = av_new_stream(s, 0); + AVStream *st = avformat_new_stream(s, NULL); if (!st) return AVERROR(ENOMEM); st->codec->codec_type = AVMEDIA_TYPE_AUDIO; - st->codec->codec_id = s->iformat->value; + st->codec->codec_id = s->iformat->raw_codec_id; st->need_parsing = AVSTREAM_PARSE_FULL; + st->start_time = 0; /* the parameters will be extracted from the compressed bitstream */ return 0; } /* MPEG-1/H.263 input */ -int ff_raw_video_read_header(AVFormatContext *s, - AVFormatParameters *ap) +int ff_raw_video_read_header(AVFormatContext *s) { AVStream *st; FFRawVideoDemuxerContext *s1 = s->priv_data; @@ -143,14 +77,14 @@ int ff_raw_video_read_header(AVFormatContext *s, int ret = 0; - st = av_new_stream(s, 0); + st = avformat_new_stream(s, NULL); if (!st) { ret = AVERROR(ENOMEM); goto fail; } st->codec->codec_type = AVMEDIA_TYPE_VIDEO; - st->codec->codec_id = s->iformat->value; + st->codec->codec_id = s->iformat->raw_codec_id; st->need_parsing = AVSTREAM_PARSE_FULL; if ((ret = av_parse_video_rate(&framerate, s1->framerate)) < 0) { @@ -158,8 +92,8 @@ int ff_raw_video_read_header(AVFormatContext *s, goto fail; } - st->codec->time_base = (AVRational){framerate.den, framerate.num}; - av_set_pts_info(st, 64, 1, 1200000); + st->avg_frame_rate = framerate; + avpriv_set_pts_info(st, 64, framerate.den, framerate.num); fail: return ret; @@ -169,48 +103,25 @@ fail: #define OFFSET(x) offsetof(FFRawVideoDemuxerContext, x) #define DEC AV_OPT_FLAG_DECODING_PARAM -static const AVOption video_options[] = { - { "video_size", "A string describing frame size, such as 640x480 or hd720.", OFFSET(video_size), FF_OPT_TYPE_STRING, {.str = NULL}, 0, 0, DEC }, - { "pixel_format", "", OFFSET(pixel_format), FF_OPT_TYPE_STRING, {.str = "yuv420p"}, 0, 0, DEC }, - { "framerate", "", OFFSET(framerate), FF_OPT_TYPE_STRING, {.str = "25"}, 0, 0, DEC }, +const AVOption ff_rawvideo_options[] = { + { "framerate", "", OFFSET(framerate), AV_OPT_TYPE_STRING, {.str = "25"}, 0, 0, DEC}, { NULL }, }; -#undef OFFSET -#undef DEC - -const AVClass ff_rawvideo_demuxer_class = { - .class_name = "rawvideo demuxer", - .item_name = av_default_item_name, - .option = video_options, - .version = LIBAVUTIL_VERSION_INT, -}; - -#if CONFIG_G722_DEMUXER -AVInputFormat ff_g722_demuxer = { - .name = "g722", - .long_name = NULL_IF_CONFIG_SMALL("raw G.722"), - .read_header = ff_raw_read_header, - .read_packet = ff_raw_read_partial_packet, - .flags= AVFMT_GENERIC_INDEX, - .extensions = "g722,722", - .value = CODEC_ID_ADPCM_G722, -}; -#endif -#if CONFIG_GSM_DEMUXER -AVInputFormat ff_gsm_demuxer = { - .name = "gsm", - .long_name = NULL_IF_CONFIG_SMALL("raw GSM"), +#if CONFIG_LATM_DEMUXER +AVInputFormat ff_latm_demuxer = { + .name = "latm", + .long_name = NULL_IF_CONFIG_SMALL("raw LOAS/LATM"), .read_header = ff_raw_audio_read_header, .read_packet = ff_raw_read_partial_packet, - .flags= AVFMT_GENERIC_INDEX, - .extensions = "gsm", - .value = CODEC_ID_GSM, + .flags = AVFMT_GENERIC_INDEX, + .extensions = "latm", + .raw_codec_id = AV_CODEC_ID_AAC_LATM, }; #endif #if CONFIG_MJPEG_DEMUXER -FF_DEF_RAWVIDEO_DEMUXER(mjpeg, "raw MJPEG video", NULL, "mjpg,mjpeg", CODEC_ID_MJPEG) +FF_DEF_RAWVIDEO_DEMUXER(mjpeg, "raw MJPEG video", NULL, "mjpg,mjpeg", AV_CODEC_ID_MJPEG) #endif #if CONFIG_MLP_DEMUXER @@ -219,9 +130,9 @@ AVInputFormat ff_mlp_demuxer = { .long_name = NULL_IF_CONFIG_SMALL("raw MLP"), .read_header = ff_raw_audio_read_header, .read_packet = ff_raw_read_partial_packet, - .flags= AVFMT_GENERIC_INDEX, - .extensions = "mlp", - .value = CODEC_ID_MLP, + .flags = AVFMT_GENERIC_INDEX, + .extensions = "mlp", + .raw_codec_id = AV_CODEC_ID_MLP, }; #endif @@ -231,9 +142,9 @@ AVInputFormat ff_truehd_demuxer = { .long_name = NULL_IF_CONFIG_SMALL("raw TrueHD"), .read_header = ff_raw_audio_read_header, .read_packet = ff_raw_read_partial_packet, - .flags= AVFMT_GENERIC_INDEX, - .extensions = "thd", - .value = CODEC_ID_TRUEHD, + .flags = AVFMT_GENERIC_INDEX, + .extensions = "thd", + .raw_codec_id = AV_CODEC_ID_TRUEHD, }; #endif @@ -243,12 +154,12 @@ AVInputFormat ff_shorten_demuxer = { .long_name = NULL_IF_CONFIG_SMALL("raw Shorten"), .read_header = ff_raw_audio_read_header, .read_packet = ff_raw_read_partial_packet, - .flags= AVFMT_GENERIC_INDEX, - .extensions = "shn", - .value = CODEC_ID_SHORTEN, + .flags = AVFMT_NOBINSEARCH | AVFMT_NOGENSEARCH | AVFMT_NO_BYTE_SEEK, + .extensions = "shn", + .raw_codec_id = AV_CODEC_ID_SHORTEN, }; #endif #if CONFIG_VC1_DEMUXER -FF_DEF_RAWVIDEO_DEMUXER(vc1, "raw VC-1", NULL, "vc1", CODEC_ID_VC1) +FF_DEF_RAWVIDEO_DEMUXER(vc1, "raw VC-1", NULL, "vc1", AV_CODEC_ID_VC1) #endif