[Cin] FFmpeg 4.3 mpegts patch - questions ....

Andrew Randrianasulu randrianasulu at gmail.com
Mon Jul 13 19:15:30 CEST 2020


В сообщении от Monday 13 July 2020 20:07:48 Phyllis Smith via Cin написал(а):
> Andrew, gg has yet to look at this BUT I can tell you for a fact that he
> had to revert to his original BluRay media mods because "yes" the ffmpeg
> ones did not work with our bluray player.  And we use this quite
> frequently.  First it cut off the audio at the beginning on a 1 1/2 minute
> video and then it would not replay until powered off/on the device.  The
> particular bluray player we use matches the one that Terje originally had.
> GG's mods were based on "Sintel" (available via download).  It would take a
> lot more debugging to get the ffmpeg mods working and we thought there were
> a lot more useful things to do. 

Yeah , media (in this sense) tend to be a hard-to-get-right area ....

I wonder if your player  accept streams re-muxed by

https://github.com/justdan96/tsMuxer ?

On the webpage it says:
Some of the major features include:

    Ability to set muxing fps manually and automatically
    Ability to change level for H.264 streams
    Ability to shift a sound tracks
    Ability to extract DTS core from DTS-HD
    Ability to join files
    Output/Author to compliant Blu-ray Disc or AVCHD
    Blu-ray 3D support

but of course bugs exist ....


> I suspect the number of people making this 
> kind of media today is very low but we need it to work for us.  I will
> provide his feedback later after he has time to read this all.
> Thanks, Phyllis

Well, it was not my best review, but I was just curious ....
Take your time, and thanks again... it seems bug stream will never end!

