
Author: ods15 Date: Mon Nov 6 09:34:06 2006 New Revision: 186 Modified: trunk/nututils/framer_mp3.c trunk/nututils/nutmerge.c trunk/nututils/nutmerge.h Log: promper mp3 framer for nutmerge! Modified: trunk/nututils/framer_mp3.c ============================================================================== --- trunk/nututils/framer_mp3.c (original) +++ trunk/nututils/framer_mp3.c Mon Nov 6 09:34:06 2006 @@ -8,7 +8,58 @@ }; static int get_packet(framer_priv_t * mp, packet_t * p) { - return get_stream_packet(mp->stream, p); + static const int tabsel_123[2][3][16] = { + { {0,32,64,96,128,160,192,224,256,288,320,352,384,416,448,0}, + {0,32,48,56, 64, 80, 96,112,128,160,192,224,256,320,384,0}, + {0,32,40,48, 56, 64, 80, 96,112,128,160,192,224,256,320,0} }, + { {0,32,48,56, 64, 80, 96,112,128,144,160,176,192,224,256,0}, + {0, 8,16,24, 32, 40, 48, 56, 64, 80, 96,112,128,144,160,0}, + {0, 8,16,24, 32, 40, 48, 56, 64, 80, 96,112,128,144,160,0} } + }; + static const int freqs[9] = { 44100, 48000, 32000, // MPEG 1.0 + 22050, 24000, 16000, // MPEG 2.0 + 11025, 12000, 8000}; // MPEG 2.5 + static const int mult[3] = { 12000, 144000, 144000 }; + int lsf,framesize,padding,freq,bitrate,layer; + uint32_t newhead; + int err; + + if ((err = get_stream_packet(mp->stream, p))) return err; + if (p->p.len < 4) return err_mp3_bad_packet; + + newhead = p->buf[0]<<24 | p->buf[1]<<16 | p->buf[2]<<8 | p->buf[3]; + + if ((newhead & 0xffe00000) != 0xffe00000) return err_mp3_bad_packet; + + layer = 4-((newhead>>17)&0x3); // valid: 1..3 + freq = (newhead>>10)&0x3; // valid: 0..2 + bitrate = (newhead>>12)&0xf; // valid: 1..14 + padding = (newhead>> 9)&0x1; + + if (layer==4) return err_mp3_bad_packet; + if (freq==3) return err_mp3_bad_packet; + + //>>19&0x3 + if (newhead & (1<<20)) { // MPEG 1.0 (lsf==0) or MPEG 2.0 (lsf==1) + lsf = (newhead & (1<<19)) ? 0 : 1; + if (lsf) freq += 3; + } else { // MPEG 2.5 + lsf = 1; + freq += 6; + } + + bitrate = tabsel_123[lsf][layer-1][bitrate]; + framesize = bitrate * mult[layer-1]; + + if(!framesize) return err_mp3_bad_packet; + + framesize /= (layer == 3 ? (freqs[freq] << lsf) : freqs[freq]); + framesize += padding; + if(layer==1) framesize *= 4; + + if (p->p.len != framesize) return err_mp3_bad_packet; + + return 0; } static int setup_headers(framer_priv_t * mp, nut_stream_header_t * s) { Modified: trunk/nututils/nutmerge.c ============================================================================== --- trunk/nututils/nutmerge.c (original) +++ trunk/nututils/nutmerge.c Mon Nov 6 09:34:06 2006 @@ -217,6 +217,7 @@ ERR_CASE(err_avi_no_audio_codec) ERR_CASE(err_avi_bad_packet) ERR_CASE(err_mpeg4_no_frame_type) + ERR_CASE(err_mp3_bad_packet) ERR_CASE(err_bad_oggs_magic) ERR_CASE(err_ogg_no_codec) ERR_CASE(err_ogg_non_interleaved) Modified: trunk/nututils/nutmerge.h ============================================================================== --- trunk/nututils/nutmerge.h (original) +++ trunk/nututils/nutmerge.h Mon Nov 6 09:34:06 2006 @@ -89,6 +89,7 @@ err_avi_no_audio_codec, err_avi_bad_packet, err_mpeg4_no_frame_type, + err_mp3_bad_packet, err_bad_oggs_magic, err_ogg_no_codec, err_ogg_non_interleaved,