Sadly, all good things come to an end and this series review is no different. Let’s look at the last three entries before I give my opinion on all of them.
(more…)
Archive for the ‘Useless Rants’ Category
Dingo Pictures Works: Classics pt. 2 and Final Thoughts
Sunday, November 5th, 2017Some Impressions on Czech Railways
Sunday, November 5th, 2017I’ve finally travelled enough Czech railways (mostly in the South-western part of the country) to form some impressions about them.
First, they have somewhat funny train terminology there: R
means “rychlik” or express train while R-egional trains are marked as Os
or “osobni” but in reality they all move with speed around 50 km/h.
Second, the rolling stock.
Typical locomotive
The trains are usually two-four carriages dragged by locomotive, most often like on the picture above. It brings nostalgia to me because it looks like a Škoda train from 1960s that was one of the best locomotives in the USSR, and it was also nicknamed Cheburashka because it both looked a bit like a titular hero of that anime (formerly Soviet cartoon) and featured there as well. You can also see rail buses, double-decker regional trains (the same as InterCity trains in Ukraine) and some other types but they are very rare.
Speaking of locomotives, I had a brief visit to Austria and saw their main locomotive ÖBB 1044. And what do you know, it looks like a replica of Rc-locomotive from Sweden. And then you read that Austrian Railways actually bought ten Rc2 from Sweden and designated them as ÖBB 1043 locomotives. Since Rc2 was the best locomotive in Austria it’s no wonder they’ve designed the next model after it.
Third, tickets. Outside Prague you can buy tickets usually just at ticket office at the station or maybe at conductors (but I’ve never tried that), ticket offices accept Euros and sometimes you can pay with a card too (mind the signs there). Another funny thing is that tickets usually contain the stations you should pass on your route and they’re a lot like German tickets for regional trains—you just buy a ticket for a route, which train you choose is up to you. Even better that in most cases you can buy tickets outside country, like I’ve bought ticket Praha-Tábor in Dresden.
Fourth, infrastructure in general. And that’s where it sucks.
A station somewhere between Jihlava and České Budějovice
Station houses look like they were built either in XIXth century under Austrian rule or in 1970s under Soviet rule (those look like featureless boxes essentially) and many of them are not very well maintained unfortunately. Another thing is platforms. You can see typical Czech platform on the first picture. They are often about just twice as high as rails and not particularly wide too, you can meet high platforms only on big stations and very random places (IIRC I’ve seen one at Velesín Město and there’s just a single track there).
And now for the tracks themselves. Rail connectivity is very good there so you can get from one place to another without going through Prague, the downside is that it usually takes two hours to get from one node to another as I’ve mentioned above all trains travel with the speed around 50 km/h. I’ve travelled on routes Dresden-Praha, Linz-Prag, Praha-Schwandorf, Tábor-Jihlava and Jihlava-Plzeň and looks like only routes from Prague to important places like České Budějovice, Plzeň and such are double-track (and to Dresden for some reason), the rest are single-track and often are curvy as they were drawn with a tail of stubborn mule as we say here. Also track Tábor-Horní Cerekev is quite bumpy and reminds more of a typical Ukrainian road than railway.
In general, Czech railways leave an impression of railways in rural area and thus they have their inimitable charm. Throw in a nostalgic feeling from the locomotives and you can say I liked it despite all downsides.
Dingo Pictures Works: Classics pt. 1
Saturday, November 4th, 2017Let’s look at last category of Dingo Pictures cartoons. Because it’s rather large I’ve split it into two parts.
(more…)
H.263 And MPEG-4 ASP—The Root of Some Evil
Saturday, November 4th, 2017As you might know (but still not care), I’m working on adding full RealMedia support for NihAV starting with video. So I’ve made it to decoding RealVideo 2 and I have some not so nice words to say about H.263 and MPEG-4 ASP.
First, the creeping featuritis in the standards: MPEG-4 part 2 from 2001 has A-O (the version from 2004 has only annexes A-M for some reason) while ITU H.263 (version from 2005) has annexes A-X plus two appendices. For comparison, ITU H.264 from 2017 has annexes A-J, same for MPEG-4 part 10 😉 Mind you, some annexes are for informative stuff (e.g. how an encoder should work or list of patent claims) but others add new coding features. So, for MPEG-4 part 2 (2001) we have 15 annexes, 7 of them are informative and only a couple of normative annexes add new features. For ITU H.263 out of 24 annexes about 15 are introducing new coding modes and other enhancements (different treating of motion vectors, loop filter, an alternative macroblock coding mode, PB-frame type and a lot more). The features are actually grouped into baseline(-ish) H.263 and H.263+.
Second, neither of them is really suitable for video coding. I know, it might sound strange, but either of these standards makes an unholy mix of various codecs. H.263 mixes several codecs from different generations together (initial H.263 did not have B-frames, later they’ve added PB-frames and finally B-frames too, there are at least two different ways to code macroblocks etc etc), MPEG-4 part 2 is for coding 3D video that actually also specifies a method to code video texture on those 3D shapes (there are no actual frames there, just VOPs—Video Object Planes). And yet, because the compression methods there provided an improvement over H.262 (aka MPEG-2 Video), they were used in various forms with various hacks in many multimedia formats. There we have a very wide gamut from RealVideo 1 and Sorenson Spark (aka FLV1) with just I- and P-frames to Intel I.263 that had PB-frames to RealVideo 2 with many features of H.263+ (including B-frames) to M$ MPEG-4 decoders to WMV2.
And here we have the problem: both format grew from the joint effort known as H.262 or MPEG-2 Video so obviously it was a good idea to abuse the same decoder structure to handle all possible variations of H.263 and video texture coding from MPEG-4 part 2 and then add all decoder-specific hacks. And in result you get a mess that’s hard to comprehend because it usually depends on many various context variables set in a specific manner for a specific codec. Hence the post title.
To demonstrate this I’ll show how the same feature is handled in different H.263/MP4p2-based codecs.
Sequence and frame headers
Obviously it differs for every codec. Some rely on container-provided width and height, some have dimensions coded for GOP or for individual frames, some codecs have only meaningful bits in the frame header, others store all feature bits and error out on unsupported configurations.
Frame types
- Intel I.263: I, P, PB
- RealVideo 1: I, P
- RealVideo 2: I, P, B
- Sorenson Spark: I, P, droppable P
- WMV1: I, P
- WMV2: I, P, X8(alternative I-frame coding)
- H.263 in general: I, P, PB, B, EI, EP (last two are enhancement layer picture types for scalable coding)
- MPEG-4: I, P, B and S (last one is sprite-coded picture)
Block coding
- Intel I.263: H.263 codes
- RealVideo 1: H.263 codes with a special codes for I-frame DCs
- RealVideo 2: H.263+ AIC mode (advanced I-frame coding) plus H.263 P- or B-frames
- Sorenson Spark: H.263 codes with a custom handling of AC escapes
- WMV1/2: M$MPEG-4 codes
Motion vectors reconstruction
- H.263: simply add predictor vector
- H.263 UMV: depending on predictor value and difference range wrap it or not (see ITU H.263 D.2 for proper explanation)
- MPEG-4:
if (mv < low) mv += range; if (mv > high) mv -= range;
- M$MPEG-4:
if (mv < = -64) mv += 64; if (mv >= 64) mv -= 64;
(And there are different ways to predict motion vectors too!)
There are even more quirks than I listed here but it should give you an idea what a fine mess these formats are and why the code that supports them all tends to turn into huge mess. I tried to solve it in NihAV by having a template decoder for H.263 that calls bitstream parser for actual codec-specific parsing and keep some quirks inside specific structures (like MV that adds vectors differently depending on current mode) I still have more features to take into account (like slices, AC prediction and B-frames) so I’ll have to redesign it before I can support RealVideo 2 properly.
But then maybe I’ll add Vivo Media format support for the old times sake (it’s the funniest one with codebooks stored as strings of ones and zeroes like “0000 0011 110
” inside the binary with “End” signalling the codebook end).
Dingo Pictures Works: For The Youngest Ones
Tuesday, October 24th, 2017So, it’s time for spotlighting even more Dingo Pictures cartoon! And today we’re talking about the cartoons oriented at the youngest audience (even though all Dingo Pictures cartoons are rated as FSK 0—German version of Hays code saying “appropriate for ages 0 or older”—some of them are for more grown up audience, little children won’t be able to appreciate them).
(more…)
Dingo Pictures Works: Adventures
Tuesday, October 3rd, 2017This category can be alternatively titled wild animal adventures and it contains probably the most famous Dingo Pictures cartoons.
(more…)
Dingo Pictures Works: Fairy Tales
Friday, September 22nd, 2017There are only three stories in this category and six-seven in the remaining ones so I don’t have to split this post into two parts.
(more…)
Dingo Pictures Works: Thrillers
Monday, September 11th, 2017Today I’m covering the great works from Dingo Pictures. I intend to split the review into roughly the same categories as they are put on the official website and today we start with the first section. Its name is “Krimis” in German which I think is more appropriately translated into “thriller” than “mystery story” or “detective story”.
(more…)
Dingo Pictures: Art Style
Friday, September 1st, 2017The prolific German animation studio has made 28 animated films during the 1990s and early 2000s and obviously they’ve managed to make their own unique style. In this post I’ll try to describe it.
Three Problems in Supporting Multimedia Formats
Thursday, August 31st, 2017As you probably don’t care, I’m working on RealMedia demuxer for NihAV. And it’s very straightforward: chunks without nesting, version field to guard against surprises, clean layout. The only peculiarities it has are audio data interleavers and so-called logical stream (the special entry that describes how to select streams for streaming depending on bitrate available). And yet the implementation for this format in libavformat
is quite complex and baffling. This observation led me to playing Captain Obvious and stating these three problems:
- Following specification. Unless it’s ISO/IEC or ITU codec you usually have quite lacking specification either with details omitted (or as DT$ representatives put it, but we have it in the SDK!. Which helps a lot when you can download only ETSI paper). In some case the original implementation is the only specification you have. I’m no stranger to working with binary specifications but it still quite often doesn’t say what to expect in some cases (and then fuzzing happens…);
- Supporting hacks and abuses of specification. Two examples: MP3 and AVI. Or MP3 in AVI. For instance, MP3 has an optional CRC field (so if you don’t want CRC you simply don’t put it there) but I’ve seen samples that put zero checksum instead. Or in AVI you’re supposed to have
42db
chunks for uncompressed video frames,42dc
for compressed video frames and42wb
for audio data. In reality you can havedc
anddb
identifiers mixed in the same stream or even0041
chunks put insideLIST rec
chunk (that’s Indeo 4.1 in CivII clips). And of course there are many many more examples that everybody who has encountered them tries to forget. - Seeking. You might wonder how seeking gets here and I’ll tell you how: most formats are not designed for random seeking and even if they are, users would still want to ignore indices, jump to a random position and find a start of the next chunk and timestamp as well. And in
libavformat
that is performed by a binary search that invokes specialread_timestamp
function of the demuxer (if present) which is supposed to do exactly that—searching for packet start and reporting a timestamp.
The moral of the story: if you can allow to ignore stupid user requests, do so and cherish the fact that you can. In NihAV I’m going to implement seeking only for formats that allow that (with reading index) or by more generic linear seeking that skips frames. This should be enough for my needs and it’ll keep code simple too.
Now that it’s become a bit colder I might actually resume my work on NihAV and even more important thing—describing Dingo Pictures art style and works.