> 
> On Sun, Jul 12, 2020 at 11:41 PM Andrew Randrianasulu via Cin <
> cin at lists.cinelerra-gg.org> wrote:
> 
> >
> > src on cgit:
> >
> >
> > https://git.cinelerra-gg.org/git/?p=goodguy/cinelerra.git;a=blob;f=cinelerra-5.1/thirdparty/src/ffmpeg-4.3.patch2;h=81cae5e66d85d3c089603a5a6425cd165aa9f16e;hb=HEAD
> >
> > Well, I don't understand it, just worried about GROWING diff between
> > original ffmpeg and Cin's version of it in this area.
> >
> > (added Marton as CC, as current maintainer of this area of code - sorry
> > for my cont. ignorance, Marton!)
> >
> > @@ -76,11 +77,12 @@
> >      MpegTSSection pat; /* MPEG-2 PAT table */
> >      MpegTSSection sdt; /* MPEG-2 SDT table context */
> >      MpegTSService **services;
> > -    int64_t sdt_period; /* SDT period in PCR time base */
> > -    int64_t pat_period; /* PAT/PMT period in PCR time base */
> > +    int64_t sdt_packet_timer, sdt_packet_period;
> > +    int64_t pat_packet_timer, pat_packet_period;
> >      int nb_services;
> > -    int64_t first_pcr;
> > -    int64_t next_pcr;
> > +    int onid;
> > +    int tsid;
> >
> > as far as I understand those  (onid, tsid) used donwstream:
> >
> > @@ -259,7 +257,7 @@
> >          put16(&q, service->sid);
> >          put16(&q, 0xe000 | service->pmt.pid);
> >      }
> > -    mpegts_write_section1(&ts->pat, PAT_TID, ts->transport_stream_id,
> > ts->tables_version, 0, 0,
> > +    mpegts_write_section1(&ts->pat, PAT_TID, ts->tsid,
> > ts->tables_version, 0, 0,
> >
> >
> > was it just for shortening typing time?
> >
> > @@ -90,14 +92,14 @@
> >      int service_type;
> >
> >      int pmt_start_pid;
> > +    int pcr_start_pid;
> >      int start_pid;
> >      int m2ts_mode;
> > -    int m2ts_video_pid;
> > -    int m2ts_audio_pid;
> > -    int m2ts_pgssub_pid;
> > -    int m2ts_textsub_pid;
> > +    int64_t ts_offset;
> >
> >
> > Hm, it think major point in 4.3 was exactly
> >
> > - Support for muxing pcm and pgs in m2ts
> >
> > ? (PGS are Blu-Ray subtitle graphics - no encoder in ffmpeg yet. But
> > probably you can remux the from existing track?)
> >
> >
> > @@ -217,14 +217,15 @@
> >  /* mpegts writer */
> >
> >  #define DEFAULT_PROVIDER_NAME   "FFmpeg"
> > -#define DEFAULT_SERVICE_NAME    "Service"
> > +#define DEFAULT_SERVICE_NAME    "Service01"
> >
> >
> > Was it required from your Blu-Ray Disk player? May be it can be made
> > conditional on new m2ts_b  (say) mode?
> >
> >
> > -/* we retransmit the SI info at this rate */
> > +/* we retransmit the SI info at this rate (ms) */
> >  #define SDT_RETRANS_TIME 500
> >  #define PAT_RETRANS_TIME 100
> > -#define PCR_RETRANS_TIME 20
> > +#define PCR_RETRANS_TIME 50
> >
> > may be comment improvement can be made into standalone patch?
> >
> > @@ -281,148 +279,6 @@
> >      *q_ptr = q;
> >  }
> >
> > -static int get_dvb_stream_type(AVFormatContext *s, AVStream *st)
> > [..]
> > -static int get_m2ts_stream_type(AVFormatContext *s, AVStream *st)
> >
> > here whole two functions are gone ..
> >
> > and probably replaced by homegrown one a bit downstream:
> >
> > @@ -472,8 +320,72 @@
> >              err = 1;
> >              break;
> >          }
> > -
> > -        stream_type = ts->m2ts_mode ? get_m2ts_stream_type(s, st) :
> > get_dvb_stream_type(s, st);
> > +        switch (st->codecpar->codec_id) {
> >
> >
> > any reason for this move?
> >
> > @@ -736,7 +648,7 @@
> >      int i, running_status, free_ca_mode, val;
> >
> >      q = data;
> > -    put16(&q, ts->original_network_id);
> > +    put16(&q, ts->onid);
> >
> >
> > again, just shorter to type?
> >
> > @@ -802,49 +714,12 @@
> >      return 0;
> >  }
> >
> > -static int64_t get_pcr(const MpegTSWrite *ts, AVIOContext *pb)
> >
> > -static void write_packet(AVFormatContext *s, const uint8_t *packet)
> >
> > -static void section_write_packet(MpegTSSection *s, const uint8_t *packet)
> >
> > all three gone .... can they stay ? :}
> > (for reducing diff size)
> >
> >  static MpegTSService *mpegts_add_service(AVFormatContext *s, int sid,
> > -                                         const AVDictionary *metadata,
> > -                                         AVProgram *program)
> > +                                         const char *provider_name,
> > +                                         const char *name)
> >  {
> >      MpegTSWrite *ts = s->priv_data;
> >      MpegTSService *service;
> > -    AVDictionaryEntry *title, *provider;
> > -    char default_service_name[32];
> > -    const char *service_name;
> > -    const char *provider_name;
> > -
> > -    title = av_dict_get(metadata, "service_name", NULL, 0);
> > -    if (!title)
> > -        title = av_dict_get(metadata, "title", NULL, 0);
> > -    snprintf(default_service_name, sizeof(default_service_name),
> > "%s%02d", DEFAULT_SERVICE_NAME, ts->nb_services + 1);
> > -    service_name  = title ? title->value : default_service_name;
> > -    provider      = av_dict_get(metadata, "service_provider", NULL, 0);
> > -    provider_name = provider ? provider->value : DEFAULT_PROVIDER_NAME;
> >
> >
> > I think this one allowed more data passing from ...upper libavcodec layer?
> >
> > -static void enable_pcr_generation_for_stream(AVFormatContext *s, AVStream
> > *pcr_st)
> > +static void mpegts_prefix_m2ts_header(AVFormatContext *s)
> >  {
> >      MpegTSWrite *ts = s->priv_data;
> > -    MpegTSWriteStream *ts_st = pcr_st->priv_data;
> > -
> > -    if (ts->mux_rate > 1 || ts->pcr_period_ms >= 0) {
> > -        int pcr_period_ms = ts->pcr_period_ms == -1 ? PCR_RETRANS_TIME :
> > ts->pcr_period_ms;
> > -        ts_st->pcr_period = av_rescale(pcr_period_ms, PCR_TIME_BASE,
> > 1000);
> > -    } else {
> > -        /* By default, for VBR we select the highest multiple of frame
> > duration which is less than 100 ms. */
> > -        int64_t frame_period = 0;
> > -        if (pcr_st->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) {
> > -            int frame_size =
> > av_get_audio_frame_duration2(pcr_st->codecpar, 0);
> > -            if (!frame_size) {
> > -               av_log(s, AV_LOG_WARNING, "frame size not set\n");
> > -               frame_size = 512;
> > -            }
> > -            frame_period = av_rescale_rnd(frame_size, PCR_TIME_BASE,
> > pcr_st->codecpar->sample_rate, AV_ROUND_UP);
> > -        } else if (pcr_st->avg_frame_rate.num) {
> > -            frame_period = av_rescale_rnd(pcr_st->avg_frame_rate.den,
> > PCR_TIME_BASE, pcr_st->avg_frame_rate.num, AV_ROUND_UP);
> > -        }
> > -        if (frame_period > 0 && frame_period <= PCR_TIME_BASE / 10)
> > -            ts_st->pcr_period = frame_period * (PCR_TIME_BASE / 10 /
> > frame_period);
> > -        else
> > -            ts_st->pcr_period = 1;
> > +    if (ts->m2ts_mode) {
> > +        uint32_t tp_extra_header = ts->pcr % 0x3fffffff;
> > +        tp_extra_header = AV_RB32(&tp_extra_header);
> > +        avio_write(s->pb, (unsigned char *) &tp_extra_header,
> > +                   sizeof(tp_extra_header));
> >      }
> > -
> > -    // output a PCR as soon as possible
> > -    ts_st->last_pcr   = ts->first_pcr - ts_st->pcr_period;
> >  }
> >
> > May be just leave old function the same, just add short new one
> > (static void mpegts_prefix_m2ts_header(AVFormatContext *s)) ?
> >
> > same for
> >
> > -static void select_pcr_streams(AVFormatContext *s)
> > +static void section_write_packet(MpegTSSection *s, const uint8_t *packet)
> >
> >  static int mpegts_init(AVFormatContext *s)
> >
> > ah, so av_dict_get and co  moved here ....
> >
> > -        /* MPEG pid values < 16 are reserved. Applications which set
> > st->id in
> > -         * this range are assigned a calculated pid. */
> > -        if (st->id < 16) {
> > -            if (ts->m2ts_mode) {
> > -                switch (st->codecpar->codec_type) {
> > -                case AVMEDIA_TYPE_VIDEO:
> > -                    ts_st->pid = ts->m2ts_video_pid++;
> > +        program = av_find_program_from_stream(s, NULL, i);
> > +        if (program) {
> > +            for (j = 0; j < ts->nb_services; j++) {
> > +                if (ts->services[j]->program == program) {
> > +                    service = ts->services[j];
> >                      break;
> > -                case AVMEDIA_TYPE_AUDIO:
> > -                    ts_st->pid = ts->m2ts_audio_pid++;
> > -                    break;
> > -                case AVMEDIA_TYPE_SUBTITLE:
> > -                    switch (st->codecpar->codec_id) {
> > -                    case AV_CODEC_ID_HDMV_PGS_SUBTITLE:
> > -                        ts_st->pid = ts->m2ts_pgssub_pid++;
> > -                        break;
> > -                    case AV_CODEC_ID_HDMV_TEXT_SUBTITLE:
> > -                        ts_st->pid = ts->m2ts_textsub_pid++;
> > -                        break;
> > -                    }
> > -                    break;
> > -                }
> > -                if (ts->m2ts_video_pid   > M2TS_VIDEO_PID + 1          ||
> > -                    ts->m2ts_audio_pid   > M2TS_AUDIO_START_PID + 32   ||
> > -                    ts->m2ts_pgssub_pid  > M2TS_PGSSUB_START_PID + 32  ||
> > -                    ts->m2ts_textsub_pid > M2TS_TEXTSUB_PID + 1        ||
> > -                    ts_st->pid < 16) {
> > -                    av_log(s, AV_LOG_ERROR, "Cannot automatically assign
> > PID for stream %d\n", st->index);
> > -                    return AVERROR(EINVAL);
> >                  }
> > -            } else {
> > -                ts_st->pid = ts->start_pid + i;
> >              }
> > -        } else {
> > -            ts_st->pid = st->id;
> >          }
> >
> > Oh, here our subtitle support go .......
> >
> > a lot of skipped, I'm very unsure about all those changes ...
> >
> >
> > @@ -1724,7 +1585,7 @@
> >
> >              ret = avio_open_dyn_buf(&ts_st->amux->pb);
> >              if (ret < 0)
> > -                return ret;
> > +                return AVERROR(ENOMEM);
> >
> > seems like  possible standalone patch for ffmpeg upstream inclusion?
> >
> > @@ -1755,7 +1616,7 @@
> >          } while (p < buf_end && (state & 0x7e) != 2*35 &&
> >                   (state & 0x7e) >= 2*32);
> >
> > -        if ((state & 0x7e) < 2*16 || (state & 0x7e) >= 2*24)
> > +        if ((state & 0x7e) < 2*16 && (state & 0x7e) >= 2*24)
> >
> > ???? why it was changed?
> >
> >
> >
> > IIRC those changes come from fact ffmpeg's
> > mpegts muxer mostly geared towards transmission vs standalone BD creation
> > ....
> >
> > But at least potential for BD text subtitles look interestinge nough
> > for keeping looking into this area ...I think.
> >
> > Also, ffmpeg 4.3.1 was already released, with small fixes:
> >
> > https://ffmpeg.org/download.html
> >
> > FFmpeg 4.3.1 "4:3"
> >  4.3.1 was released on 2020-07-11. It is the latest stable FFmpeg release
> > from the 4.3 release branch,
> > which was cut from master on 2020-06-08.
> >
> >
> > It was FAST ......
> >
> > Also, there is one more patch on ML:
> > http://ffmpeg.org/pipermail/ffmpeg-devel/2020-July/266181.html
> >
> > [FFmpeg-devel] [PATCH] x86/yuv2rgb: fix crashes when storing data on
> > unaligned buffers
> >
> > Regression since fc6a5883d6af8cae0e96af84dda0ad74b360a084 on SSSE3 enabled
> > CPUs.
> >
> > Fixes ticket #8747
> >
> > -----
> >
> > END!
> > --
> > Cin mailing list
> > Cin at lists.cinelerra-gg.org
> > https://lists.cinelerra-gg.org/mailman/listinfo/cin
> >
> 




More information about the Cin mailing list