/*
 * VC-1 demuxer
 * Copyright (c) 2015 Carl Eugen Hoyos
 *
 * This file is part of FFmpeg.
 *
 * FFmpeg is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * FFmpeg is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with FFmpeg; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 */

#include "avformat.h"
#include "rawdec.h"
#include "libavutil/intreadwrite.h"
#include "libavcodec/vc1_common.h"

static int vc1_probe(AVProbeData *p)
{
    int seq = 0, entry = 0, frame = 0, i;

    for (i = 0; i < p->buf_size + 5; i++) {
        uint32_t code = AV_RB32(p->buf + i);
        if ((code & 0xffffffe0) == 0x100) {
            int type = code & 0x11f;
            i += 4;
            switch (type) {
            case VC1_CODE_SEQHDR: {
                int profile, level, chromaformat;
                profile = (p->buf[i] & 0xc0) >> 6;
                if (profile != PROFILE_ADVANCED) {
                    seq = 0;
                    continue;
                }
                level = (p->buf[i] & 0x38) >> 3;
                if (level >= 5) {
                    seq = 0;
                    continue;
                }
                chromaformat = (p->buf[i] & 0x6) >> 1;
                if (chromaformat != 1) {
                    seq = 0;
                    continue;
                }
                seq++;
                i += 6;
                break;
            }
            case VC1_CODE_ENTRYPOINT:
                if (!seq)
                    continue;
                entry++;
                i += 2;
                break;
            case VC1_CODE_FRAME:
            case VC1_CODE_FIELD:
            case VC1_CODE_SLICE:
                if (seq && entry)
                    frame++;
                break;
            }
        }
    }

    if (frame > 1)
        return AVPROBE_SCORE_EXTENSION / 2 + 1;
    if (frame == 1)
        return AVPROBE_SCORE_EXTENSION / 4;
    return 0;
}

FF_DEF_RAWVIDEO_DEMUXER2(vc1, "raw VC-1", vc1_probe, "vc1", AV_CODEC_ID_VC1, AVFMT_GENERIC_INDEX|AVFMT_NOTIMESTAMPS)
