[mythtv] HVEC frame counting broken

Scott Theisen scott.the.elm at gmail.com
Mon Sep 26 14:36:16 UTC 2022


On 9/26/22 08:41, Scott Theisen wrote:
> On 9/25/22 21:38, John P Poet wrote:
>> On Sun, Sep 25, 2022 at 8:17 PM Scott Theisen 
>> <scott.the.elm at gmail.com> wrote:
>>
>>     On 9/25/22 18:48, John P Poet wrote:
>>>     On Sun, Sep 25, 2022 at 3:16 PM Scott Theisen
>>>     <scott.the.elm at gmail.com> wrote:
>>>
>>>
>>>
>>>         On 9/25/22 12:42, John P Poet wrote:
>>>>         On Sun, Sep 25, 2022 at 10:40 AM John P Poet
>>>>         <jppoet at gmail.com> wrote:
>>>>
>>>>             On Sun, Sep 25, 2022 at 10:33 AM Scott Theisen
>>>>             <scott.the.elm at gmail.com> wrote:
>>>>
>>>>                 On 9/25/22 11:43, John P Poet wrote:
>>>>>
>>>>>
>>>>>                 Thank you Scott. I just uploaded a HEVC sample to
>>>>>                 dropbox. It should be shared with you.
>>>>
>>>>                 I have the sample.
>>>>
>>>>>
>>>>>                 Without 7b2ac1eeb5, HEVCParser::parseSPS detects the
>>>>>                 sps_id: 0
>>>>>                 width, height: 1920x1088
>>>>>                 unitsInTick / timeScale: 166817 / 10000000
>>>>>
>>>>>                 With 7b2ac1eeb5, HEVCParser::parseSPS the spd_id,
>>>>>                 width and height are garbage and the unitsinTick /
>>>>>                 timeScale are never decoded -- vps_extension_flag
>>>>>                 is zero.
>>>>>
>>>>>                 My best guess is that there is an alignment issue
>>>>>                 and the BitReader that is being passed into
>>>>>                 HEVCParser::parseSPS is not pointing at the
>>>>>                 correct position.
>>>>>
>>>>
>>>>                 OK, but how are you getting the code to execute on
>>>>                 the sample?  mythcommflag --rebuild something? 
>>>>                 Adding to Videos and scanning for changes?
>>>>
>>>>                 Thanks,
>>>>
>>>>                 Scott
>>>>
>>>>
>>>>             I am using an ExternalRecorder
>>>>             (https://github.com/jpoet/Magewell2TS). Using the
>>>>             mythfilerecorder ExternalRecorder that is packaged with
>>>>             Myth should provide the same result. I am pretty sure
>>>>             that `mythcommflag --rebuild` results in a different
>>>>             code path and I have not tried it.
>>>>
>>>>             If you have trouble setting up mythfilerecorder I will
>>>>             do that this afternoon and then send you instructions.
>>>>
>>>>
>>>>         Actually, I won't. I keep forgetting that I don't currently
>>>>         have access to my development machine and my production
>>>>         machine will be recording football today. So, that would
>>>>         have to wait until tomorrow sometime.
>>>>
>>>>         John
>>>
>>>         I couldn't figure out how to get mythfilerecorder to work,
>>>         so instructions from you, or anyone, would be appreciated.
>>>
>>>         Scott
>>>
>>>
>>>     I cannot test this until tomorrow, but this should work...
>>>
>>>     Put the attached config files in /home/mythtv/etc/ . Modify
>>>     externfile.conf so it can find the sample hevc file.
>>>
>>>     Create a new "capture card" of type "External (blackbox)
>>>     Recorder". For the command path use
>>>     "/usr/local/bin/mythexternrecorder --conf
>>>     /home/mythtv/etc/externfile.conf". Modify that if your
>>>     mythexternrecorder is not in /usr/local/bin.
>>>
>>>     You may want/need to create a new source for this capture card.
>>>
>>>     You can do a "channel scan" for the new input and it will pick
>>>     up the test channel defined in channels.conf. You can then
>>>     create a manual record for that channel and it will effectively
>>>     "record" the hevc sample file.
>>>
>>>
>>
>>     Thanks, that worked, adjusting the paths to the real values. 
>>     However, it loops the input file and creates recordings far
>>     longer than the specified manual recording duration.
>>
>>     I can confirm that parsing is broken. :(
>>
>>     Let me know if you want me to open a pull request reverting the
>>     change to BitReader, while I investigate.
>>
>>     Thanks,
>>
>>     Scott
>>
>>     PS--Unrelated, but apparently "HEVC" is not a valid registration
>>     descriptor according to MythTV:
>>     ```
>>     2022-09-25 20:57:29.612931 D [17701/17792] ExternSH
>>     mpegstreamdata.cpp:463 (CreatePMTSingleProgram) -
>>     MPEGStream[8](0x7f2f840261b0): Program Map Section
>>       PSIP tableID(0x2) length(35) extension(0x1)
>>            version(0) current(1) section(0) last_section(0)
>>            pnum(1) pid(0x1000) pcrpid(0x100)
>>       Stream #0 pid(0x100) type(0x24 video-h265)
>>         Registration Descriptor: 'HEVC' Unknown, see
>>     http://www.smpte-ra.org/mpegreg/mpegreg.html
>>       Stream #1 pid(0x101) type(0x81 audio-ac3)
>>         Registration Descriptor: 'AC-3' ATSC audio stream A/52
>>     ```
>>
>>
>> Interesting about the HEVC descriptor. I will look into that. I will 
>> also look into the looping you mention. I will probably wait until I 
>> have direct access to my "dev" machine first, though, since doing 
>> that kind of debugging is inconvenient on a live system.
>>
>> If you can figure out the problem within the next few of days, then 
>> you can leave it. If you think it will take longer, then yes I would 
>> like that commit to be reversed.
>>
>> Thank you,
>>
>> John
>
> Non byte aligned skip_bits() is broken, try this:
> ```
> diff --git a/mythtv/libs/libmythtv/bitreader.h 
> b/mythtv/libs/libmythtv/bitreader.h
> index a40707e08f..dd31b4efdd 100644
> --- a/mythtv/libs/libmythtv/bitreader.h
> +++ b/mythtv/libs/libmythtv/bitreader.h
> @@ -47,14 +47,16 @@ class BitReader
>
>      void skip_bits(unsigned n = 1)
>      {
> -        if (m_cacheSize >= n)
> +        if (m_cacheSize > n)
>          {
>              m_cache <<= n;
>              m_cacheSize -= n;
>          }
>          else
>          {
> +            n -= m_cacheSize;
>              m_cacheSize = 0;
> +            m_cache      = 0;
>              m_bitIndex += n;
>              int quotient = m_bitIndex / CHAR_BIT;
>              m_bitIndex %= CHAR_BIT;
> ```
>
> It seemed to work for me, but I get `HEVCParser PPS Id 0 not valid 
> yet. Skipping parsing of slice.` in the log even with the switch to 
> BitReader reverted with your sample.
>
> I thought maybe FFmpeg was doing something to the file, so I switched 
> the external recorder command to `command="cat 
> /media/data/htpc/hevc-sample.ts"`, but that had no effect.
>
> Regarding looping, 
> https://www.mythtv.org/wiki/ExternalRecorder#mythfilerecorder mentions 
> a --noloop option for mythfilerecorder, but we aren't using that directly.
>
> I will also make the BitReader unit test more comprehensive before 
> creating a pull request with the above fix.
>
> Regards,
>
> Scott

See Fix BitReader by ulmus-scott · Pull Request #642 · MythTV/mythtv 
https://github.com/MythTV/mythtv/pull/642 for my fixes and new unit 
tests.  Testing would be appreciated.

Scott
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mythtv.org/pipermail/mythtv-dev/attachments/20220926/e1b7e268/attachment.htm>


More information about the mythtv-dev mailing list