X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavformat%2Fsegafilm.c;h=c2a163d9fcfab738d4d64693de0d6ecd6f650569;hb=178f8ea76e52f79e2b7f4a01973d11f5c518f915;hp=1ae105eb77ba0013c482f4405dab611b23111c55;hpb=3638f56dca167a408b6da7fb78cade08780f7d85;p=ffmpeg diff --git a/libavformat/segafilm.c b/libavformat/segafilm.c index 1ae105eb77b..c2a163d9fcf 100644 --- a/libavformat/segafilm.c +++ b/libavformat/segafilm.c @@ -29,11 +29,14 @@ #include "libavutil/intreadwrite.h" #include "avformat.h" +#include "internal.h" +#include "avio_internal.h" #define FILM_TAG MKBETAG('F', 'I', 'L', 'M') #define FDSC_TAG MKBETAG('F', 'D', 'S', 'C') #define STAB_TAG MKBETAG('S', 'T', 'A', 'B') #define CVID_TAG MKBETAG('c', 'v', 'i', 'd') +#define RAW_TAG MKBETAG('r', 'a', 'w', ' ') typedef struct { int stream; @@ -129,8 +132,11 @@ static int film_read_header(AVFormatContext *s, if (AV_RB32(&scratch[8]) == CVID_TAG) { film->video_type = CODEC_ID_CINEPAK; - } else + } else if (AV_RB32(&scratch[8]) == RAW_TAG) { + film->video_type = CODEC_ID_RAWVIDEO; + } else { film->video_type = CODEC_ID_NONE; + } /* initialize the decoder streams */ if (film->video_type) { @@ -143,6 +149,15 @@ static int film_read_header(AVFormatContext *s, st->codec->codec_tag = 0; /* no fourcc */ st->codec->width = AV_RB32(&scratch[16]); st->codec->height = AV_RB32(&scratch[12]); + + if (film->video_type == CODEC_ID_RAWVIDEO) { + if (scratch[20] == 24) { + st->codec->pix_fmt = PIX_FMT_RGB24; + } else { + av_log(s, AV_LOG_ERROR, "raw video is using unhandled %dbpp\n", scratch[20]); + return -1; + } + } } if (film->audio_type) { @@ -159,6 +174,7 @@ static int film_read_header(AVFormatContext *s, if (film->audio_type == CODEC_ID_ADPCM_ADX) { st->codec->bits_per_coded_sample = 18 * 8 / 32; st->codec->block_align = st->codec->channels * 18; + st->need_parsing = AVSTREAM_PARSE_FULL; } else { st->codec->bits_per_coded_sample = film->audio_bits; st->codec->block_align = st->codec->channels * @@ -183,7 +199,7 @@ static int film_read_header(AVFormatContext *s, return AVERROR(ENOMEM); for(i=0; inb_streams; i++) - av_set_pts_info(s->streams[i], 33, 1, film->base_clock); + avpriv_set_pts_info(s->streams[i], 33, 1, film->base_clock); audio_frame_counter = 0; for (i = 0; i < film->sample_count; i++) { @@ -249,6 +265,8 @@ static int film_read_packet(AVFormatContext *s, (film->audio_type != CODEC_ID_ADPCM_ADX)) { /* stereo PCM needs to be interleaved */ + if (ffio_limit(pb, sample->sample_size) != sample->sample_size) + return AVERROR(EIO); if (av_new_packet(pkt, sample->sample_size)) return AVERROR(ENOMEM);