Daniel,

On 6/27/23 15:40, Daniel Andres Pelaez Lopez wrote:
You are right, the CMAF format of the segment might bring the fragment size
information, but as you state, we might need to parse the segment as it is
being uploaded to figure out the fragment size, that's an option over the
table, but being fast is also important here, as we are creating low
latency streams (under 3 seconds glass to glass). Seems easier to just read
the chunk size from the CTE, as this DASH server example shows
https://gitlab.com/fflabs/dash_server/-/blob/master/dash_server.py#L62
that's a DASH server in Python with pretty low-level network access.

You are only trying to optimize one link, here, right? The Tomcat-to-client link? The video-generator-to-Tomcat link need not be particularly optimized, correct?

It might be easier to parse the CMAF as it arrives and store your own mapping metadata. It will require less hacking of Tomcat (which would not work if you ever had to switch server vendors, for example) and it would also work with *any* client, not just the specially-coded client that already does this particularly-convenient upload-chunking you are trying to capture.

1. The line which sets the output buffer size. If you use the default
buffer size, Tomcat may (okay, WILL) "chunk" the response in the middle
of your video-chunk of a video-chunk can get bigger than the current
buffer size. So you need to make sure that doesn't happen.

Or, maybe it's okay if that happens, but you want to minimize the number
of times that happens or you waste bytes, cycles, etc.

This is great info, I didn't know, as we would like to transfer full
fragments, we might need to increase that above the max, I have seen 20 kb
fragments.

While that's "not very big", I believe the default buffer size is 8kb so you might have been bitten by this.

Streaming video is hard and harder in low latency glass to glass, so, seems
like optimizations on how to transfer the video are important, for
instance, the HLS spec mentions how those fragments/byteranges should be
returned
https://datatracker.ietf.org/doc/html/draft-pantos-hls-rfc8216bis#section-6.2.6
(partial segments = fragments):

    When processing requests for a URI or a byte range of a URI that
    includes one or more Partial Segments that are not yet completely
    available to be sent - such as requests made in response to an EXT-X-
    PRELOAD-HINT tag - the server MUST refrain from transmitting any
    bytes belonging to a Partial Segment until all bytes of that Partial
    Segment can be transmitted at the full speed of the link to the
    client.  If the requested range includes more than one Partial
    Segment then the server MUST enforce this delivery guarantee for each
    Partial Segment in turn.  This enables the client to perform accurate
    Adaptive Bit Rate (ABR) measurements

Yeah, it's not surprising that I'm ignorant of all that stuff. :)

Our understanding of that statement is that we must have the whole
chunk/fragment/partial segment ready before transmitting it through the
network, as a chunk.

But I think it was mostly written to ensure that no other delay factors would come into play during transmission -- such as waiting on some OTHER network resource to provide the source data. I mean... you are still going to be waiting on the disk/NAS/etc. right? Or are you reading everything into memory before this?

I'd still argue that math is fast and networks are slow, but it's not my project :)

Regarding using org.apache.coyote.Request.setInputBuffer as a workaround,
seems like we don't have access to org.apache.coyote.Request directly, we
have access to org.apache.catalina.connector.RequestFacade, which doesn't
offer any way to access the
underlying org.apache.catalina.connector.Request, and therefore
org.apache.coyote.Request. Any way to have access to
org.apache.coyote.Request?

Yeah, this is the part where I think you need some support added into Tomcat itself at the source level.

Tomcat doesn't expose the coyote.Request object to applications for two reasons: (1) it's contrary to the spec and (2) it's potentially dangerous, since it offers access to Tomcat internals.

So we'll have to come up with the most convenient thing in Tomcat that can reasonably help you out, here.

It's possible that we won't come up with anything, because it will break too much encapsulation / protection and you may have to resort to my proposal above, which is to instrument the upload differently and capture your metadata in a more product-agnostic way.

-chris

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org
For additional commands, e-mail: users-h...@tomcat.apache.org

Reply via email to