[FFmpeg-devel] [PATCH][RFC] QCP demuxer

Michael Niedermayer michaelni
Sun May 17 02:37:32 CEST 2009


On Sat, May 16, 2009 at 05:04:36PM -0700, Kenan Gillet wrote:
> On Sat, May 16, 2009 at 3:05 PM, Michael Niedermayer <michaelni at gmx.at> wrote:
> > On Sat, May 16, 2009 at 12:01:09PM -0700, Kenan Gillet wrote:
> [...]
> >> +static int qcp_read_header(AVFormatContext *s, AVFormatParameters *ap)
> >> +{
> >> + ? ?ByteIOContext *pb = s->pb;
> >> + ? ?QCPContext ? ?*c ?= s->priv_data;
> >> + ? ?AVStream ? ? ?*st = av_new_stream(s, 0);
> >> + ? ?uint8_t ? ? ? buf[16];
> >> + ? ?int ? ? ? ? ? i, nb_rates;
> >> +
> >> + ? ?if (!st)
> >> + ? ? ? ?return AVERROR(ENOMEM);
> >> +
> >> + ? ?get_be32(pb); ? ? ? ? ? ? ? ? ? ?// "RIFF"
> >> + ? ?s->file_size = get_le32(pb) + 8;
> >> + ? ?url_fskip(pb, 8 + 4 + 1 + 1); ? ?// "QLCMfmt " + chunk-size + major-version + minor-version
> >> +
> >> + ? ?st->codec->codec_type = CODEC_TYPE_AUDIO;
> >> + ? ?st->codec->channels ? = 1;
> >> + ? ?get_buffer(pb, buf, 16);
> >> + ? ?if (is_qcelp_13k_guid(buf)) {
> >> + ? ? ? ?st->codec->codec_id = CODEC_ID_QCELP;
> >> + ? ?} else if (!memcmp(buf, guid_evrc, 16)) {
> >> + ? ? ? ?av_log(s, AV_LOG_ERROR, "EVRC codec is not supported.\n");
> >> + ? ? ? ?return AVERROR_PATCHWELCOME;
> >> + ? ?} else if (!memcmp(buf, guid_smv, 16)) {
> >> + ? ? ? ?av_log(s, AV_LOG_ERROR, "SMV codec is not supported.\n");
> >> + ? ? ? ?return AVERROR_PATCHWELCOME;
> >> + ? ?} else {
> >> + ? ? ? ?av_log(s, AV_LOG_ERROR, "Unknown codec GUID.\n");
> >> + ? ? ? ?return AVERROR_INVALIDDATA;
> >> + ? ?}
> >> + ? ?url_fskip(pb, 2 + 80); // codec-version + codec-name
> >> + ? ?st->codec->bit_rate = get_le16(pb);
> >> +
> >
> >> + ? ?c->fixed_packet_size =
> >> + ? ?s->packet_size ? ? ? = get_le16(pb);
> >
> > redundant?
> 
> yes, fixed
> 
> 
> >
> > [...]
> >> +static int qcp_read_packet(AVFormatContext *s, AVPacket *pkt)
> >> +{
> >> + ? ?ByteIOContext *pb = s->pb;
> >> + ? ?QCPContext ? ?*c ?= s->priv_data;
> >> + ? ?unsigned int ?chunk_size, tag;
> >> +
> >> + ? ?while(!url_feof(pb)) {
> >> + ? ? ? ?if (c->data_size) {
> >> + ? ? ? ? ? ?int pkt_size, ret, mode = get_byte(pb);
> >> +
> >> + ? ? ? ? ? ?if (c->fixed_packet_size) {
> >> + ? ? ? ? ? ? ? ?pkt_size = c->fixed_packet_size - 1;
> >> + ? ? ? ? ? ?} else {
> >> + ? ? ? ? ? ? ? ?int retry;
> >> +
> >
> >> + ? ? ? ? ? ? ? ?for (retry = 256; retry > 0 && !url_feof(pb) && mode > QCP_MAX_MODE; retry--) {
> >> + ? ? ? ? ? ? ? ? ? ?av_log(s, AV_LOG_WARNING, "wrong byte mode=%d@%llx\n", mode, url_ftell(pb) - 1);
> >> + ? ? ? ? ? ? ? ? ? ?c->data_size--;
> >> + ? ? ? ? ? ? ? ? ? ?mode = get_byte(pb);
> >> + ? ? ? ? ? ? ? ?}
> >
> > this doesnt even cover a single damaged sector of a disk
> > besides it spams the user to death
> >
> > the normal way to do this is a
> > if(mode > QCP_MAX_MODE)
> > ? ?continue;
> 
> much simpler indeed :)
> fixed
> 
> 
> >
> >> + ? ? ? ? ? ? ? ?if (!retry || url_feof(pb))
> >> + ? ? ? ? ? ? ? ? ? ?return AVERROR_INVALIDDATA;
> >> + ? ? ? ? ? ? ? ?pkt_size = c->rates_per_mode[mode];
> >> + ? ? ? ? ? ?}
> >> +
> >> + ? ? ? ? ? ?if (c->data_size <= pkt_size) {
> >> + ? ? ? ? ? ? ? ?av_log(s, AV_LOG_WARNING, "Data chunk is too small.\n");
> >> + ? ? ? ? ? ? ? ?pkt_size = c->data_size - 1;
> >> + ? ? ? ? ? ?}
> >> +
> >> + ? ? ? ? ? ?if ((ret = av_get_packet(pb, pkt, pkt_size)) >= 0) {
> >
> > pkt_size can be -1 this is ignored
> >
> 
> fixed
> 
> thanks for the review,

patch probably ok assuming its tested

[...]
-- 
Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB

It is not what we do, but why we do it that matters.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: Digital signature
URL: <http://lists.mplayerhq.hu/pipermail/ffmpeg-devel/attachments/20090517/b210eaa2/attachment.pgp>



More information about the ffmpeg-devel mailing list