Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
 help / color / mirror / Atom feed
From: Paul B Mahol <onemda@gmail.com>
To: FFmpeg development discussions and patches <ffmpeg-devel@ffmpeg.org>
Subject: Re: [FFmpeg-devel] [PATCH] OSQ lossless audio format support
Date: Fri, 25 Aug 2023 00:06:05 +0200
Message-ID: <CAPYw7P6Fuj7MyCraLnrvMVAtdCB=5gss+q3V5cTD-TCXZqXURQ@mail.gmail.com> (raw)
In-Reply-To: <7ed904fe-6a1f-ab5e-d5c0-a75ab6238899@gmail.com>

On Thu, Aug 24, 2023 at 11:51 PM James Almer <jamrial@gmail.com> wrote:

> On 8/24/2023 6:11 PM, Paul B Mahol wrote:
> > On Thu, Aug 24, 2023 at 11:00 PM James Almer <jamrial@gmail.com> wrote:
> >
> >> On 8/24/2023 6:52 AM, Paul B Mahol wrote:
> >>> +static int osq_receive_frame(AVCodecContext *avctx, AVFrame *frame)
> >>> +{
> >>> +    OSQContext *s = avctx->priv_data;
> >>> +    GetBitContext *gb = &s->gb;
> >>> +    int ret, n;
> >>> +
> >>> +    while (s->bitstream_size < s->max_framesize) {
> >>> +        int size;
> >>> +
> >>> +        if (!s->pkt->data) {
> >>> +            ret = ff_decode_get_packet(avctx, s->pkt);
> >>> +            if (ret == AVERROR_EOF && s->bitstream_size > 0)
> >>> +                break;
> >>> +            if (ret < 0)
> >>> +                return ret;
> >>> +        }
> >>> +
> >>> +        size = FFMIN(s->pkt->size - s->pkt_offset, s->max_framesize -
> >> s->bitstream_size);
> >>> +        memcpy(s->bitstream + s->bitstream_size, s->pkt->data +
> >> s->pkt_offset, size);
> >>> +        s->bitstream_size += size;
> >>> +        s->pkt_offset += size;
> >>> +
> >>> +        if (s->pkt_offset == s->pkt->size) {
> >>> +            av_packet_unref(s->pkt);
> >>> +            s->pkt_offset = 0;
> >>> +        }
> >>
> >> This looks like you're assembling a packet of max_framesize bytes. You
> >> should instead do that in a parser, and ensure here that the packets fed
> >> to this decoder are <= max_framesize.
> >>
> >>> +    }
> >>> +
> >>> +    frame->nb_samples = FFMIN(s->frame_samples, s->nb_samples);
> >>> +    if (frame->nb_samples <= 0)
> >>> +        return AVERROR_EOF;
> >>> +
> >>> +    if ((ret = ff_get_buffer(avctx, frame, 0)) < 0)
> >>> +        goto fail;
> >>> +
> >>> +    if ((ret = init_get_bits8(gb, s->bitstream, s->bitstream_size)) <
> 0)
> >>> +        goto fail;
> >>> +
> >>> +    if ((ret = osq_decode_block(avctx, frame)) < 0)
> >>> +        goto fail;
> >>> +
> >>> +    s->nb_samples -= frame->nb_samples;
> >>> +
> >>> +    n = get_bits_count(gb) / 8;
> >>> +    if (n > s->bitstream_size) {
> >>> +        ret = AVERROR_INVALIDDATA;
> >>> +        goto fail;
> >>> +    }
> >>> +
> >>> +    memmove(s->bitstream, &s->bitstream[n], s->bitstream_size - n);
> >>> +    s->bitstream_size -= n;
> >>> +
> >>> +    return 0;
> >>> +
> >>> +fail:
> >>> +    s->bitstream_size = 0;
> >>> +    s->pkt_offset = 0;
> >>> +    av_packet_unref(s->pkt);
> >>> +
> >>> +    return ret;
> >>> +}
> >>> +
> >>> +const AVInputFormat ff_osq_demuxer = {
> >>> +    .name           = "osq",
> >>> +    .long_name      = NULL_IF_CONFIG_SMALL("raw OSQ"),
> >>> +    .read_probe     = osq_probe,
> >>> +    .read_header    = osq_read_header,
> >>> +    .read_packet    = ff_raw_read_partial_packet,
> >>
> >> Instead of sending an arbitrarily sized packet (1024 bytes as of now),
> >> you should set codecpar->frame_size and propagate packets with that
> >> amount of bytes instead.
> >> A parser is still needed, though, for non seekable input (a pipe). And
> >> in case the decoder is fed with non lavf input.
> >>
> >
> > Format is not seekable, packet sizes are nowhere stored in .osq files.
>
> Same case as raw formats like H.264. No packet sizes, no seekability
> without having parsed the entire sequence to build a list of seek
> points, etc. A parser has to assemble access units.
>

But there is no any info how to assemble anything here, unless
you propose decoding inside parser?



>
> >
> > Think of this format like APAC/BONK/WAVARC but just no need to keep
> unused
> > bits from previous decoded data/packet.
> > With this fact, parser makes no sense to do.
>
> You know that frame_size is (frame_samples_per_channel * 16 + 1024) *
> channels. A parser can work with that (Look at gsm parser for example.
> There may be others too).
>

There is reason why variable is called max_framesize.

You should not propagate truncated data in 1024 byte chunks, and the
> decoder should not expect that either.
>

Nothing gets truncated. That is just worst case scenario size for packet.
In another words, size of packet can be anything between 33 and
max_framesize.


>
> >
> >
> >>> +    .extensions     = "osq",
> >>> +    .flags          = AVFMT_NOBINSEARCH | AVFMT_NOGENSEARCH |
> >> AVFMT_NO_BYTE_SEEK | AVFMT_NOTIMESTAMPS,
> >>> +    .raw_codec_id   = AV_CODEC_ID_OSQ,
> >>> +    .priv_data_size = sizeof(FFRawDemuxerContext),
> >>> +    .priv_class     = &ff_raw_demuxer_class,
> >>> +};
> >>
> >> _______________________________________________
> >> ffmpeg-devel mailing list
> >> ffmpeg-devel@ffmpeg.org
> >> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
> >>
> >> To unsubscribe, visit link above, or email
> >> ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
> >>
> > _______________________________________________
> > ffmpeg-devel mailing list
> > ffmpeg-devel@ffmpeg.org
> > https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
> >
> > To unsubscribe, visit link above, or email
> > ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel@ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
>
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

  reply	other threads:[~2023-08-24 21:58 UTC|newest]

