a3d995c1 |
/*
* CD Graphics Demuxer
* Copyright (c) 2009 Michael Tison
*
* 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" |
c3f9ebf7 |
#include "internal.h" |
a3d995c1 |
#define CDG_PACKET_SIZE 24 |
5872c781 |
#define CDG_COMMAND 0x09
#define CDG_MASK 0x3F |
a3d995c1 |
|
abda15a9 |
typedef struct CDGContext {
int got_first_packet;
} CDGContext;
|
6e9651d1 |
static int read_header(AVFormatContext *s) |
a3d995c1 |
{
AVStream *vst;
int ret;
|
3b3bbdd3 |
vst = avformat_new_stream(s, NULL); |
a3d995c1 |
if (!vst)
return AVERROR(ENOMEM);
|
9200514a |
vst->codecpar->codec_type = AVMEDIA_TYPE_VIDEO;
vst->codecpar->codec_id = AV_CODEC_ID_CDGRAPHICS; |
a3d995c1 |
/// 75 sectors/sec * 4 packets/sector = 300 packets/sec |
c3f9ebf7 |
avpriv_set_pts_info(vst, 32, 1, 300); |
a3d995c1 |
|
db44ea96 |
ret = avio_size(s->pb); |
0089fb79 |
if (ret < 0) {
av_log(s, AV_LOG_WARNING, "Cannot calculate duration as file size cannot be determined\n");
} else
vst->duration = (ret * vst->time_base.den) / (CDG_PACKET_SIZE * 300); |
a3d995c1 |
return 0;
}
static int read_packet(AVFormatContext *s, AVPacket *pkt)
{ |
abda15a9 |
CDGContext *priv = s->priv_data; |
a3d995c1 |
int ret;
|
5872c781 |
while (1) {
ret = av_get_packet(s->pb, pkt, CDG_PACKET_SIZE);
if (ret < 1 || (pkt->data[0] & CDG_MASK) == CDG_COMMAND)
break; |
ce70f28a |
av_packet_unref(pkt); |
5872c781 |
} |
a3d995c1 |
|
abda15a9 |
if (!priv->got_first_packet) {
pkt->flags |= AV_PKT_FLAG_KEY;
priv->got_first_packet = 1;
}
|
a3d995c1 |
pkt->stream_index = 0; |
eee89f69 |
pkt->dts=
pkt->pts= pkt->pos / CDG_PACKET_SIZE; |
fe19e138 |
if(ret>5 && (pkt->data[0]&0x3F) == 9 && (pkt->data[1]&0x3F)==1 && !(pkt->data[2+2+1] & 0x0F)){
pkt->flags = AV_PKT_FLAG_KEY;
} |
a3d995c1 |
return ret;
}
|
66355be3 |
AVInputFormat ff_cdg_demuxer = { |
dfc2c4d9 |
.name = "cdg", |
6774247a |
.long_name = NULL_IF_CONFIG_SMALL("CD Graphics"), |
abda15a9 |
.priv_data_size = sizeof(CDGContext), |
dfc2c4d9 |
.read_header = read_header,
.read_packet = read_packet, |
2e0c360a |
.flags = AVFMT_GENERIC_INDEX, |
20234a4b |
.extensions = "cdg", |
a3d995c1 |
}; |