[matroska-devel] MPC SV8 framing sources

Christian HJ Wiesner christian.hj.wiesner at web.de
Sat Jan 25 07:43:31 CET 2003


HI,

attached some code Frank has written to handle SV8 streams. If anybody ( 
raghav ? ) feels like he wanted to start looking at a MPC2matroska.exe .

Regards

Christian

-------- Original Message --------
Subject: Re: Hosting of MPC
Date: Fri, 24 Jan 2003 16:00:47 +0100
From: Frank Klemm <pfk at fuchs.offl.uni-jena.de>
To: Christian HJ Wiesner <christian.hj.wiesner at web.de>
References: <3DB411A0.32750.1362067 at localhost> 
<004e01c2c14f$6dea6450$a70aa8c0 at mahlo.de> 
<20030123140827.A15489 at fuchs.offl.uni-jena.de> <3E30847C.50104 at web.de>

On Fri, Jan 24, 2003 at 01:10:36AM +0100, Christian HJ Wiesner wrote:
> 
> Es war immer geplant daß der player auf einer komplett anderen homepage 
> gehostet wird, nämlich auf
> 
> http://www.corecodeD.com  ( beachte das 'D' statt dem 'C' )
> 
> Emmett hat nun gegenüber der FSF einfach behauptet daß wir den server 
> space von der FSF Köln dazu verwenden wollten um den closed source 
> player zu verbreiten, was einfach schlicht weg gelogen war.
> 
> Ich will nichts böses über ihn sagen, er liebt sein Ogg und Vorbis und 
> auch open source, aber er greift manchmal in seiner Liebe zu sehr 
> fragwürdigen Mitteln, und wenn er so viel arbeiten würde wie er schwätzt 
> wäre er schon Multi-Millionär ;-) ...
> 
Irgendwie scheinen zur Zeit radikale Einstellungen und Meinungen
Hochkonjunktur zu haben.

Desweiteren Weiterbrabbeln von unverstandenem und Halbwissen.

Das betrifft Politik, Tagesgeschehen und eigentliches alles, was man im Netz
findet.

Fast alles wird nur noch so oberflächlich angerissen, daß man fast alles
nur noch als "falsch" deklarieren könnte.

Zu Ogg Vorbis:
   - Ich hatte an Monty einen Vorschlag geschickt, wie man IMHO patentfrei
     PNS in Ogg Vorbis reinbekommt, was bei geringen Bitraten sehr große
     Vorteile bringt. Das Verfahren wäre ziemlich flexibel. Keine Antwort.

   - Ich hatte in Ogg Vorbis den Wunsch, mit 3 Blockgrößen arbeiten zu
     können. 1024 ist für viele Signale (Popmusik heutiger Zeit, Sprache!)
     bei 44.1 kHz/48 kHz und erst recht bei 32 kHz viel zu lang und
     128 sind dann doch etwas zu kurz. Keine Antwort.

     Denkbar wären 1024/512/128 für q < 6 und 1024/256/64 für q >= 6.
     Transientenprobleme sollten dann auch bei einem Transform Codec
     nicht auftreten.

   - Ich vermisse eine ANSI-C Implementierung ohne Tonnen von
     automake-Gerafffel drumrum. Ich bekomme auf meinem etwas älteren
     System zwei Programme nicht zum Übersetzen, weil irgendwelche Scripte
     mit Syntax-Fehlern abbrechen: flac + ogg vorbis.

     Und es gibt jede Menge anderer Leute, bei denen Ogg Vorbis auch nicht
     übersetzt werden kann (und die binaries laufen auch nicht, weil die
     gegen die allerneuesten versionen der C-lib gelinkt sind).

     Hier habe ich schon mehrfach eine balastfreie Ogg Vorbis-Version
     gefordert, die einfach nur eine Datei in eine andere konvertiert.
     Keine Antwort.

     Kannst mit dem Problem Dich auch mal an piecha at micronas.com wenden.

     Nachbemerkung: Ja, mppenc/mppdec ist auch kein Musterbeispiel in
     Sachen einfacher übersetzbarkeit und guter Dokumentation.


> >>MPC Einbindung erfolgt dann wenn Frank SV8 einigermassen fertig hat.
> >> 
> > Eigentlich sollte Dienstag eine Version 7.5 released werden, die von ihrer
> > Containerstruktur fast genau 8.0 entspricht. Also 20-Zeilen-C-Programm
> > mit Nullkenntnis über Interna kann das Teil auseinandernehmen und wieder
> > zusammensetzen.
> > Aber irgendwie gibt es derzeitig ein paar zu viel Viren hier, und ALLEN aus
> > dem Weg zu gehen ist nicht so einfach ...
> 
> Bleibt die SV8 Struktur so wie auf Deiner homepage beschrieben ? Wenn ja 
> könnten wir ja schon mal mit dem Studium desselben beginnen ?
> 
Ich habe mal was angehangen.