Thread overview: 17+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-08-24  9:52 Paul B Mahol
2023-08-24 18:06 ` Michael Niedermayer
2023-08-24 19:04   ` Paul B Mahol
2023-08-24 19:54 ` James Almer
2023-08-24 20:09   ` Andreas Rheinhardt
2023-08-24 20:33   ` Paul B Mahol
2023-08-24 21:00 ` James Almer
2023-08-24 21:11   ` Paul B Mahol
2023-08-24 21:51     ` James Almer
2023-08-24 22:06       ` Paul B Mahol [this message]
2023-08-25 15:57         ` James Almer
2023-08-25 16:28           ` Paul B Mahol
2023-08-25 16:42             ` James Almer
2023-08-25 17:13               ` Paul B Mahol
2023-08-29 21:25 ` Paul B Mahol
2023-08-29 22:20   ` Andreas Rheinhardt
2023-08-31 17:51     ` Paul B Mahol

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to='CAPYw7P6Fuj7MyCraLnrvMVAtdCB=5gss+q3V5cTD-TCXZqXURQ@mail.gmail.com' \
    --to=onemda@gmail.com \
    --cc=ffmpeg-devel@ffmpeg.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link

Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

This inbox may be cloned and mirrored by anyone:

	git clone --mirror https://master.gitmailbox.com/ffmpegdev/0 ffmpegdev/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 ffmpegdev ffmpegdev/ https://master.gitmailbox.com/ffmpegdev \
		ffmpegdev@gitmailbox.com
	public-inbox-index ffmpegdev

Example config snippet for mirrors.


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git