static void mp3_close(void) { if (output_file) { int imp3, encout; /* write remaining mp3 data */ encout = lame_encode_flush_nogap(gfp, encbuffer, LAME_MAXMP3BUFFER); write_output(encbuffer, encout); /* set gfp->num_samples for valid TLEN tag */ lame_set_num_samples(gfp, numsamples); /* append v1 tag */ imp3 = lame_get_id3v1_tag(gfp, encbuffer, sizeof(encbuffer)); if (imp3 > 0) write_output(encbuffer, imp3); /* update v2 tag */ imp3 = lame_get_id3v2_tag(gfp, encbuffer, sizeof(encbuffer)); if (imp3 > 0) { if (vfs_fseek(output_file, 0, SEEK_SET) != 0) { AUDDBG("can't rewind\n"); } else { write_output(encbuffer, imp3); } } /* update lame tag */ if (id3v2_size) { if (vfs_fseek(output_file, id3v2_size, SEEK_SET) != 0) { AUDDBG("fatal error: can't update LAME-tag frame!\n"); } else { imp3 = lame_get_lametag_frame(gfp, encbuffer, sizeof(encbuffer)); write_output(encbuffer, imp3); } } } g_free (write_buffer); lame_close(gfp); AUDDBG("lame_close() done\n"); free_lameid3(&lameid3); numsamples = 0; }
int id3tag_write_v1(lame_global_flags * gfp) { lame_internal_flags *const gfc = gfp->internal_flags; size_t i, n, m; unsigned char tag[128]; m = sizeof(tag); n = lame_get_id3v1_tag(gfp, tag, m); if (n > m) { return 0; } /* write tag directly into bitstream at current position */ for (i = 0; i < n; ++i) { add_dummy_byte(gfc, tag[i], 1); } return (int) n; /* ok, tag has fixed size of 128 bytes, well below 2GB */ }
static int write_id3v1_tag(lame_t gf, FILE * outf) { unsigned char mp3buffer[128]; size_t imp3, owrite; imp3 = lame_get_id3v1_tag(gf, mp3buffer, sizeof(mp3buffer)); if (imp3 <= 0) { return 0; } if (imp3 > sizeof(mp3buffer)) { error_printf("Error writing ID3v1 tag: buffer too small: buffer size=%d ID3v1 size=%d\n", sizeof(mp3buffer), imp3); return 0; /* not critical */ } owrite = fwrite(mp3buffer, 1, imp3, outf); if (owrite != imp3) { error_printf("Error writing ID3v1 tag \n"); return 1; } return 0; }
media_packet_ptr audio_encoder_queue_lame_impl::receive_packet() { const size_t encodedSamples = sampleRate_; if (m_AudioBuffer->get_samples_count() > encodedSamples) { audio_data_ptr toEncode = m_AudioBuffer->pop_front(encodedSamples); media_packet_ptr mediaPacket = m_Lame->encode( toEncode.get() ); return mediaPacket; } else if ( lastData_) { if ( m_AudioBuffer->get_samples_count() ) { audio_data_ptr toEncode = m_AudioBuffer->pop_front(m_AudioBuffer->get_samples_count()); media_packet_ptr mediaPacket = m_Lame->encode( toEncode.get() ); return mediaPacket; } else { media_packet_ptr mediaPacket = m_Lame->encode( NULL ); unsigned char mp3buffer[LAME_MAXMP3BUFFER]; int imp3 = lame_get_id3v1_tag(m_Lame->lame().get(), mp3buffer, sizeof(mp3buffer)); DT_ASSERT(imp3 <= LAME_MAXMP3BUFFER); m_CodecExtraData->setter()->add_data("ID3V1TAG", mp3buffer, imp3, openmedia::bufferAllocNew); imp3 = lame_get_lametag_frame(m_Lame->lame().get(), mp3buffer, sizeof(mp3buffer)); m_CodecExtraData->setter()->add_data("LAMETAG", mp3buffer, imp3, openmedia::bufferAllocNew); lastData_ = false; return mediaPacket; } } else return media_packet_ptr(); }
static int lame_encoder(lame_global_flags * gf, FILE * outf, int nogap, char *inPath, char *outPath) { unsigned char mp3buffer[LAME_MAXMP3BUFFER]; int Buffer[2][1152]; int iread, imp3, owrite, id3v2_size; imp3 = lame_get_id3v2_tag(gf, mp3buffer, sizeof(mp3buffer)); if ((size_t)imp3 > sizeof(mp3buffer)) { error_printf("Error writing ID3v2 tag: buffer too small: buffer size=%d ID3v2 size=%d\n" , sizeof(mp3buffer) , imp3 ); return 1; } owrite = (int) fwrite(mp3buffer, 1, imp3, outf); if (owrite != imp3) { error_printf("Error writing ID3v2 tag \n"); return 1; } if (flush_write == 1) { fflush(outf); } id3v2_size = imp3; /* encode until we hit eof */ do { /* read in 'iread' samples. The value of iread is 1152 (2010/07/11) on my nexus one. */ iread = get_audio(gf, Buffer); //needed to add a multiplier of 2 to achieve bytes on my G1. 2010/01/09 totBytes += iread *2; rewind(progFile); fprintf(progFile,"%d",totBytes); if (iread >= 0) { //char buf[50]; //sprintf(buf,"%i",iread); //LOGV(buf); /* encode */ imp3 = lame_encode_buffer_int(gf, Buffer[0], Buffer[1], iread, mp3buffer, sizeof(mp3buffer)); /* was our output buffer big enough? */ if (imp3 < 0) { if (imp3 == -1) error_printf("mp3 buffer is not big enough... \n"); else error_printf("mp3 X internal error: error code=%i\n", imp3); return 1; } owrite = (int) fwrite(mp3buffer, 1, imp3, outf); if (owrite != imp3) { error_printf("Error writing mp3 output \n"); return 1; } } if (flush_write == 1) { fflush(outf); } } while (iread > 0 && userCancel != 1); if (nogap) imp3 = lame_encode_flush_nogap(gf, mp3buffer, sizeof(mp3buffer)); /* may return one more mp3 frame */ else imp3 = lame_encode_flush(gf, mp3buffer, sizeof(mp3buffer)); /* may return one more mp3 frame */ if (imp3 < 0) { if (imp3 == -1) error_printf("mp3 buffer is not big enough... \n"); else error_printf("mp3 internal error: error code=%i\n", imp3); return 1; } owrite = (int) fwrite(mp3buffer, 1, imp3, outf); if (owrite != imp3) { error_printf("Error writing mp3 output \n"); return 1; } if (flush_write == 1) { fflush(outf); } imp3 = lame_get_id3v1_tag(gf, mp3buffer, sizeof(mp3buffer)); if ((size_t)imp3 > sizeof(mp3buffer)) { error_printf("Error writing ID3v1 tag: buffer too small: buffer size=%d ID3v1 size=%d\n" , sizeof(mp3buffer) , imp3 ); } else { if (imp3 > 0) { owrite = (int) fwrite(mp3buffer, 1, imp3, outf); if (owrite != imp3) { error_printf("Error writing ID3v1 tag \n"); return 1; } if (flush_write == 1) { fflush(outf); } } } if (silent <= 0) { print_lame_tag_leading_info(gf); } if (fseek(outf, id3v2_size, SEEK_SET) != 0) { error_printf("fatal error: can't update LAME-tag frame!\n"); } else { write_xing_frame(gf, outf); } if (silent <= 0) { print_trailing_info(gf); } return 0; }
static int lame_encoder(lame_global_flags * gf, FILE * outf, int nogap, char *inPath, char *outPath) { unsigned char mp3buffer[LAME_MAXMP3BUFFER]; int Buffer[2][1152]; int iread, imp3, owrite, id3v2_size; encoder_progress_begin(gf, inPath, outPath); imp3 = lame_get_id3v2_tag(gf, mp3buffer, sizeof(mp3buffer)); if ((size_t)imp3 > sizeof(mp3buffer)) { encoder_progress_end(gf); error_printf("Error writing ID3v2 tag: buffer too small: buffer size=%d ID3v2 size=%d\n" , sizeof(mp3buffer) , imp3 ); return 1; } owrite = (int) fwrite(mp3buffer, 1, imp3, outf); if (owrite != imp3) { encoder_progress_end(gf); error_printf("Error writing ID3v2 tag \n"); return 1; } if (flush_write == 1) { fflush(outf); } id3v2_size = imp3; /* encode until we hit eof */ do { /* read in 'iread' samples */ iread = get_audio(gf, Buffer); if (iread >= 0) { encoder_progress(gf); /* encode */ imp3 = lame_encode_buffer_int(gf, Buffer[0], Buffer[1], iread, mp3buffer, sizeof(mp3buffer)); /* was our output buffer big enough? */ if (imp3 < 0) { if (imp3 == -1) error_printf("mp3 buffer is not big enough... \n"); else error_printf("mp3 internal error: error code=%i\n", imp3); return 1; } owrite = (int) fwrite(mp3buffer, 1, imp3, outf); if (owrite != imp3) { error_printf("Error writing mp3 output \n"); return 1; } } if (flush_write == 1) { fflush(outf); } } while (iread > 0); if (nogap) imp3 = lame_encode_flush_nogap(gf, mp3buffer, sizeof(mp3buffer)); /* may return one more mp3 frame */ else imp3 = lame_encode_flush(gf, mp3buffer, sizeof(mp3buffer)); /* may return one more mp3 frame */ if (imp3 < 0) { if (imp3 == -1) error_printf("mp3 buffer is not big enough... \n"); else error_printf("mp3 internal error: error code=%i\n", imp3); return 1; } encoder_progress_end(gf); owrite = (int) fwrite(mp3buffer, 1, imp3, outf); if (owrite != imp3) { error_printf("Error writing mp3 output \n"); return 1; } if (flush_write == 1) { fflush(outf); } imp3 = lame_get_id3v1_tag(gf, mp3buffer, sizeof(mp3buffer)); if ((size_t)imp3 > sizeof(mp3buffer)) { error_printf("Error writing ID3v1 tag: buffer too small: buffer size=%d ID3v1 size=%d\n" , sizeof(mp3buffer) , imp3 ); } else { if (imp3 > 0) { owrite = (int) fwrite(mp3buffer, 1, imp3, outf); if (owrite != imp3) { error_printf("Error writing ID3v1 tag \n"); return 1; } if (flush_write == 1) { fflush(outf); } } } if (silent <= 0) { print_lame_tag_leading_info(gf); } if (fseek(outf, id3v2_size, SEEK_SET) != 0) { error_printf("fatal error: can't update LAME-tag frame!\n"); } else { write_xing_frame(gf, outf); } if (silent <= 0) { print_trailing_info(gf); } return 0; }
int CEncoderLame::encode(const sp<IMediaSource>& pMediaSource_in, const sp<IAudioSink>& pAudioSink_out) { AUTO_LOG(); CHECK_PTR_EXT(m_pGobalFlags, BAD_VALUE); CHECK_PTR_EXT(pMediaSource_in, BAD_VALUE); CHECK_PTR_EXT(pAudioSink_out, BAD_VALUE); sp<MetaData> pMeta = pMediaSource_in->getFormat(); CHECK_PTR_EXT(pMeta, BAD_VALUE); int32_t iChannelNum = 0; bool chk = pMeta->findInt32(kKeyChannelCount, &iChannelNum); CHECK_IS_EXT((true == chk), UNKNOWN_ERROR); int ret = lame_set_num_channels(m_pGobalFlags, iChannelNum); CHECK_IS_EXT((ret == OK), ret); // only support one channel and two channels CHECK_IS_EXT(((1 == iChannelNum) || (2 == iChannelNum)), INVALID_OPERATION); ret = pMediaSource_in->start(); CHECK_IS_EXT((ret == OK), ret); MediaBuffer* pBuf = NULL; while (OK == (pMediaSource_in->read(&pBuf, NULL))) { if (pBuf == NULL) { break; } if ((pBuf->data() == NULL) || (pBuf->range_length() == 0)) { pBuf->release(); pBuf = NULL; continue; } int16_t *pOrg = (int16_t *)((const char *)pBuf->data() + pBuf->range_offset()); ssize_t iSamplesRead = pBuf->range_length() / 2; pOrg += iSamplesRead; iSamplesRead /= iChannelNum; CHECK_NE(iSamplesRead, 0); int iMP3BufSize = 1.25 * iSamplesRead + 7200; short int* pPCMBufL = new short int[iSamplesRead]; short int* pPCMBufR = new short int[iSamplesRead]; unsigned char* pMP3Buf = new unsigned char[iMP3BufSize]; if (iChannelNum == 2) { for (ssize_t i = iSamplesRead; --i >= 0;) { pPCMBufR[i] = *--pOrg; pPCMBufL[i] = *--pOrg; } } else if (iChannelNum == 1) { memset(pPCMBufR, 0, iSamplesRead * sizeof(short int)); for (ssize_t i = iSamplesRead; --i >= 0;) { pPCMBufL[i] = *--pOrg; } } else { // EMPTY } int iOutSize = lame_encode_buffer(m_pGobalFlags, pPCMBufL, pPCMBufR, iSamplesRead, pMP3Buf, iMP3BufSize); int iWriteSize = iOutSize; if (iOutSize > 0) { iWriteSize = pAudioSink_out->write(pMP3Buf, iOutSize); } delete (pMP3Buf); delete (pPCMBufR); delete (pPCMBufL); pBuf->release(); pBuf = NULL; CHECK_IS_EXT((iOutSize == iWriteSize), UNKNOWN_ERROR); } // last frame may remain { unsigned char* pMP3Buf = new unsigned char[LAME_MAXMP3BUFFER]; int iOutSize = lame_encode_flush(m_pGobalFlags, pMP3Buf, sizeof(pMP3Buf)); int iWriteSize = iOutSize; if (iOutSize > 0) { iWriteSize = pAudioSink_out->write(pMP3Buf, iOutSize); } delete (pMP3Buf); CHECK_IS_EXT((iOutSize == iWriteSize), UNKNOWN_ERROR); } // write the tag3v1 { unsigned char* pMP3Buf = new unsigned char[128]; int iOutSize = lame_get_id3v1_tag(m_pGobalFlags, pMP3Buf, sizeof(pMP3Buf)); int iWriteSize = iOutSize; if ((iOutSize > 0) && (((size_t)iOutSize) <= sizeof(pMP3Buf))) { iWriteSize = pAudioSink_out->write(pMP3Buf, iOutSize); } delete (pMP3Buf); CHECK_IS_EXT((iOutSize == iWriteSize), UNKNOWN_ERROR); } RETURN(OK); }