> >>Folgende Fragen habe ich an euch :
> >>
> >>- Habt Ihr euch schon entschieden ob ihr mit MPC ein opensource Projekt
> >>  starten wollt ?
> > 
> > "Opensource" ist ein Sammelbegriff. Die Frage ist, welche Lizenzen.
> > LGPL + BSD ???
> > Ich brauchte mal eine Aufstellung aller schon bekannten Lizenzen sowie deren
> > Vor- und Nachteile.
> 
> Der robux4 kennt sich hier mittlerweile sehr gut aus. Es gibt eine 
> homepage die alle bekannten Lizenzen aufzählt und die Unterschiede 
> erklärt, muss mal gründlich nach der URL suchen.
> 
> matroska, zumindest der sourcecode der libraries, wird wohl gleichzeitig 
> unter 3 verschiedenen Lizenzen erscheinen :
> 
> GPL
> QPL
> Spezial-Lizenz für Firmen die libmatroska einsetzen wollen
>
Warum nicht LGPL? Oder soll das durch die QPL abgefangen werden?
Schickt mal die Linzenzdateien zu, ich hänge sie bei mir mit dran ...
Die GPL sollte ich haben. Gibt es da mittlerweile eine Jahr 2000 kompatible
(das Beispiel fängt immer noch mit 19XX an)?

... muß mal schnell durch die Quellen gehen und 2002 durch 2003 ersetzen ...


> >>- Ist schon eine Entscheidung bzgl. des hosts gefallen ?
> >> 
> > Mir ziemlich egal. Die primären Quellen werden bei mir auf der heimatlichen
> > Festplatte liegen.
> > 
> >>- Fällt euch irgendwas an corecodec.org auf was euch nicht gefällt und
> >>  geändert werden sollte ?
> > 
> > Keine Meinung. Ich weiß nicht, welche Hosts für eine gute Verbreitung gut
> > sind. Finanzielle Unterstützung für die Arbeit erwarte ich nicht, es sollte
> > aber dann wenigstens von vielen Leuten genutzt werden. Das wäre "Belohnung"
> > genug.
> > Das schlimmste wäre etwas, was keinen interessiert.
> 
> Kann mit MPC ja wohl kaum mehr passieren daß sich keiner dafür 
> interessiert, oder ;-)  ?
> 
> Wir werden für Corecodec sehr viel Werbung auf allen einschlägigen 
> boards und im Netz machen, über potentielle Nutzer solltest Du Dir daher 
> keine Sorgen machen müssen.
> 
> Alleine der alte PowerDivX Player den BlackSun programmmiert hat fand im 
> Laufe der Zeit ca. 250.000 treue Fans, der neue Player ist der Hammer 
> und wird sehr viele Leute zu corecoded.com and damit automatisch auch zu 
> corecodec.org ziehen. Im Gegensatz zu sourceforge.net ist corecodec.org 
> spezialisiert auf audio/video und wird zum Anfang bereits
> 
> matroska  ( Container )
> UCI  ( codec API )
> USF   ( subtitle Format auf XML/EBML )
> 
> beherbergen.
> 
> Wäre prima wenn ihr ( Du ) euch für corecodec.org als host entscheiden 
> könntet(könntest).
> 
Ich shcike Dir die Quellen zu, und Du kannst Dich dann um das Laden auf
einen Server kümmern. Solange nur einer coded, ist das Hosten eigentlich
zweitrangig.

-- 
Frank Klemm


-- Attached file included as plaintext by Ecartis --
-- File: lhommifier.c

#include <stdio.h>
#include <string.h>


// #define BIDIR_LEN			// 1)
#define MAX_FRAME_LEN	8191		// 2)


static void
writeoutput ( const char* basename, long no, const void* data, unsigned int len )
{
    char   name [2048];	
    FILE*  fp;
    
    switch ( no ) {
    case -2:
        sprintf ( name, "%s.footer", basename );
	break;
    case -1:
        sprintf ( name, "%s.header", basename );
	break;
    default:
        sprintf ( name, "%s.%06ld", basename, no );
	break;
    }
    
    if ( ( fp = fopen ( name, "wb" ) ) == NULL ) {
        fprintf ( stderr, "lhommifier: Can't create '%s'\n", name );
        exit (126);
    }

    fprintf ( stderr, "Writing '%s'...", name );    
    fwrite ( data, 1, len, fp );
    fclose ( fp );
    fprintf ( stderr, "\b\b\b   \n" );    
}


int
main ( int argc, char** argv )
{
    unsigned char  buff [65536];	// Read/Write buffer
    FILE*          fp;			// input file pointer
    unsigned int   len;			// length information before a block
    unsigned int   bidir_len;		// length information after a block (when BIDIR_LEN is defined)
    long           frames;
    long           i;
    
    // usage
    if ( argc < 2 ) {
        fprintf ( stderr, "usage: lhommifier filename\n" );
        return 1;
    }
    
    // opening of source file
    if ( ( fp = fopen ( argv [1], "rb" ) ) == NULL ) {
        fprintf ( stderr, "lhommifier: Can't open '%s'\n", argv [1] );
        return 2;
    }
    
    // analysis of 4 byte magic ID + first 2 bytes of header
    fread ( buff, 1, 6, fp );
    if ( 0 != memcmp ( buff, "MP+\xFF", 4 ) ) {			// 3)
        fprintf ( stderr, "lhommifier: Input file '%s' is not StreamVersion 15.15\n", argv [1] );
        return 3;
    }
    len = buff[4] * 256 + buff[5];
    
    if ( len > MAX_FRAME_LEN ) {
        fprintf ( stderr, "lhommifier: Header length is out of range [0,%u]: %u\n", MAX_FRAME_LEN, len );
        return 4;
    }
    
    // analysis and copying of header
    len = fread ( buff, 1, len, fp );
    writeoutput ( argv[1], -1, buff, len );

    frames = ((long)buff [2] << 24) |				// 4)
             ((long)buff [3] << 16) |
	     ((long)buff [4] <<  8) |
	     ((long)buff [5] <<  0);

#ifdef BIDIR_LEN
    fread ( buff, 1, 2, fp );
    bidir_len = buff[4] * 256 + buff[5];
    if ( len != bidir_len ) {
        fprintf ( stderr, "lhommifier: bidir length mismatch in header: %u != %u\n", len, bidir_len );
        return 5;
    }
#endif	     

    // analysis of frames    
    for ( i = 0; i < frames; i++ ) {
	fread ( buff, 1, 2, fp );
    	len = buff[0] * 256 + buff[1];
	
	if ( len > MAX_FRAME_LEN ) {				
    	    fprintf ( stderr, "lhommifier: Frame #%ld length is out of range [0,%u]: %u\n", i, MAX_FRAME_LEN, len );
    	    return 6;
	}
	len = fread ( buff, 1, len, fp );
	writeoutput ( argv[1], i, buff, len );

#ifdef BIDIR_LEN
	fread ( buff, 1, 2, fp );
	bidir_len = buff[4] * 256 + buff[5];
	if ( len != bidir_len ) {
    	    fprintf ( stderr, "lhommifier: bidir length mismatch in frame #ld: %u != %u\n", i, len, bidir_len );
    	    return 7;
	}
#endif	     
    }
    
    // remaining data are tags (this only copies tags up to 64 KBytes correctly)
    len = fread ( buff, 1, sizeof buff, fp );
    if ( 0 == memcmp ( buff, "APETAGEX", 8 ) ) fprintf ( stderr, "informational: APE tags with header\n" );
    if ( 0 == memcmp ( buff, "TAG"     , 3 ) ) fprintf ( stderr, "informational: ID3V1 tags\n"           );
    writeoutput ( argv[1], -2, buff, len );
    
    fclose ( fp );   
    return 0;
}    

/* end of lhommifier.c */

/* 
 *  To be defined:
 *    1) use of BIDIR_LEN: yes, no, optional ?
 *         + can be used for seek forward and backward
 *         + can be used to detect errors in the stream
 *         + can be used for resync
 *         - needs 0.6 kbps
 *
 *    2) MAX_FRAME_LEN: 8191 or 16383 ?
 *         o  8191 = 2.5 Mbps
 *         o 16383 = 5 Mbps
 *         o more than 14 bit are not possible, otherwise there are collisions with tags, headers, etc. which do start with a capital letter
 *
 *    3) StreamVersion
 *         o major stream version is stored in the lower 4 bit
 *         o minor stream version is stored in the upper 4 bit
 *         o final format (with different versions) will be something like 8.0...8.3, which ends up with
 *           a \x08, \x18, \x28 or \x38 here
 *
 *    4) number of frames is stored as internal data in the header, but this information
 *       is also a very interesting global information, so the offset of this info should be fixed.
 *       Currently at offset 2, but may be offset 0 is better and less arbitrary ???
 *
 *    x) For A/V the number of generated PCM samples of one frame may be of interest.
 *       Currently these are 0...1152 (may be also 1536). But this information is not
 *       public available. Is this a problem ???
 *
 *    y) also the following information are not available: channel count, sampling frequency.
 *       Is this a problem ore must this be fixed ???
 *
 */
 


http://matroska.org



More information about the Matroska-devel mailing list