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:

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 serves as the mp3 encoder task handle.
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:

1.3.9.1