[FFmpeg-devel] [PATCH 13/13] fftools/ffmpeg_demux: merge streams in a LCEVC stream group

Anton Khirnov anton at khirnov.net
Fri Sep 6 14:56:14 EEST 2024


Quoting James Almer (2024-08-31 18:31:14)
>  static int demux_send(Demuxer *d, DemuxThreadContext *dt, DemuxStream *ds,
>                        AVPacket *pkt, unsigned flags)
>  {
>      InputFile  *f = &d->f;
> -    int ret;
> +    int ret = 0;
>  
>      // pkt can be NULL only when flushing BSFs
>      av_assert0(ds->bsf || pkt);
>  
> +    // a stream can only be disabled if it's needed by a group

This makes no sense to me.

> +    av_assert0(ds->nb_stream_groups || !ds->discard);
> +
> +    // create a reference for the packet to be filtered by group bsfs

What are "group bsfs"?

> +    if (pkt && ds->nb_stream_groups) {
> +        av_packet_unref(dt->pkt_group_bsf);
> +        ret = av_packet_ref(dt->pkt_group_bsf, pkt);
> +        if (ret < 0)
> +            return ret;
> +    }
> +
>      // send heartbeat for sub2video streams
> -    if (d->pkt_heartbeat && pkt && pkt->pts != AV_NOPTS_VALUE) {
> +    if (d->pkt_heartbeat && pkt && !ds->discard && pkt->pts != AV_NOPTS_VALUE) {

Random added checks for ds->discard are extremely confusing and tell me
you're overloading that poor field to mean something extremely
non-obvious.

> +static int istg_add(Demuxer *d, AVStreamGroup *stg)
> +{
> +    InputFile    *f = &d->f;
> +    DemuxStreamGroup *dsg;
> +    const AVBitStreamFilter *filter;
> +    int base_idx = -1, enhancement_idx = -1;
> +    int ret;
> +
> +    // TODO: generic handling of groups, once support for more is added
> +    if (stg->type != AV_STREAM_GROUP_PARAMS_LCEVC)
> +        return 0;

I'd prefer this function to be essentially a switch that dispatches to
per-type handlers.

> +
> +    if (stg->nb_streams != 2)
> +        return AVERROR_BUG;
> +
> +    filter = av_bsf_get_by_name("lcevc_merge");
> +    if (!filter)
> +        return 0;
> +
> +    dsg = demux_stream_group_alloc(d, stg);
> +    if (!dsg)
> +        return AVERROR(ENOMEM);
> +
> +    dsg->discard = 1;
> +
> +    // set the main stream for the group
> +    for (int i = 0; i < stg->nb_streams; i++) {
> +        int j;
> +
> +        for (j = 0; j < f->nb_streams; j++)
> +            if (stg->streams[i] == f->streams[j]->st)
> +                break;
> +
> +        if (j == f->nb_streams)
> +            return AVERROR_BUG;

Isn't all this just "j = stg->streams[i]->index"?

-- 
Anton Khirnov


More information about the ffmpeg-devel mailing list