[FFmpeg-devel] [PATCH] avformat/img2: add ff_guess_image2_codec2()

wm4 nfxjfg at googlemail.com
Thu Mar 27 13:08:55 CET 2014


On Thu, 27 Mar 2014 03:44:41 +0100
Michael Niedermayer <michaelni at gmx.at> wrote:

> Fixes brender detection
> If more input formats need this, then the code should be moved into some
> probe_codec() in each AVCodec or some img2 specific system of per codec
> probe functions inside img2.
> But this seems overkill for just 1 format needing it.

Uh what? Proper detection of image file formats instead of by file
extension is something libavformat always needed. You are adding a hack
to a hack.

> Signed-off-by: Michael Niedermayer <michaelni at gmx.at>
> ---
>  libavformat/img2.c     |   24 ++++++++++++++++++++++++
>  libavformat/img2dec.c  |    7 ++++++-
>  libavformat/internal.h |    1 +
>  3 files changed, 31 insertions(+), 1 deletion(-)
> 
> diff --git a/libavformat/img2.c b/libavformat/img2.c
> index 183bf73..338d4b4 100644
> --- a/libavformat/img2.c
> +++ b/libavformat/img2.c
> @@ -98,6 +98,30 @@ static enum AVCodecID av_str2id(const IdStrMap *tags, const char *str)
>      return AV_CODEC_ID_NONE;
>  }
>  
> +enum AVCodecID ff_guess_image2_codec2(const char *filename, AVIOContext *pb)
> +{
> +    enum AVCodecID codec_id = av_str2id(img_tags, filename);
> +    uint8_t header[16];
> +    int ret;
> +    static const uint8_t brender_magic[16] = {
> +        0,0,0,0x12,0,0,0,8,0,0,0,2,0,0,0,2
> +    };
> +
> +    if (codec_id == AV_CODEC_ID_ALIAS_PIX) {
> +        if (!pb)
> +            return AV_CODEC_ID_NONE;
> +
> +        ret = avio_read(pb, header, sizeof(header));
> +        avio_skip(pb, -sizeof(header));
> +        if (ret != sizeof(header))
> +            return AV_CODEC_ID_NONE;
> +
> +        if (!memcmp(header, brender_magic, sizeof(brender_magic)))
> +            codec_id = AV_CODEC_ID_BRENDER_PIX;
> +    }
> +    return codec_id;
> +}
> +
>  enum AVCodecID ff_guess_image2_codec(const char *filename)
>  {
>      return av_str2id(img_tags, filename);
> diff --git a/libavformat/img2dec.c b/libavformat/img2dec.c
> index 5163e69..f5c1083 100644
> --- a/libavformat/img2dec.c
> +++ b/libavformat/img2dec.c
> @@ -317,7 +317,7 @@ static int img_read_header(AVFormatContext *s1)
>          const char *str = strrchr(s->path, '.');
>          s->split_planes       = str && !av_strcasecmp(str + 1, "y");
>          st->codec->codec_type = AVMEDIA_TYPE_VIDEO;
> -        st->codec->codec_id   = ff_guess_image2_codec(s->path);
> +        st->codec->codec_id = ff_guess_image2_codec2(s->path, NULL);
>          if (st->codec->codec_id == AV_CODEC_ID_LJPEG)
>              st->codec->codec_id = AV_CODEC_ID_MJPEG;
>      }
> @@ -370,6 +370,11 @@ static int img_read_packet(AVFormatContext *s1, AVPacket *pkt)
>                  break;
>              filename[strlen(filename) - 1] = 'U' + i;
>          }
> +        if (codec->codec_id == AV_CODEC_ID_NONE) {
> +            codec->codec_id = ff_guess_image2_codec2(s->path, f[0]);
> +            if (codec->codec_id == AV_CODEC_ID_LJPEG)
> +                codec->codec_id = AV_CODEC_ID_MJPEG;
> +        }
>  
>          if (codec->codec_id == AV_CODEC_ID_RAWVIDEO && !codec->width)
>              infer_size(&codec->width, &codec->height, size[0]);
> diff --git a/libavformat/internal.h b/libavformat/internal.h
> index f19cebf..585b264 100644
> --- a/libavformat/internal.h
> +++ b/libavformat/internal.h
> @@ -228,6 +228,7 @@ AVChapter *avpriv_new_chapter(AVFormatContext *s, int id, AVRational time_base,
>  void ff_reduce_index(AVFormatContext *s, int stream_index);
>  
>  enum AVCodecID ff_guess_image2_codec(const char *filename);
> +enum AVCodecID ff_guess_image2_codec2(const char *filename, AVIOContext *pb);
>  
>  /**
>   * Convert a date string in ISO8601 format to Unix timestamp.



More information about the ffmpeg-devel mailing list