ENCODER__mp3.c File Reference


Detailed Description

This module manages the MP3 encoder.

REVISION

Definition in file ENCODER__mp3.c.

#include "../SYSTEM/sys_hardware.h"
#include "../SYSTEM/sys_assert.h"
#include "../codec/codec.h"
#include "../coder/coder.h"
#include "encoder.h"

Include dependency graph for ENCODER__mp3.c:

Include dependency graph

Go to the source code of this file.

Functions

BOOL ENCODER__mp3 (void)
 Function serves as the mp3 encoder task handle.

Variables

EncoderInputBitstream eib
 encoder input bitstream data object.
EncoderOutputBitstream eob
 encoder output bitstream data object.


Function Documentation

BOOL ENCODER__mp3 void   ) 
 

Function serves as the mp3 encoder task handle.

Returns:
TRUE if media access is not required, otherwise FALSE.

Definition at line 62 of file ENCODER__mp3.c.

References Audio, st_AUDIO::duration, eib, st_ENCODER::encode, Encoder, eob, st_CODER::flag, st_ENCODER::garbage, st_ENCODER::mediaPipe, st_ENCODER::pipe, PIPE_readNext(), PIPE_writeNext(), and SAUDIOTIME_UPDT.

00063 {
00064     int                 ii; 
00065     ULONG               tmpUL;
00066     PIPE_Obj *          pipe      = &Encoder.pipe;
00067     PIPE_Obj *          mediaPipe = &Encoder.mediaPipe; 
00068     EncoderSideInfo *   encode    = &Encoder.encode;
00069     
00070     // Encoder shutting down?
00071     if( Coder.flag & F_CODER_ENCODER_SETIDLE )
00072     {
00073         while( PIPE_writeFrameNum(mediaPipe) )
00074         {
00075             // Check queue to read.
00076             if(sram_frameNum != MAX_SRAM_QFRAME)
00077             {
00078                 // Check to rewind. 
00079                 if(sram_rdptr == ENCODER_SRAM_BUFLEN) sram_rdptr = 0;
00080                 
00081                 // Write to frame.
00082                 GEN_rdSRAM(sram_frameQ + sram_rdptr,
00083                         (USHORT *)mediaPipe->WrFrame.Frame,
00084                         ENCODER_MEDIA_PIPE_FRAMELEN );
00085 
00086                 sram_rdptr += ENCODER_MEDIA_PIPE_FRAMELEN;              
00087                 sram_frameNum++;
00088                 
00089                 // validate frame.
00090                 PIPE_writeNext(mediaPipe);
00091             }
00092             else
00093             {
00094                 Coder.flag |= F_CODER_ENCODER_IDLE;
00095                 Coder.flag &= ~F_CODER_ENCODER_DATAPENDING;
00096                 if(0==SEM_count(SEM_cache)) SEM_post(SEM_cache);    
00097                 break;
00098             }
00099         }   
00100         if(0==SEM_count(SEM_media)) SEM_post(SEM_media);    
00101         return TRUE;
00102     }
00103         
00104     if( PIPE_readFrameNum(pipe) ) 
00105     {      
00106         // See comment in UI_PSF_record.
00107         if(encode->nested == 0)
00108         {
00109             // Throw away the first 200ms audio.
00110             if(Encoder.garbage)
00111             {
00112                 Encoder.garbage--;
00113                 PIPE_readNext(pipe);
00114                 return TRUE;
00115             }
00116         
00117             mprFrameIdx++;
00118             tmpUL = mprFrameIdx*576/44100;
00119             if ( Audio.duration != tmpUL )
00120             {
00121                 Audio.duration = tmpUL;             
00122                 mMSG_send(sysMsgQ, SYS_MSG_ID, SAUDIOTIME_UPDT, DONTCARE, 0);
00123             }   
00124         }
00125         else 
00126         {
00127             if(encode->nested == 1)
00128             {
00129                 encode->nested = 2;
00130                 Encoder.garbage = THROW_AWAY_SAMPLES;
00131                 // Now throw away buffered SRAM output.
00132                 sram_frameNum += sram_noiseFrameNum;
00133                 sram_rdptr += sram_noiseFrameNum*ENCODER_MEDIA_PIPE_FRAMELEN;
00134                 if(sram_frameNum > MAX_SRAM_QFRAME) 
00135                 {
00136                     sram_frameNum = MAX_SRAM_QFRAME;
00137                     sram_rdptr    = sram_wrptr;
00138                 }           
00139             }
00140         }
00141 
00142         eib.inputWord = (int *)pipe->RdFrame.Frame;
00143         eib.numberOfInputWords = pipe->wFrameLen >> 1;
00144     
00145     #ifndef MONO
00146         eib.numberOfChannels = 2;
00147     #else
00148         eib.numberOfChannels = 1;
00149     #endif
00150         
00151         eib.consumedInput=0;
00152         eob.outputWord=(int *)&encode->data[encode->data_start];
00153     
00154         eob.wordsProduced=0;    
00155     
00156         PAProcess(&eib, &eob);
00157     
00158         // Check to release encoder pipe.
00159         if (eib.consumedInput)
00160         {
00161             PIPE_readNext(pipe);        
00162         } 
00163 
00164         // Check to write data back in media.
00165         if(eob.wordsProduced)
00166         {       
00167             mprWordCounter += eob.wordsProduced;        
00168             encode->data_start += eob.wordsProduced;
00169             
00170             ii = 0;
00171             while( mprWordCounter >= ENCODER_MEDIA_PIPE_FRAMELEN )
00172             {
00173                 /* Is queue writable? */
00174                 if( sram_frameNum )
00175                 {
00176                     // Check to rewind.
00177                     if(sram_wrptr == ENCODER_SRAM_BUFLEN) sram_wrptr = 0;
00178     
00179                     GEN_wrSRAM( sram_frameQ + sram_wrptr, 
00180                                     (USHORT *)encode->data + ii,
00181                                     ENCODER_MEDIA_PIPE_FRAMELEN);
00182                     
00183                     sram_wrptr += ENCODER_MEDIA_PIPE_FRAMELEN;              
00184                     sram_frameNum--;                
00185                     ii += ENCODER_MEDIA_PIPE_FRAMELEN;
00186                     mprWordCounter -= ENCODER_MEDIA_PIPE_FRAMELEN;
00187                 }       
00188                 else            
00189                 {
00190                     // No frame left, simply return, note that boundary check
00191                     // has been checked to make sure encoder output buffer 
00192                     // won't be overflowed.
00193                     if( encode->data_start > (OUTPUT_BUFFER_SIZE - MAX_PACKET) )
00194                     {
00195                         // Media write can NOT catch up. out of sync. 
00196                         // Throw away data.
00197                         asm(" nop");
00198                         encode->data_start =
00199                         mprWordCounter = 0;
00200                         
00201                         // Post media task to prevent dead lock. 
00202                         if(0==SEM_count(SEM_media)) SEM_post(SEM_media);
00203                     }
00204                     break;
00205                 }
00206             } // End of while.
00207             
00208             if( ii ) 
00209             {
00210                 // Pack the encoder output buffer.
00211                 memmove(    (int *)encode->data,
00212                             (int *)encode->data + ii,                            
00213                             mprWordCounter );
00214                 encode->data_start = mprWordCounter;        
00215             }
00216         } // End of if(eob.wordsProduced)
00217     }
00218         
00219     // Is there any free media frame?
00220     while( PIPE_writeFrameNum(mediaPipe) )
00221     {
00222         // Check queue to read.
00223         if(sram_frameNum < MAX_SRAM_QFRAME - RESERVED_SRAM_QFRAME)
00224         {
00225             // Check to rewind. 
00226             if(sram_rdptr == ENCODER_SRAM_BUFLEN) sram_rdptr = 0;
00227                 
00228             // Write to frame.
00229             GEN_rdSRAM(sram_frameQ + sram_rdptr,
00230                     (USHORT *)mediaPipe->WrFrame.Frame,
00231                     ENCODER_MEDIA_PIPE_FRAMELEN );
00232 
00233             sram_rdptr += ENCODER_MEDIA_PIPE_FRAMELEN;              
00234             sram_frameNum++;
00235                 
00236             // validate frame.
00237             PIPE_writeNext(mediaPipe);
00238             if(0==SEM_count(SEM_media)) SEM_post(SEM_media);
00239         }
00240         else 
00241         {   
00242             // Output buf empty now.
00243             Coder.flag &= ~F_CODER_ENCODER_DATAPENDING;
00244             return TRUE;
00245         }
00246     }
00247     
00248     Coder.flag |= F_CODER_ENCODER_DATAPENDING;
00249     return TRUE;
00250 }

Here is the call graph for this function:


Generated on Wed Jan 19 01:12:55 2005 for neuros-firmware by  doxygen 1.3.9.1