[FFmpeg-devel] [PATCH 04/10] libavcodec/ccaption_dec: reap_screen after flipping on EOC
Aman Gupta
aman at tmm1.net
Fri Jan 8 15:47:19 CET 2016
On Fri, Jan 8, 2016 at 2:50 AM, Anshul Maheshwari <anshul.ffmpeg at gmail.com>
wrote:
>
>
> On Thu, Jan 7, 2016 at 6:14 AM, Aman Gupta <aman at tmm1.net> wrote:
>
>> Probably should have written a longer commit message here. The EOC
>> command stands for "end of caption" aka "display buffer". It's used with
>> POPON mode, where characters are written to an off-screen buffer and EOC
>> flips the buffers to display what has been written so far. Thus, it makes
>> sense to reap the screen *after* flipping the active screen, not *before*.
>>
>> The previous behavior was simply wrong, but masked by other bugs also
>> fixed in this patchset.
>>
>> Aman
>>
>> On Tue, Jan 5, 2016 at 11:41 PM, Aman Gupta <ffmpeg at tmm1.net> wrote:
>>
>>> From: Aman Gupta <aman at tmm1.net>
>>>
>>> ---
>>> libavcodec/ccaption_dec.c | 2 +-
>>> 1 file changed, 1 insertion(+), 1 deletion(-)
>>>
>>> diff --git a/libavcodec/ccaption_dec.c b/libavcodec/ccaption_dec.c
>>> index 9f17e77..5d4c568 100644
>>> --- a/libavcodec/ccaption_dec.c
>>> +++ b/libavcodec/ccaption_dec.c
>>> @@ -399,9 +399,9 @@ static void handle_erase(CCaptionSubContext *ctx,
>>> int n_screen)
>>>
>>> static void handle_eoc(CCaptionSubContext *ctx)
>>> {
>>> - reap_screen(ctx);
>>> ctx->active_screen = !ctx->active_screen;
>>> ctx->cursor_column = 0;
>>> + reap_screen(ctx);
>>> }
>>>
>>> static void handle_delete_end_of_row(CCaptionSubContext *ctx, char hi,
>>> char lo)
>>> --
>>> 2.5.3
>>>
>>>
>> I dont see it as bug, this problem comes because of change in 02/10 patch.
>
> handle_eoc always called handle_edm, am I missing some patch?
>
I removed the call to EDM from inside EOC, in "libavcodec/ccaption_dec:
reap_screen is not necessary when clearing screen or buffer"
Always calling EDM does not make sense, because the caption stream will
already send EDM when it is required. I think the EDM from EOC behavior was
a work around because previously "erase non-displayed memory" was not
implemented. See commit: libavcodec/ccaption_dec: implement "erase non
displayed memory"
>
> how does it matter, since this code has to be exectued sequentially? reap
> before or after I see them at same instant or at same command.
>
This matters because reap_screen will look at active_screen. EOC means
"display buffer", so we must first flip the active screen to display the
off-screen buffer, and then reap it. If you reap first, you are reading
from the incorrect buffer.
>
>
> -Anshul
>
More information about the ffmpeg-devel
mailing list