[usf-devel] Re: embedded inline pictures
- From: unmei <unmei@xxxxxxxxxxxx>
- To: usf-devel@xxxxxxxxxxxxx
- Date: Sun, 14 Aug 2005 19:31:41 +0200
Luca Della Santina wrote:
I think is a good assumption to think that USF, as well as any of the
other textual subtitle format, is not going to contain a large amount of
pictures inside itself, as well as no very big picture must be included
in a single subtitle, otherwise it is obvious that playing will be choppy.
Cons: Since the picture is streamed along with the subtitle, the
processing time for that subtitle increases a lot, and this brings
higher probability of choppy playback.
This can only be seen by trying it. You are right that passing the
pretty long string of such base64 encoded data can slow down some parts,
but i hope it will be offset by the radically reduced composing
complexity for the final bitmap. Yesterday i tried a sample where i
muxed 4 inline pictures (1xPNG,1xJPEG,1xGIF,1xOPS) and testApp did not
seem to lag visibly even tho their size was ranging from 30 to 130KB.
It is currently a major hassle to produce files with embedded images,
but once i have a file with some more pictures in it, im goint to do
timing tests. But of course this will only time pixifier, the additional
lag produced in the splitter and pixishow probably has to be taken into
consideration as well.
Except when you want to use the same picture more than one time in the
script (like a logo or somethin else) in this case it is very useful the
old way (picture in <embedded> + link in the <image>).
Yes, inline pictures are clearly not for logos and other repeated
pictures. Also i expect files with inline pictures not being produced
manually, but by an application that takes a text based script and
renders it into pictures and inlines those.
You can of course create inline pictures manually, for example if you
have a few things that are not possible with USF styling and want them
included in an otherwise text based script.
I think "content-type" name for the attribute fits beter since "content"
seems that the image data are going to be contained in the attribute
itself.
Totally agreed. I will use content-type.
Maybe the default value has to be "inline" and not "reference", since
the most of times you create a picture event the picture is meant for
that subtitle only, the case where you need to share the same picture
among more subtitles is not so common.
I'm unsure about this. From a logical point you are right. But it
invalidates old scripts. Especially bad is that USFV100_sample.usf will
become even more invalid than it already is :)
Maybe we should really use a new USF version number at some time...
At this stage retrocompatibility has not to be a primary goal, since
there are not so many usf subtitles around and even less USF rasterizers.
It's a point. But XML would aready make it so easy to design extensible
and still backward compatible file formats we should not waste it
without always thinking about how we can reduce the impact on
compatibility. Of course in our case, if the compatibility becomes a
major drag it is better to break it and use a clean solution.
Visualizng your proposal, a "reference" image event becomes:
<image content-type="reference">MyPicture.bmp</image>
while an "inline" image event becomes:
<image content-type="inline/bmp">MyBase64EncodedStuff</image>
Correct (except see below)
There are some weak points:
1) Having a node content type that changes so much (a string to a b64
encoded string) is not always a good pratice (often in these cases you
use 2 different node types for that like <image> and <inline-image>,
which is obviously not our goal).
Again a good point. Still i opt for the one element for both content
types. If people there are strong arguments against the "combined" type
from the user side, we could still switch to a seperate <inline-image>.
This is a proposal after all, and not like changing the base
specification draft 0.16.
Now that you mention this, <image> with a reference is actually a bit
unlucky, especially with the reference pointer in the pareable content
(compared to an attribute). You could actually say, a reference is a
reference no matter whether it points to a raster image or a SVG
declaration or whatever else. And the use <image> for inline images only
and <reference type="image" xref="this.bmp" /> to refer to an embedded
or external image.
But this is kind of out of question IMO. A merge idea how it could also
have to be done.
Please do not consider this as a proposal i back :)
2) Maybe is good to place in a separate attribute the MIME type / file
extension, this make "content-type" attribute parsing simpler, and
because otherwise "inline" cannot be the default for <image>).
Agreed.
3) When you use an inlined picture you definitively loose the original
image filename (you only preserve its file extension/MIME type).
I have zero problem with losing the filename. I suspect you think about
extracting the image again. But IMO embedded files are not meant to be
extracted again. Of course you can (text editors and base64 decoders are
cheap today ;)) but the name of an inlined image probably has no meaning
anyway. If the application that embeds inline images specifies filenames
such as "image_0001.png", "image_0002.png" you can as well not mention
them and assign them a random filename at the time you extract them.
In order to solve these issues please consider this modification to your
proposal:
- <image> node text content will become only a base64 encoded string.
- A new attribute for the <image> node is declared: "filename"
in this way a "reference" image event becomes:
<image content-type="reference" filename="MyFileName.bmp"/>
while a "inline" image event becomes:
<image content-type="inline"
filename="MyFileName.bmp">ByBase64EncodedStuff</image>
MMM i should have read all of the mail before writing the other comment
above =>
If you too think the reference does not belong into the content, it is
probably really not that great.
I am a bit in doubt, but i think we should drop the possibility to
specify the MIME-Type. We can give the extension in filename and this
serves as a early-abort for unsupported types as well as a MIME-Type.
Now if you are going to change that much, i also tend to favor "inline"
as default content type. Parially also because i came up with a error
handling that should be "solid" for old images.
Also again, if the filename is no longer "content", the name
"content-type" doesn't fit the meaning too well form the data structure
point of view.
But "type" again is too general, and "content" has not become more
fitting. So ok, let's stick with content-type, from the "user" point of
view the image istill is sort of content of that element and there
probably is no totally fitting name for that attribute.
*Revised* Proposal
the <image> element should be changed in the following way:
*introduce a new attribute "content-type"
This attribute is optional and defaults to the value "inline".
The possible values of this attribute are "reference"|"inline".
*introduce a new attribute "filename"
This attribute is mandatory.
*if the element is a reference the element must be empty. See below for
a note on this. If the element is an inline image the content of the
element is the base64 encoded file data.
Notes:
For reference elements, the value of the filename attribute is the name
of the the ressource to be liked to. The ressource is either an embedded
image with corresonding filename attribute or an external file with that
filename.
For inline image elements, the value of the filename is merely
informational. It is required to at least provide the correct extension
of the inlined image, but it doesn not have to be a filename windows
likes. And it does not have to be unique. It is perfectly legal to
specify filename=".png" for all inlined images (if they are in fact PNGs
, that is).
USF files using the old way for images are in error with this new
specification. But the following error handling in this case is
mandatory for all parsers compliant with this proposal:
If a <image> element does not have the attribute "filename" it is in
error. If such an element is encountered, the parser must assume the
<image> element follows the old standard and interpret the _content_ of
the element as a _reference_. However the parser should notify the user
of this, unless this inflicts with the uability of the application.
In other words, an editing application must inform the user of this
error, but a playback application does not have to, if the notice would
interrupt playback. If a playback application provides an informational
output such as a "properties" or "info" panel or window, the error must
be mentioned there, but it must not pop up an error dialog blocking the
playback. A compliant software must not write the old type of image
elements. Even if it is merely copying data, it must transform such
elements into the new form.
(This will help getting rid of the old type since you only have to load
an old script in a compliant software and immediately save it to
transform into a compliant script).
If an image element "looks" like the new type (it does have the filename
attribute), a parser must not interpret the content as reference, even
if it is not valid base64 data. If the content in this case is not valid
base64 data, the handling must be the same as if a reference were not
found. If the decoded data is of a type the application does not
understand, it may apply error handling for "bad file type". The
handling for "bad file type" may be the same as for "file not found" or
it may later be specified more precisely.
The comments of the old proposal about scope and internal handling still
apply.
-- end of proposal --
PS: pixifier now can detect file types for PNG, BMP, JPEG, GIF and OPS
from the data (without filename/extension), but i still think it's good
to always provide at least the extension. It can help other appications
, it allows for early out if the type is not supported and making the
filename attribute mandatory is a good way to make a distinction between
the new and the old type of image elements.
http://usf.corecodec.org
Other related posts: