Hi Kevin, 1/ The mode number can imply a sample rate:
mode = CODEC2_MODE_2400WBA; codec2 = codec2_create(mode); Fs = codec2_sample_rate(codec2); 2/ > It might make sense to keep a flags byte around for --natural and > --softdec. I haven't used these so I don't know much about them. These flags have been used from time to time to support my digital voice over radio work. 3/ > My plan is to add some code to c2enc/dec to see if the codec2 filename > argument ends in ".c2". I like that. Cheers, David On 25/07/17 06:48, Kevin Otte wrote: > I like your magic_id better :) > > The reason I looked at the mode byte is because that's what c2enc/c2dec > (by way of a #define) use to set up the codec2 instance. > > codec2.h: > #define CODEC2_MODE_1300 4 > > c2enc.c: > mode = CODEC2_MODE_1300; > ... > codec2 = codec2_create(mode); > > Samples per frame, bits per frame, etc are all defined in the codec2 > internal structure: > > nsam = codec2_samples_per_frame(codec2); > nbit = codec2_bits_per_frame(codec2); > > So it really doesn't make sense to represent these values in the header > when the code can figure it out from a single byte. > > samplerate is something of a sticky wicket. For now the only outlier is > WB at 16Khz. Ideally I'd like to see the whole pipeline work at 48KHz > and let the FFT do the voodoo, but that's a whole other thread. I think > I'll leave that alone for now. > > It might make sense to keep a flags byte around for --natural and > --softdec. I haven't used these so I don't know much about them. > > At present we don't do any FEC in the raw streams, only on the air (eg: > with freedv_tx/rx not c2enc/dec). > > The version stuff might be useful for detecting future backward > incompatible changes, but my gut feeling is YAGNI. I'd be interested to > hear David's thoughts on that. > > So, that leaves us with a simpler header: > struct Codec2Header{ > magic_identification :u24b, // offset 0 bytes > // const 0xC0DEC2 ([0xC0,0xDE,0xC2]) > major_version :u8, // offset 3 bytes // > minor_version :u8, // offset 4 bytes // > mode_id :u8, // offset 5 bytes // > flags :u8, // offset 6 bytes // default 0 > }; > > Two bytes less if we ignore the version stuff. > > My plan is to add some code to c2enc/dec to see if the codec2 filename > argument ends in ".c2". > > In the case of the encoder, if it sees that file extension, it will > write the file header and then proceed to write as normal. Otherwise > behave as it does today. > > In the decoder, if that extension, try to parse the header and set the > mode. If the magic is wrong, seek the file back to zero and honor the > command line mode argument / flags. I don't want to change the argument > order as to not break old scripts. This means when using a valid .c2 > file the mode argument could be invalid, eg: ./c2dec foobar test.c2 - > > 73 de Kevin N8VNR > > On 07/24/2017 01:05 PM, txp0wer via Freetel-codec2 wrote: >> Hi folks! >> >>> That said, the notion of managing the different bitrates does present a >>> challenge. I therefore suggest any such encoded file have some "magic" >>> bytes at the beginning, even if this is something as simple as 0x43 0x32 >>> ("C2"). I then propose the next byte be the mode ID as defined in >>> codec2.h. This would allow c2enc/c2dec to be retrofitted or separate >>> tools to be constructed to Do The Right Thing™ based on these. >> >> May I suggest a bitstream header format that encodes all the profile >> parameters, so that new profiles can be added without changing the >> header format or adding new "magic" numbers for profiles. >> >> 73 de txp0wer >> >>> >>> If we can agree on these bytes, I'm happy to take a stab at coding this >>> up. It doesn't look like it should be too difficult (famous last words!) >>> >>> 73 de Kevin N8VNR >>> >>> On 05/22/2017 04:35 PM, Kevin Otte wrote: >>>> Or Matroska (.mka): >>>> https://matroska.org/technical/specs/index.html >>>> >>>> On 05/22/2017 02:28 PM, Bruce Perens wrote: >>>>> See https://www.xiph.org/ogg/doc/rfc3533.txt . Make it work with the >>>>> Ogg Encapsulation Format. >> >> <code language="pseudocode" style="Rust"> >> // data types: >> // u8 == unsigned 8-bit integer >> // u16b == unsigned 16-bit integer, big endian >> >> struct Codec2Header{ >> magic_identification :u24b, // offset 0 bytes >> // const 0xC0DEC2 ([0xC0,0xDE,0xC2]) >> major_version :u8, // offset 3 bytes // >> minor_version :u8, // offset 4 bytes // >> forward_ec_level :u8, // offset 6 bytes // >> flags :u8, // offset 5 bytes // default 0 >> subframes_per_frame :u8, // offset 7 bytes // 1 to 4 >> samples_per_subframe :u16b, // offset 8 bytes >> samplerate_hz :u16b // offset 10 // default 8000 >> }; >> >> struct Codec2SubframeParameters{ // offset 12 >> // repeated [subframes_per_frame] times >> lsp_bits_per_frame :u8, // offset 12+4*n >> pitch_bits_per_frame :u8, // offset 12+4*n+(0..1) >> energy_bits_per_frame :u8, // offset 4*n+(0..1) >> voicing_bits_per_frame :u8 // offset 4*n+(0..1) >> } >> >> match forward_ec_level{ >> 0=>none, >> 1=>"1200", >> 2=>"1850", >> 3=>"2000", >> _=>undefined >> } >> >> flags: >> 0x01=NATURAL_BYTE_ORDER // --natural >> 0x02=ALTERNATE_MODE_1 // "B" >> 0x04=ALTERNATE_MODE_2 // "C", "D" >> 0x08=ALTERNATE_MODE_4 // "E" .. "H" >> 0x10=unused >> 0x20=unused >> 0x40=unused >> 0x80=ALTERNATE_CODEBOOK_1 >> >> </code> >> >> example (hex) >> # "3200" default profile >> # begin Codec2Header >> 00: C0 DE C2 >> 03: 00 04 # version 0.4 >> 05: 00 # no forward error correction >> 06: 00 # flags: gray code, no alternate profile, no alternate codebook >> 07: 02 # 2 subframes per frame >> 08: 00 a0 # 160 samples per subframe => 320 samples per frame >> 0a: 1f 40 # 8000 Hz >> # end Codec2Header, begin Codec2SubframeParameters >> # # begin subframe 0 # if I understand codec2_encode_3200() right >> 0c: 20 # 32 bits LSP >> 0d: 00 # 0 bits pitch >> 0e: 00 # 0 bits energy >> 0f: 00 # 0 bits voicing >> # # end subframe 0, begin subframe 1 >> 10: 12 # 18 bits LSP >> 11: 07 # 0 bits pitch >> 12: 05 # 0 bits energy >> 13: 02 # 0 bits voicing >> # # end subframe 1 >> # end Codec2SubframeParameters, begin data bitstream >> >> >> >> ------------------------------------------------------------------------------ >> Check out the vibrant tech community on one of the world's most >> engaging tech sites, Slashdot.org! http://sdm.link/slashdot >> >> >> >> _______________________________________________ >> Freetel-codec2 mailing list >> Freetel-codec2@lists.sourceforge.net >> https://lists.sourceforge.net/lists/listinfo/freetel-codec2 >> > > ------------------------------------------------------------------------------ > Check out the vibrant tech community on one of the world's most > engaging tech sites, Slashdot.org! http://sdm.link/slashdot > _______________________________________________ > Freetel-codec2 mailing list > Freetel-codec2@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/freetel-codec2 > ------------------------------------------------------------------------------ Check out the vibrant tech community on one of the world's most engaging tech sites, Slashdot.org! http://sdm.link/slashdot _______________________________________________ Freetel-codec2 mailing list Freetel-codec2@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/freetel-codec2