PageRenderTime 26ms CodeModel.GetById 15ms app.highlight 8ms RepoModel.GetById 2ms app.codeStats 0ms

/libavformat/iv8.c

http://github.com/FFmpeg/FFmpeg
C | 117 lines | 79 code | 18 blank | 20 comment | 22 complexity | 8b1e4bec5620ccae9ae5ba91a37ac930 MD5 | raw file
  1/*
  2 * Copyright (c) 2009 Michael Niedermayer
  3 *
  4 * This file is part of FFmpeg.
  5 *
  6 * FFmpeg is free software; you can redistribute it and/or
  7 * modify it under the terms of the GNU Lesser General Public
  8 * License as published by the Free Software Foundation; either
  9 * version 2.1 of the License, or (at your option) any later version.
 10 *
 11 * FFmpeg is distributed in the hope that it will be useful,
 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 14 * Lesser General Public License for more details.
 15 *
 16 * You should have received a copy of the GNU Lesser General Public
 17 * License along with FFmpeg; if not, write to the Free Software
 18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 19 */
 20
 21#include "avformat.h"
 22#include "internal.h"
 23
 24
 25static int probe(const AVProbeData *p)
 26{
 27    // the single file I have starts with that, I do not know if others do, too
 28    if(   p->buf[0] == 1
 29       && p->buf[1] == 1
 30       && p->buf[2] == 3
 31       && p->buf[3] == 0xB8
 32       && p->buf[4] == 0x80
 33       && p->buf[5] == 0x60
 34      )
 35        return AVPROBE_SCORE_MAX-2;
 36
 37    return 0;
 38}
 39
 40static int read_header(AVFormatContext *s)
 41{
 42    AVStream *st;
 43
 44    st = avformat_new_stream(s, NULL);
 45    if (!st)
 46        return AVERROR(ENOMEM);
 47
 48    st->codecpar->codec_type = AVMEDIA_TYPE_VIDEO;
 49    st->codecpar->codec_id = AV_CODEC_ID_MPEG4;
 50    st->need_parsing = AVSTREAM_PARSE_FULL;
 51    avpriv_set_pts_info(st, 64, 1, 90000);
 52
 53    return 0;
 54
 55}
 56
 57static int read_packet(AVFormatContext *s, AVPacket *pkt)
 58{
 59    int ret, size, pts, type, flags;
 60    int first_pkt      = 0;
 61    int frame_complete = 0;
 62
 63    while (!frame_complete) {
 64
 65        type  = avio_rb16(s->pb); // 257 or 258
 66        size  = avio_rb16(s->pb);
 67        flags = avio_rb16(s->pb); //some flags, 0x80 indicates end of frame
 68                avio_rb16(s->pb); //packet number
 69        pts   = avio_rb32(s->pb);
 70                avio_rb32(s->pb); //6A 13 E3 88
 71
 72        frame_complete = flags & 0x80;
 73
 74        size -= 12;
 75        if (size < 1)
 76            return -1;
 77
 78        if (type == 258) {
 79            avio_skip(s->pb, size);
 80            frame_complete = 0;
 81            continue;
 82        }
 83
 84        if (!first_pkt) {
 85            ret = av_get_packet(s->pb, pkt, size);
 86            if (ret < 0)
 87                return ret;
 88            first_pkt = 1;
 89            pkt->pts  = pts;
 90            pkt->pos -= 16;
 91        } else {
 92            ret = av_append_packet(s->pb, pkt, size);
 93            if (ret < 0) {
 94                av_log(s, AV_LOG_ERROR, "failed to grow packet\n");
 95                return ret;
 96            }
 97        }
 98        if (ret < size) {
 99            av_log(s, AV_LOG_ERROR, "Truncated packet! Read %d of %d bytes\n",
100                   ret, size);
101            pkt->flags |= AV_PKT_FLAG_CORRUPT;
102            break;
103        }
104    }
105    pkt->stream_index = 0;
106
107    return 0;
108}
109
110AVInputFormat ff_iv8_demuxer = {
111    .name           = "iv8",
112    .long_name      = NULL_IF_CONFIG_SMALL("IndigoVision 8000 video"),
113    .read_probe     = probe,
114    .read_header    = read_header,
115    .read_packet    = read_packet,
116    .flags          = AVFMT_GENERIC_INDEX,
117};