[FFmpeg-user] Filter documentation -- PTSs
Mark Filipak (ffmpeg)
markfilipak at bog.us
Mon Feb 15 23:26:44 EET 2021
On 02/15/2021 06:38 AM, Chris Angelico wrote:
> On Mon, Feb 15, 2021 at 9:21 PM Mark Filipak (ffmpeg)
> <markfilipak at bog.us> wrote:
>> On 02/15/2021 01:56 AM, Chris Angelico wrote:
>>> On Mon, Feb 15, 2021 at 5:32 PM Mark Filipak (ffmpeg)
>>> <markfilipak at bog.us> wrote:
>>>>> frame->pts = (
>>>>> (s->start_time == AV_NOPTS_VALUE) ? 0 : s->start_time) +
>>>>> av_rescale(outlink->frame_count_in, s->ts_unit.num, s->ts_unit.den);
>>>>
>>>> I don't know what this: 'frame->pts', means. ...
>>>
>>> struct FrameyThingyWhatsit {
>>> int foo;
>>> int bar;
>>> void *quux;
>>> int pts;
>>> const char *flurble;
>>> };
>
> "frame" is a variable, declared to be a pointer to a
> FrameyThingyWhatsit, and assigned to something. It might be something
> like this:
>
> struct FrameyThingyWhatsit *frame;
>
> frame = malloc(sizeof(FrameyThingyWhatsit));
>
> That'll allocate enough memory for the entire structure, and then
> "frame" is a pointer to the start of that structure. Just like with
> arrays ...
"Thunk"! ...The sound of pieces falling in place.
So this:
struct FrameyThingyWhatsit {...int pts;...} ...a 'C' structure referenced by
'FrameyThingyWhatsit->pts'
is equivalent to this:
FrameyThingyWhatsit = [...pts,...] ...an array referenced by 'FrameyThingyWhatsit[3]' (except that
mixed datatypes in arrays are verboten)
or maybe better analogy, to this:
FrameyThingyWhatsit = {...pts,...} ...an object referenced by 'FrameyThingyWhatsit.pts'
>... you hang onto a pointer to the base of it, and then you index
> into it; the compiler knows the layout of the structure, so when you
> say "frame->pts", it knows exactly how many bytes above the base of
> the structure to find that member.
Ah, so there can be
struct thisframe {...int pts;...}
struct thatframe {...int pts;...}
struct otherframe {...int pts;...}
referenced by 'thisframe->pts', 'thatframe->pts', and 'otherframe->pts', and the 3 'pts's are
independent of one another, sort of like 3 namespaces.
I think I have it right, or do I?
>>> But I think Carl's point was that you can't simply look at an
>>> expression and decode it as algebra. To understand this line of code,
>>> you not only have to interpret the syntax of this exact line, but -
>>> and probably more importantly - you have to understand what the
>>> av_rescale function is doing.
>>
>> Well, I think I know what 'av_rescale()' is doing (at least for the 'minterpolate=fps=48/1.001' &
>> 'telecine' filters). I ran some tests. Look:
>
> Uhh..... cool. This is the part where I'm the one who has no clue
> what's going on, so I'm just going to do the whole "smile and nod"
> thing, and trust that you know what's going on :)
Well, here's the thing: At times PTSs are perfect [1], or sometimes they're bollixed but the video
nonetheless plays properly [2], or sometimes it doesn't play properly [3].
[1] 60/1.001fps example: MPV shows "FPS: 59.940 (specified) 59.940 (estimated)"
[2] 60/1.001fps example: MPV shows "FPS: 60.025 (specified) 59.940 (estimated)"
[3] 60/1.001fps example: MPV shows "FPS: 59.940 (specified) ...wanders... (estimated)"
That playback behavior is the 1st clue I got that PTSs are key. Why are there MPV differences
remains a mystery -- I assume that it indicates that the PTSs are (may be) correct but the video's
metadata is wrong. Of course, my inference may be wrong -- ffmpeg investigation is like reading a
murder mystery.
> Glad I could help! You're on your own for the next part, but if I've
> been of any value at all, that's awesome. All the best!
>
> ChrisA
You did well, Chris, and you did good. Thanks so much. I feel I know what 'C' structures are and how
the '->' operator works -- before you, I didn't even know that '"struct "+label+"{ "+type+" "+var"
}"' and 'label+"->"+var"' were related. The bottom line is this: A struct is the 'C'-way to
instantiate an object -- Yes, I'm aware of C++. It's sort of a 'C' language architecture hack, isn't
it?
--
Any journey, no matter how long, is just a series of small steps.
"Government is the problem!" -- 1982 and onward.
"_______ is the enemy of the people!" -- 2016 and onward.
"You have to fight like hell or you're not going to have a country!" -- Jan 6, 2021.
It isn't the distance that's important, it's the direction.
More information about the ffmpeg-user
mailing list