diff options
35 files changed, 198 insertions, 132 deletions
diff --git a/include/media/stagefright/MPEG2TSWriter.h b/include/media/stagefright/MPEG2TSWriter.h index a7c9ecf..2e2922e 100644 --- a/include/media/stagefright/MPEG2TSWriter.h +++ b/include/media/stagefright/MPEG2TSWriter.h @@ -69,6 +69,9 @@ private: int64_t mNumTSPacketsWritten; int64_t mNumTSPacketsBeforeMeta; + int mPATContinuityCounter; + int mPMTContinuityCounter; + uint32_t mCrcTable[256]; void init(); @@ -76,6 +79,8 @@ private: void writeProgramAssociationTable(); void writeProgramMap(); void writeAccessUnit(int32_t sourceIndex, const sp<ABuffer> &buffer); + void initCrcTable(); + uint32_t crc32(const uint8_t *start, size_t length); ssize_t internalWrite(const void *data, size_t size); status_t reset(); diff --git a/include/media/stagefright/MPEG4Writer.h b/include/media/stagefright/MPEG4Writer.h index cd4e129..3596b38 100644 --- a/include/media/stagefright/MPEG4Writer.h +++ b/include/media/stagefright/MPEG4Writer.h @@ -186,6 +186,8 @@ private: void release(); status_t reset(); + static uint32_t getMpeg4Time(); + MPEG4Writer(const MPEG4Writer &); MPEG4Writer &operator=(const MPEG4Writer &); }; diff --git a/libvideoeditor/vss/stagefrightshells/src/VideoEditorBuffer.c b/libvideoeditor/vss/stagefrightshells/src/VideoEditorBuffer.c index 98919d2..f4cfa7c 100755 --- a/libvideoeditor/vss/stagefrightshells/src/VideoEditorBuffer.c +++ b/libvideoeditor/vss/stagefrightshells/src/VideoEditorBuffer.c @@ -53,6 +53,7 @@ M4OSA_ERR VIDEOEDITOR_BUFFER_allocatePool(VIDEOEDITOR_BUFFER_Pool** ppool, { M4OSA_ERR lerr = M4NO_ERROR; VIDEOEDITOR_BUFFER_Pool* pool; + M4OSA_UInt32 index; ALOGV("VIDEOEDITOR_BUFFER_allocatePool : ppool = 0x%x nbBuffers = %d ", ppool, nbBuffers); @@ -79,6 +80,11 @@ M4OSA_ERR VIDEOEDITOR_BUFFER_allocatePool(VIDEOEDITOR_BUFFER_Pool** ppool, goto VIDEOEDITOR_BUFFER_allocatePool_Cleanup; } + for (index = 0; index < nbBuffers; index++) + { + pool->pNXPBuffer[index].pData = M4OSA_NULL; + } + ALOGV("VIDEOEDITOR_BUFFER_allocatePool : Allocating Pool name buffer"); pool->poolName = M4OSA_NULL; pool->poolName = (M4OSA_Char*)M4OSA_32bitAlignedMalloc( diff --git a/media/libstagefright/MPEG2TSWriter.cpp b/media/libstagefright/MPEG2TSWriter.cpp index f702376..217c17a 100644 --- a/media/libstagefright/MPEG2TSWriter.cpp +++ b/media/libstagefright/MPEG2TSWriter.cpp @@ -28,6 +28,7 @@ #include <media/stagefright/MediaSource.h> #include <media/stagefright/MetaData.h> #include <media/stagefright/Utils.h> +#include <arpa/inet.h> #include "include/ESDS.h" @@ -471,7 +472,9 @@ MPEG2TSWriter::MPEG2TSWriter(int fd) mStarted(false), mNumSourcesDone(0), mNumTSPacketsWritten(0), - mNumTSPacketsBeforeMeta(0) { + mNumTSPacketsBeforeMeta(0), + mPATContinuityCounter(0), + mPMTContinuityCounter(0) { init(); } @@ -482,7 +485,9 @@ MPEG2TSWriter::MPEG2TSWriter(const char *filename) mStarted(false), mNumSourcesDone(0), mNumTSPacketsWritten(0), - mNumTSPacketsBeforeMeta(0) { + mNumTSPacketsBeforeMeta(0), + mPATContinuityCounter(0), + mPMTContinuityCounter(0) { init(); } @@ -495,13 +500,17 @@ MPEG2TSWriter::MPEG2TSWriter( mStarted(false), mNumSourcesDone(0), mNumTSPacketsWritten(0), - mNumTSPacketsBeforeMeta(0) { + mNumTSPacketsBeforeMeta(0), + mPATContinuityCounter(0), + mPMTContinuityCounter(0) { init(); } void MPEG2TSWriter::init() { CHECK(mFile != NULL || mWriteFunc != NULL); + initCrcTable(); + mLooper = new ALooper; mLooper->setName("MPEG2TSWriter"); @@ -729,11 +738,16 @@ void MPEG2TSWriter::writeProgramAssociationTable() { }; sp<ABuffer> buffer = new ABuffer(188); - memset(buffer->data(), 0, buffer->size()); + memset(buffer->data(), 0xff, buffer->size()); memcpy(buffer->data(), kData, sizeof(kData)); - static const unsigned kContinuityCounter = 5; - buffer->data()[3] |= kContinuityCounter; + if (++mPATContinuityCounter == 16) { + mPATContinuityCounter = 0; + } + buffer->data()[3] |= mPATContinuityCounter; + + uint32_t crc = htonl(crc32(&buffer->data()[5], 12)); + memcpy(&buffer->data()[17], &crc, sizeof(crc)); CHECK_EQ(internalWrite(buffer->data(), buffer->size()), buffer->size()); } @@ -781,11 +795,13 @@ void MPEG2TSWriter::writeProgramMap() { }; sp<ABuffer> buffer = new ABuffer(188); - memset(buffer->data(), 0, buffer->size()); + memset(buffer->data(), 0xff, buffer->size()); memcpy(buffer->data(), kData, sizeof(kData)); - static const unsigned kContinuityCounter = 5; - buffer->data()[3] |= kContinuityCounter; + if (++mPMTContinuityCounter == 16) { + mPMTContinuityCounter = 0; + } + buffer->data()[3] |= mPMTContinuityCounter; size_t section_length = 5 * mSources.size() + 4 + 9; buffer->data()[6] |= section_length >> 8; @@ -806,10 +822,8 @@ void MPEG2TSWriter::writeProgramMap() { *ptr++ = 0x00; } - *ptr++ = 0x00; - *ptr++ = 0x00; - *ptr++ = 0x00; - *ptr++ = 0x00; + uint32_t crc = htonl(crc32(&buffer->data()[5], 12+mSources.size()*5)); + memcpy(&buffer->data()[17+mSources.size()*5], &crc, sizeof(crc)); CHECK_EQ(internalWrite(buffer->data(), buffer->size()), buffer->size()); } @@ -822,7 +836,7 @@ void MPEG2TSWriter::writeAccessUnit( // transport_priority = b0 // PID = b0 0001 1110 ???? (13 bits) [0x1e0 + 1 + sourceIndex] // transport_scrambling_control = b00 - // adaptation_field_control = b01 (no adaptation field, payload only) + // adaptation_field_control = b?? // continuity_counter = b???? // -- payload follows // packet_startcode_prefix = 0x000001 @@ -852,7 +866,7 @@ void MPEG2TSWriter::writeAccessUnit( // the first fragment of "buffer" follows sp<ABuffer> buffer = new ABuffer(188); - memset(buffer->data(), 0, buffer->size()); + memset(buffer->data(), 0xff, buffer->size()); const unsigned PID = 0x1e0 + sourceIndex + 1; @@ -870,6 +884,7 @@ void MPEG2TSWriter::writeAccessUnit( uint32_t PTS = (timeUs * 9ll) / 100ll; size_t PES_packet_length = accessUnit->size() + 8; + bool padding = (accessUnit->size() < (188 - 18)); if (PES_packet_length >= 65536) { // This really should only happen for video. @@ -883,7 +898,15 @@ void MPEG2TSWriter::writeAccessUnit( *ptr++ = 0x47; *ptr++ = 0x40 | (PID >> 8); *ptr++ = PID & 0xff; - *ptr++ = 0x10 | continuity_counter; + *ptr++ = (padding ? 0x30 : 0x10) | continuity_counter; + if (padding) { + int paddingSize = 188 - accessUnit->size() - 18; + *ptr++ = paddingSize - 1; + if (paddingSize >= 2) { + *ptr++ = 0x00; + ptr += paddingSize - 2; + } + } *ptr++ = 0x00; *ptr++ = 0x00; *ptr++ = 0x01; @@ -911,6 +934,7 @@ void MPEG2TSWriter::writeAccessUnit( size_t offset = copy; while (offset < accessUnit->size()) { + bool lastAccessUnit = ((accessUnit->size() - offset) < 183); // for subsequent fragments of "buffer": // 0x47 // transport_error_indicator = b0 @@ -918,11 +942,11 @@ void MPEG2TSWriter::writeAccessUnit( // transport_priority = b0 // PID = b0 0001 1110 ???? (13 bits) [0x1e0 + 1 + sourceIndex] // transport_scrambling_control = b00 - // adaptation_field_control = b01 (no adaptation field, payload only) + // adaptation_field_control = b?? // continuity_counter = b???? // the fragment of "buffer" follows. - memset(buffer->data(), 0, buffer->size()); + memset(buffer->data(), 0xff, buffer->size()); const unsigned continuity_counter = mSources.editItemAt(sourceIndex)->incrementContinuityCounter(); @@ -931,7 +955,18 @@ void MPEG2TSWriter::writeAccessUnit( *ptr++ = 0x47; *ptr++ = 0x00 | (PID >> 8); *ptr++ = PID & 0xff; - *ptr++ = 0x10 | continuity_counter; + *ptr++ = (lastAccessUnit ? 0x30 : 0x10) | continuity_counter; + + if (lastAccessUnit) { + // Pad packet using an adaptation field + // Adaptation header all to 0 execpt size + uint8_t paddingSize = (uint8_t)184 - (accessUnit->size() - offset); + *ptr++ = paddingSize - 1; + if (paddingSize >= 2) { + *ptr++ = 0x00; + ptr += paddingSize - 2; + } + } size_t sizeLeft = buffer->data() + buffer->size() - ptr; size_t copy = accessUnit->size() - offset; @@ -956,6 +991,33 @@ void MPEG2TSWriter::writeTS() { } } +void MPEG2TSWriter::initCrcTable() { + uint32_t poly = 0x04C11DB7; + + for (int i = 0; i < 256; i++) { + uint32_t crc = i << 24; + for (int j = 0; j < 8; j++) { + crc = (crc << 1) ^ ((crc & 0x80000000) ? (poly) : 0); + } + mCrcTable[i] = crc; + } +} + +/** + * Compute CRC32 checksum for buffer starting at offset start and for length + * bytes. + */ +uint32_t MPEG2TSWriter::crc32(const uint8_t *p_start, size_t length) { + uint32_t crc = 0xFFFFFFFF; + const uint8_t *p; + + for (p = p_start; p < p_start + length; p++) { + crc = (crc << 8) ^ mCrcTable[((crc >> 24) ^ *p) & 0xFF]; + } + + return crc; +} + ssize_t MPEG2TSWriter::internalWrite(const void *data, size_t size) { if (mFile != NULL) { return fwrite(data, 1, size, mFile); diff --git a/media/libstagefright/MPEG4Writer.cpp b/media/libstagefright/MPEG4Writer.cpp index 755b502..6108298 100755 --- a/media/libstagefright/MPEG4Writer.cpp +++ b/media/libstagefright/MPEG4Writer.cpp @@ -236,11 +236,11 @@ private: void writeDrefBox(); void writeDinfBox(); void writeDamrBox(); - void writeMdhdBox(time_t now); + void writeMdhdBox(uint32_t now); void writeSmhdBox(); void writeVmhdBox(); void writeHdlrBox(); - void writeTkhdBox(time_t now); + void writeTkhdBox(uint32_t now); void writeMp4aEsdsBox(); void writeMp4vEsdsBox(); void writeAudioFourCCBox(); @@ -723,8 +723,17 @@ status_t MPEG4Writer::reset() { return err; } -void MPEG4Writer::writeMvhdBox(int64_t durationUs) { +uint32_t MPEG4Writer::getMpeg4Time() { time_t now = time(NULL); + // MP4 file uses time counting seconds since midnight, Jan. 1, 1904 + // while time function returns Unix epoch values which starts + // at 1970-01-01. Lets add the number of seconds between them + uint32_t mpeg4Time = now + (66 * 365 + 17) * (24 * 60 * 60); + return mpeg4Time; +} + +void MPEG4Writer::writeMvhdBox(int64_t durationUs) { + uint32_t now = getMpeg4Time(); beginBox("mvhd"); writeInt32(0); // version=0, flags=0 writeInt32(now); // creation time @@ -2357,7 +2366,7 @@ void MPEG4Writer::Track::writeTrackHeader(bool use32BitOffset) { ALOGV("%s track time scale: %d", mIsAudio? "Audio": "Video", mTimeScale); - time_t now = time(NULL); + uint32_t now = getMpeg4Time(); mOwner->beginBox("trak"); writeTkhdBox(now); mOwner->beginBox("mdia"); @@ -2570,7 +2579,7 @@ void MPEG4Writer::Track::writeMp4vEsdsBox() { mOwner->endBox(); // esds } -void MPEG4Writer::Track::writeTkhdBox(time_t now) { +void MPEG4Writer::Track::writeTkhdBox(uint32_t now) { mOwner->beginBox("tkhd"); // Flags = 7 to indicate that the track is enabled, and // part of the presentation @@ -2639,7 +2648,7 @@ void MPEG4Writer::Track::writeHdlrBox() { mOwner->endBox(); } -void MPEG4Writer::Track::writeMdhdBox(time_t now) { +void MPEG4Writer::Track::writeMdhdBox(uint32_t now) { int64_t trakDurationUs = getDurationUs(); mOwner->beginBox("mdhd"); mOwner->writeInt32(0); // version=0, flags=0 diff --git a/media/libstagefright/MediaCodec.cpp b/media/libstagefright/MediaCodec.cpp index ff71170..d28322f 100644 --- a/media/libstagefright/MediaCodec.cpp +++ b/media/libstagefright/MediaCodec.cpp @@ -1118,7 +1118,8 @@ void MediaCodec::onMessageReceived(const sp<AMessage> &msg) { CHECK(msg->senderAwaitsResponse(&replyID)); if ((mState != STARTED && mState != FLUSHING) - || (mFlags & kFlagStickyError)) { + || (mFlags & kFlagStickyError) + || mOutputFormat == NULL) { sp<AMessage> response = new AMessage; response->setInt32("err", INVALID_OPERATION); diff --git a/media/libstagefright/codecs/aacenc/Android.mk b/media/libstagefright/codecs/aacenc/Android.mk index 1c342c8..820734d 100644 --- a/media/libstagefright/codecs/aacenc/Android.mk +++ b/media/libstagefright/codecs/aacenc/Android.mk @@ -71,8 +71,6 @@ LOCAL_C_INCLUDES := \ $(LOCAL_PATH)/inc \ $(LOCAL_PATH)/basic_op -LOCAL_CFLAGS := $(VO_CFLAGS) - ifeq ($(VOTT), v5) LOCAL_CFLAGS += -DARMV5E -DARM_INASM -DARMV5_INASM LOCAL_C_INCLUDES += $(LOCAL_PATH)/src/asm/ARMV5E diff --git a/media/libstagefright/codecs/aacenc/SampleCode/Android.mk b/media/libstagefright/codecs/aacenc/SampleCode/Android.mk index ba3f4d2..01016e7 100644 --- a/media/libstagefright/codecs/aacenc/SampleCode/Android.mk +++ b/media/libstagefright/codecs/aacenc/SampleCode/Android.mk @@ -5,8 +5,6 @@ LOCAL_SRC_FILES := \ AAC_E_SAMPLES.c \ ../../common/cmnMemory.c -LOCAL_CFLAGS += $(VO_CFLAGS) - LOCAL_MODULE_TAGS := debug LOCAL_MODULE := AACEncTest diff --git a/media/libstagefright/codecs/amrnb/dec/src/post_pro.cpp b/media/libstagefright/codecs/amrnb/dec/src/post_pro.cpp index ce31793..8201e54 100644 --- a/media/libstagefright/codecs/amrnb/dec/src/post_pro.cpp +++ b/media/libstagefright/codecs/amrnb/dec/src/post_pro.cpp @@ -376,7 +376,7 @@ void Post_Process( L_tmp += ((Word32) st->x0) * c_b0; L_tmp += ((Word32) st->x1) * c_b1; L_tmp += ((Word32) x2) * c_b2; - L_tmp <<= 3; + L_tmp = L_shl(L_tmp, 3, pOverflow); /* Multiplication by two of output speech with saturation. */ diff --git a/media/libstagefright/codecs/amrnb/enc/src/g_pitch.cpp b/media/libstagefright/codecs/amrnb/enc/src/g_pitch.cpp index f6235ad..5b80e2a 100644 --- a/media/libstagefright/codecs/amrnb/enc/src/g_pitch.cpp +++ b/media/libstagefright/codecs/amrnb/enc/src/g_pitch.cpp @@ -400,8 +400,9 @@ Word16 G_pitch( /* o : Gain of pitch lag saturated to 1.2 */ } else { - s = 0; /* Avoid case of all zeros */ + s = 0; /* re-initialize calculations */ p_y1 = &y1[0]; + p_xn = &xn[0]; for (i = (L_subfr >> 2); i != 0; i--) { L_temp = (Word32)(*(p_y1++) >> 2); diff --git a/media/libstagefright/codecs/amrwbenc/Android.mk b/media/libstagefright/codecs/amrwbenc/Android.mk index 71a60d3..edfd7b7 100644 --- a/media/libstagefright/codecs/amrwbenc/Android.mk +++ b/media/libstagefright/codecs/amrwbenc/Android.mk @@ -101,8 +101,6 @@ LOCAL_C_INCLUDES := \ $(LOCAL_PATH)/src \ $(LOCAL_PATH)/inc -LOCAL_CFLAGS := $(VO_CFLAGS) - ifeq ($(VOTT), v5) LOCAL_CFLAGS += -DARM -DASM_OPT LOCAL_C_INCLUDES += $(LOCAL_PATH)/src/asm/ARMV5E diff --git a/media/libstagefright/codecs/amrwbenc/SampleCode/Android.mk b/media/libstagefright/codecs/amrwbenc/SampleCode/Android.mk index 85ddceb..db34d08 100644 --- a/media/libstagefright/codecs/amrwbenc/SampleCode/Android.mk +++ b/media/libstagefright/codecs/amrwbenc/SampleCode/Android.mk @@ -10,7 +10,7 @@ LOCAL_MODULE := AMRWBEncTest LOCAL_ARM_MODE := arm -LOCAL_CFLAGS := $(VO_CFLAGS) +LOCAL_CFLAGS := -DLINUX LOCAL_SHARED_LIBRARIES := \ libstagefright \ diff --git a/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/Filt_6k_7k_opt.s b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/Filt_6k_7k_opt.s index 856ada8..8451195 100644 --- a/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/Filt_6k_7k_opt.s +++ b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/Filt_6k_7k_opt.s @@ -43,7 +43,9 @@ Filt_6k_7k_asm: MOV r2, #30 @ L_FIR - 1 BL voAWB_Copy @ memcpy(x, mem, (L_FIR - 1)<<1) - LDR r10, Lable1 @ get fir_7k address + ADR r3, Lable1 @ get fir_7k address + LDR r10, [r3] + ADD r10, r3 MOV r14, #0 MOV r3, r8 @ change myMemCopy to Copy, due to Copy will change r3 content @@ -178,7 +180,7 @@ Filt_6k_7k_end: LDMFD r13!, {r4 - r12, r15} Lable1: - .word fir_6k_7k + .word fir_6k_7k-Lable1 @ENDFUNC .END diff --git a/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/Filt_6k_7k_neon.s b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/Filt_6k_7k_neon.s index 14ba828..fc42a03 100644 --- a/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/Filt_6k_7k_neon.s +++ b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/Filt_6k_7k_neon.s @@ -49,7 +49,9 @@ Filt_6k_7k_asm: - LDR r10, Lable1 @ get fir_7k address + ADR r3, Lable1 @ get fir_7k address + LDR r10, [r3] + ADD r10, r3 MOV r3, r8 @ change myMemCopy to Copy, due to Copy will change r3 content ADD r6, r13, #60 @ get x[L_FIR - 1] address MOV r7, r3 @ get signal[i] @@ -221,7 +223,7 @@ Filt_6k_7k_end: LDMFD r13!, {r0 - r12, r15} Lable1: - .word fir_6k_7k + .word fir_6k_7k-Lable1 @ENDFUNC .END diff --git a/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/pred_lt4_1_neon.s b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/pred_lt4_1_neon.s index 6b782cb..8d2aaf2 100644 --- a/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/pred_lt4_1_neon.s +++ b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/pred_lt4_1_neon.s @@ -40,7 +40,9 @@ pred_lt4_asm: ADDLT r2, r2, #4 @ frac += UP_SAMP SUBLT r4, r4, #2 @ x-- - LDR r11, Lable1 + ADR r8, Lable1 + LDR r11, [r8] + ADD r11, r8 RSB r2, r2, #3 @ k = UP_SAMP - 1 - frac MOV r8, #0 @ j = 0 ADD r11, r11, r2, LSL #6 @ get inter4_2[k][] @@ -94,7 +96,7 @@ pred_lt4_end: LDMFD r13!, {r4 - r12, r15} Lable1: - .word inter4_2 + .word inter4_2-Lable1 @ENDFUNC .END diff --git a/media/libstagefright/codecs/avc/common/include/avcapi_common.h b/media/libstagefright/codecs/avc/common/include/avcapi_common.h index 3331689..abffe6e 100644 --- a/media/libstagefright/codecs/avc/common/include/avcapi_common.h +++ b/media/libstagefright/codecs/avc/common/include/avcapi_common.h @@ -213,15 +213,15 @@ typedef void (*FuctionType_FrameUnbind)(void *userData, int); memory usage. \param "size" "Size of requested memory in bytes." \param "attribute" "Some value specifying types, priority, etc. of the memory." -\return "The address of the allocated memory casted to int" +\return "The address of the allocated, zero-initialized memory" */ -typedef int (*FunctionType_Malloc)(void *userData, int32 size, int attribute); +typedef void* (*FunctionType_Malloc)(void *userData, int32 size, int attribute); /** Function pointer to free -\param "mem" "Pointer to the memory to be freed casted to int" +\param "mem" "Pointer to the memory to be freed" \return "void" */ -typedef void (*FunctionType_Free)(void *userData, int mem); +typedef void (*FunctionType_Free)(void *userData, void *mem); /** Debug logging information is returned to the application thru this function. \param "type" "Type of logging message, see definition of AVCLogType." diff --git a/media/libstagefright/codecs/avc/common/src/dpb.cpp b/media/libstagefright/codecs/avc/common/src/dpb.cpp index 2c4c7da..b5d0dfe 100644 --- a/media/libstagefright/codecs/avc/common/src/dpb.cpp +++ b/media/libstagefright/codecs/avc/common/src/dpb.cpp @@ -152,7 +152,7 @@ OSCL_EXPORT_REF AVCStatus AVCConfigureSequence(AVCHandle *avcHandle, AVCCommonOb framesize = (FrameHeightInMbs * PicWidthInMbs); if (video->mblock) { - avcHandle->CBAVC_Free(userData, (uint32)video->mblock); + avcHandle->CBAVC_Free(userData, video->mblock); video->mblock = NULL; } video->mblock = (AVCMacroblock*) avcHandle->CBAVC_Malloc(userData, sizeof(AVCMacroblock) * framesize, DEFAULT_ATTR); @@ -187,7 +187,7 @@ OSCL_EXPORT_REF AVCStatus AVCConfigureSequence(AVCHandle *avcHandle, AVCCommonOb if (video->MbToSliceGroupMap) { - avcHandle->CBAVC_Free(userData, (uint32)video->MbToSliceGroupMap); + avcHandle->CBAVC_Free(userData, video->MbToSliceGroupMap); video->MbToSliceGroupMap = NULL; } video->MbToSliceGroupMap = (int*) avcHandle->CBAVC_Malloc(userData, sizeof(uint) * PicSizeInMapUnits * 2, 7/*DEFAULT_ATTR*/); @@ -212,14 +212,14 @@ OSCL_EXPORT_REF AVCStatus CleanUpDPB(AVCHandle *avcHandle, AVCCommonObj *video) { if (dpb->fs[ii] != NULL) { - avcHandle->CBAVC_Free(userData, (int)dpb->fs[ii]); + avcHandle->CBAVC_Free(userData, dpb->fs[ii]); dpb->fs[ii] = NULL; } } #ifndef PV_MEMORY_POOL if (dpb->decoded_picture_buffer) { - avcHandle->CBAVC_Free(userData, (int)dpb->decoded_picture_buffer); + avcHandle->CBAVC_Free(userData, dpb->decoded_picture_buffer); dpb->decoded_picture_buffer = NULL; } #endif diff --git a/media/libstagefright/codecs/avc/enc/Android.mk b/media/libstagefright/codecs/avc/enc/Android.mk index 48923cf..3678329 100644 --- a/media/libstagefright/codecs/avc/enc/Android.mk +++ b/media/libstagefright/codecs/avc/enc/Android.mk @@ -28,7 +28,6 @@ LOCAL_C_INCLUDES := \ $(TOP)/frameworks/native/include/media/openmax LOCAL_CFLAGS := \ - -D__arm__ \ -DOSCL_IMPORT_REF= -DOSCL_UNUSED_ARG= -DOSCL_EXPORT_REF= include $(BUILD_STATIC_LIBRARY) diff --git a/media/libstagefright/codecs/avc/enc/SoftAVCEncoder.cpp b/media/libstagefright/codecs/avc/enc/SoftAVCEncoder.cpp index c6f658d..259562b 100644 --- a/media/libstagefright/codecs/avc/enc/SoftAVCEncoder.cpp +++ b/media/libstagefright/codecs/avc/enc/SoftAVCEncoder.cpp @@ -131,13 +131,16 @@ inline static void ConvertYUV420SemiPlanarToYUV420Planar( } } -static int32_t MallocWrapper( +static void* MallocWrapper( void *userData, int32_t size, int32_t attrs) { - return reinterpret_cast<int32_t>(malloc(size)); + void *ptr = malloc(size); + if (ptr) + memset(ptr, 0, size); + return ptr; } -static void FreeWrapper(void *userData, int32_t ptr) { - free(reinterpret_cast<void *>(ptr)); +static void FreeWrapper(void *userData, void* ptr) { + free(ptr); } static int32_t DpbAllocWrapper(void *userData, diff --git a/media/libstagefright/codecs/avc/enc/src/avcenc_api.cpp b/media/libstagefright/codecs/avc/enc/src/avcenc_api.cpp index 6d43142..cf14e10 100644 --- a/media/libstagefright/codecs/avc/enc/src/avcenc_api.cpp +++ b/media/libstagefright/codecs/avc/enc/src/avcenc_api.cpp @@ -77,7 +77,6 @@ OSCL_EXPORT_REF AVCEnc_Status PVAVCEncInitialize(AVCHandle *avcHandle, AVCEncPar } encvid = (AVCEncObject*) avcHandle->AVCObject; - memset(encvid, 0, sizeof(AVCEncObject)); /* reset everything */ encvid->enc_state = AVCEnc_Initializing; @@ -90,7 +89,6 @@ OSCL_EXPORT_REF AVCEnc_Status PVAVCEncInitialize(AVCHandle *avcHandle, AVCEncPar } video = encvid->common; - memset(video, 0, sizeof(AVCCommonObj)); /* allocate bitstream structure */ encvid->bitstream = (AVCEncBitstream*) avcHandle->CBAVC_Malloc(userData, sizeof(AVCEncBitstream), DEFAULT_ATTR); @@ -106,7 +104,6 @@ OSCL_EXPORT_REF AVCEnc_Status PVAVCEncInitialize(AVCHandle *avcHandle, AVCEncPar { return AVCENC_MEMORY_FAIL; } - memset(video->currSeqParams, 0, sizeof(AVCSeqParamSet)); /* allocate picture parameter set structure */ video->currPicParams = (AVCPicParamSet*) avcHandle->CBAVC_Malloc(userData, sizeof(AVCPicParamSet), DEFAULT_ATTR); @@ -114,7 +111,6 @@ OSCL_EXPORT_REF AVCEnc_Status PVAVCEncInitialize(AVCHandle *avcHandle, AVCEncPar { return AVCENC_MEMORY_FAIL; } - memset(video->currPicParams, 0, sizeof(AVCPicParamSet)); /* allocate slice header structure */ video->sliceHdr = (AVCSliceHeader*) avcHandle->CBAVC_Malloc(userData, sizeof(AVCSliceHeader), DEFAULT_ATTR); @@ -122,7 +118,6 @@ OSCL_EXPORT_REF AVCEnc_Status PVAVCEncInitialize(AVCHandle *avcHandle, AVCEncPar { return AVCENC_MEMORY_FAIL; } - memset(video->sliceHdr, 0, sizeof(AVCSliceHeader)); /* allocate encoded picture buffer structure*/ video->decPicBuf = (AVCDecPicBuffer*) avcHandle->CBAVC_Malloc(userData, sizeof(AVCDecPicBuffer), DEFAULT_ATTR); @@ -130,7 +125,6 @@ OSCL_EXPORT_REF AVCEnc_Status PVAVCEncInitialize(AVCHandle *avcHandle, AVCEncPar { return AVCENC_MEMORY_FAIL; } - memset(video->decPicBuf, 0, sizeof(AVCDecPicBuffer)); /* allocate rate control structure */ encvid->rateCtrl = (AVCRateControl*) avcHandle->CBAVC_Malloc(userData, sizeof(AVCRateControl), DEFAULT_ATTR); @@ -138,7 +132,6 @@ OSCL_EXPORT_REF AVCEnc_Status PVAVCEncInitialize(AVCHandle *avcHandle, AVCEncPar { return AVCENC_MEMORY_FAIL; } - memset(encvid->rateCtrl, 0, sizeof(AVCRateControl)); /* reset frame list, not really needed */ video->currPic = NULL; @@ -194,7 +187,6 @@ OSCL_EXPORT_REF AVCEnc_Status PVAVCEncInitialize(AVCHandle *avcHandle, AVCEncPar { return AVCENC_MEMORY_FAIL; } - memset(encvid->mot16x16, 0, sizeof(AVCMV)*framesize); encvid->intraSearch = (uint8*) avcHandle->CBAVC_Malloc(userData, sizeof(uint8) * framesize, DEFAULT_ATTR); if (encvid->intraSearch == NULL) @@ -610,32 +602,32 @@ OSCL_EXPORT_REF void PVAVCCleanUpEncoder(AVCHandle *avcHandle) if (encvid->functionPointer != NULL) { - avcHandle->CBAVC_Free(userData, (int)encvid->functionPointer); + avcHandle->CBAVC_Free(userData, encvid->functionPointer); } if (encvid->min_cost) { - avcHandle->CBAVC_Free(userData, (int)encvid->min_cost); + avcHandle->CBAVC_Free(userData, encvid->min_cost); } if (encvid->intraSearch) { - avcHandle->CBAVC_Free(userData, (int)encvid->intraSearch); + avcHandle->CBAVC_Free(userData, encvid->intraSearch); } if (encvid->mot16x16) { - avcHandle->CBAVC_Free(userData, (int)encvid->mot16x16); + avcHandle->CBAVC_Free(userData, encvid->mot16x16); } if (encvid->rateCtrl) { - avcHandle->CBAVC_Free(userData, (int)encvid->rateCtrl); + avcHandle->CBAVC_Free(userData, encvid->rateCtrl); } if (encvid->overrunBuffer) { - avcHandle->CBAVC_Free(userData, (int)encvid->overrunBuffer); + avcHandle->CBAVC_Free(userData, encvid->overrunBuffer); } video = encvid->common; @@ -643,45 +635,45 @@ OSCL_EXPORT_REF void PVAVCCleanUpEncoder(AVCHandle *avcHandle) { if (video->MbToSliceGroupMap) { - avcHandle->CBAVC_Free(userData, (int)video->MbToSliceGroupMap); + avcHandle->CBAVC_Free(userData, video->MbToSliceGroupMap); } if (video->mblock != NULL) { - avcHandle->CBAVC_Free(userData, (int)video->mblock); + avcHandle->CBAVC_Free(userData, video->mblock); } if (video->decPicBuf != NULL) { CleanUpDPB(avcHandle, video); - avcHandle->CBAVC_Free(userData, (int)video->decPicBuf); + avcHandle->CBAVC_Free(userData, video->decPicBuf); } if (video->sliceHdr != NULL) { - avcHandle->CBAVC_Free(userData, (int)video->sliceHdr); + avcHandle->CBAVC_Free(userData, video->sliceHdr); } if (video->currPicParams != NULL) { if (video->currPicParams->slice_group_id) { - avcHandle->CBAVC_Free(userData, (int)video->currPicParams->slice_group_id); + avcHandle->CBAVC_Free(userData, video->currPicParams->slice_group_id); } - avcHandle->CBAVC_Free(userData, (int)video->currPicParams); + avcHandle->CBAVC_Free(userData, video->currPicParams); } if (video->currSeqParams != NULL) { - avcHandle->CBAVC_Free(userData, (int)video->currSeqParams); + avcHandle->CBAVC_Free(userData, video->currSeqParams); } if (encvid->bitstream != NULL) { - avcHandle->CBAVC_Free(userData, (int)encvid->bitstream); + avcHandle->CBAVC_Free(userData, encvid->bitstream); } if (video != NULL) { - avcHandle->CBAVC_Free(userData, (int)video); + avcHandle->CBAVC_Free(userData, video); } } - avcHandle->CBAVC_Free(userData, (int)encvid); + avcHandle->CBAVC_Free(userData, encvid); avcHandle->AVCObject = NULL; } diff --git a/media/libstagefright/codecs/avc/enc/src/bitstream_io.cpp b/media/libstagefright/codecs/avc/enc/src/bitstream_io.cpp index 75ab514..0e3037f 100644 --- a/media/libstagefright/codecs/avc/enc/src/bitstream_io.cpp +++ b/media/libstagefright/codecs/avc/enc/src/bitstream_io.cpp @@ -275,8 +275,8 @@ AVCEnc_Status AVCBitstreamUseOverrunBuffer(AVCEncBitstream* stream, int numExtra // allocate new overrun Buffer if (encvid->overrunBuffer) { - encvid->avcHandle->CBAVC_Free((uint32*)encvid->avcHandle->userData, - (int)encvid->overrunBuffer); + encvid->avcHandle->CBAVC_Free(encvid->avcHandle->userData, + encvid->overrunBuffer); } encvid->oBSize = stream->oBSize; @@ -314,8 +314,8 @@ AVCEnc_Status AVCBitstreamUseOverrunBuffer(AVCEncBitstream* stream, int numExtra // copy from the old buffer to new buffer memcpy(encvid->overrunBuffer, stream->overrunBuffer, stream->write_pos); // free old buffer - encvid->avcHandle->CBAVC_Free((uint32*)encvid->avcHandle->userData, - (int)stream->overrunBuffer); + encvid->avcHandle->CBAVC_Free(encvid->avcHandle->userData, + stream->overrunBuffer); // assign pointer to new buffer stream->overrunBuffer = encvid->overrunBuffer; diff --git a/media/libstagefright/codecs/avc/enc/src/motion_est.cpp b/media/libstagefright/codecs/avc/enc/src/motion_est.cpp index f650ef9..00c56c8 100644 --- a/media/libstagefright/codecs/avc/enc/src/motion_est.cpp +++ b/media/libstagefright/codecs/avc/enc/src/motion_est.cpp @@ -176,7 +176,7 @@ void CleanMotionSearchModule(AVCHandle *avcHandle) if (encvid->mvbits_array) { - avcHandle->CBAVC_Free(avcHandle->userData, (int)(encvid->mvbits_array)); + avcHandle->CBAVC_Free(avcHandle->userData, encvid->mvbits_array); encvid->mvbits = NULL; } diff --git a/media/libstagefright/codecs/avc/enc/src/rate_control.cpp b/media/libstagefright/codecs/avc/enc/src/rate_control.cpp index 15b55fb..aa13873 100644 --- a/media/libstagefright/codecs/avc/enc/src/rate_control.cpp +++ b/media/libstagefright/codecs/avc/enc/src/rate_control.cpp @@ -190,7 +190,6 @@ AVCEnc_Status InitRateControlModule(AVCHandle *avcHandle) { goto CLEANUP_RC; } - memset(rateCtrl->pMP, 0, sizeof(MultiPass)); rateCtrl->pMP->encoded_frames = -1; /* forget about the very first I frame */ /* RDInfo **pRDSamples */ @@ -207,7 +206,6 @@ AVCEnc_Status InitRateControlModule(AVCHandle *avcHandle) { goto CLEANUP_RC; } - for (j = 0; j < 32; j++) memset(&(rateCtrl->pMP->pRDSamples[i][j]), 0, sizeof(RDInfo)); } rateCtrl->pMP->frameRange = (int)(rateCtrl->frame_rate * 1.0); /* 1.0s time frame*/ rateCtrl->pMP->frameRange = AVC_MAX(rateCtrl->pMP->frameRange, 5); @@ -300,7 +298,7 @@ void CleanupRateControlModule(AVCHandle *avcHandle) if (rateCtrl->MADofMB) { - avcHandle->CBAVC_Free(avcHandle->userData, (int)(rateCtrl->MADofMB)); + avcHandle->CBAVC_Free(avcHandle->userData, rateCtrl->MADofMB); } if (rateCtrl->pMP) @@ -311,12 +309,12 @@ void CleanupRateControlModule(AVCHandle *avcHandle) { if (rateCtrl->pMP->pRDSamples[i]) { - avcHandle->CBAVC_Free(avcHandle->userData, (int)rateCtrl->pMP->pRDSamples[i]); + avcHandle->CBAVC_Free(avcHandle->userData, rateCtrl->pMP->pRDSamples[i]); } } - avcHandle->CBAVC_Free(avcHandle->userData, (int)rateCtrl->pMP->pRDSamples); + avcHandle->CBAVC_Free(avcHandle->userData, rateCtrl->pMP->pRDSamples); } - avcHandle->CBAVC_Free(avcHandle->userData, (int)(rateCtrl->pMP)); + avcHandle->CBAVC_Free(avcHandle->userData, rateCtrl->pMP); } return ; diff --git a/media/libstagefright/codecs/avc/enc/src/sad_halfpel_inline.h b/media/libstagefright/codecs/avc/enc/src/sad_halfpel_inline.h index 3a21647..bb4a510 100644 --- a/media/libstagefright/codecs/avc/enc/src/sad_halfpel_inline.h +++ b/media/libstagefright/codecs/avc/enc/src/sad_halfpel_inline.h @@ -24,7 +24,10 @@ extern "C" { #endif -#if defined(__GNUC__) && defined(__arm__) /* ARM GNU COMPILER */ +/* Intentionally not using the gcc asm version, since it (if fixed so + * as to not crash - the current register constraints are faulty) is + * slightly slower than the plain C version on modern GCC versions. */ +#if !defined(__CC_ARM) /* Generic C version */ __inline int32 INTERP1_SUB_SAD(int32 sad, int32 tmp, int32 tmp2) { diff --git a/media/libstagefright/codecs/avc/enc/src/sad_inline.h b/media/libstagefright/codecs/avc/enc/src/sad_inline.h index 3f18483..f6c3554 100644 --- a/media/libstagefright/codecs/avc/enc/src/sad_inline.h +++ b/media/libstagefright/codecs/avc/enc/src/sad_inline.h @@ -23,7 +23,10 @@ extern "C" { #endif -#if defined(__GNUC__) && defined(__arm__) /* ARM GNU COMPILER */ +/* Intentionally not using the gcc asm version, since it (if fixed so + * as to not crash - the current register constraints are faulty) is + * slightly slower than the plain C version on modern GCC versions. */ +#if !defined(__CC_ARM) /* Generic C version */ __inline int32 SUB_SAD(int32 sad, int32 tmp, int32 tmp2) { diff --git a/media/libstagefright/codecs/avc/enc/src/sad_mb_offset.h b/media/libstagefright/codecs/avc/enc/src/sad_mb_offset.h index d5d4a42..8a7fe22 100644 --- a/media/libstagefright/codecs/avc/enc/src/sad_mb_offset.h +++ b/media/libstagefright/codecs/avc/enc/src/sad_mb_offset.h @@ -16,7 +16,10 @@ * ------------------------------------------------------------------- */ -#if defined(__GNUC__) && defined(__arm__) /* ARM GNU COMPILER */ +/* Intentionally not using the gcc asm version, since it (if fixed so + * as to not crash - the current register constraints are faulty) is + * slightly slower than the plain C version on modern GCC versions. */ +#if !defined(__CC_ARM) /* Generic C version */ #if (NUMBER==3) __inline int32 sad_mb_offset3(uint8 *ref, uint8 *blk, int lx, int dmin) @@ -296,9 +299,9 @@ __asm__ volatile("LDR %0, [%1], #16": "=&r"(x12), "=r"(blk)); #if (NUMBER==3) goto LOOP_SAD3; #elif (NUMBER==2) -goto LOOP_SAD2; + goto LOOP_SAD2; #elif (NUMBER==1) -goto LOOP_SAD1; + goto LOOP_SAD1; #endif } diff --git a/media/libstagefright/codecs/common/Android.mk b/media/libstagefright/codecs/common/Android.mk index 77fe934..a33cb92 100644 --- a/media/libstagefright/codecs/common/Android.mk +++ b/media/libstagefright/codecs/common/Android.mk @@ -14,8 +14,6 @@ LOCAL_STATIC_LIBRARIES := LOCAL_C_INCLUDES := \ $(LOCAL_PATH)/include -LOCAL_CFLAGS := $(VO_CFLAGS) - include $(BUILD_SHARED_LIBRARY) diff --git a/media/libstagefright/codecs/common/Config.mk b/media/libstagefright/codecs/common/Config.mk index 187f25c..a6d4286 100644 --- a/media/libstagefright/codecs/common/Config.mk +++ b/media/libstagefright/codecs/common/Config.mk @@ -20,5 +20,3 @@ endif VOTEST := 0 -VO_CFLAGS:=-DLINUX - diff --git a/media/libstagefright/codecs/common/include/voType.h b/media/libstagefright/codecs/common/include/voType.h index 5f659ab..da208d4 100644 --- a/media/libstagefright/codecs/common/include/voType.h +++ b/media/libstagefright/codecs/common/include/voType.h @@ -76,15 +76,6 @@ typedef char VO_CHAR; /** VO_U16 is a 16 bit unsigned quantity that is 16 bit word aligned */ typedef unsigned short VO_U16; -/** VO_WCHAR is a 16 bit unsigned quantity that is 16 bit word aligned */ -#if defined _WIN32 -typedef unsigned short VO_WCHAR; -typedef unsigned short* VO_PWCHAR; -#elif defined LINUX -typedef unsigned char VO_WCHAR; -typedef unsigned char* VO_PWCHAR; -#endif - /** VO_S16 is a 16 bit signed quantity that is 16 bit word aligned */ typedef signed short VO_S16; @@ -150,21 +141,6 @@ typedef char* VO_PCHAR; */ typedef unsigned char* VO_PBYTE; -/** The VO_PTCHAR type is intended to be used to pass arrays of wchar such as - unicode char between the application and the component and core. The VO_PTCHAR - type is a 32 bit pointer to a zero terminated string. The pointer is word - aligned and the string is byte aligned. - */ -/* -#if !defined LINUX -typedef unsigned short* VO_PTCHAR; -typedef unsigned short* VO_TCHAR; -#else -typedef char* VO_PTCHAR; -typedef char VO_TCHAR; -#endif -*/ - #ifndef NULL #ifdef __cplusplus #define NULL 0 diff --git a/media/libstagefright/codecs/mp3dec/src/asm/pvmp3_dct_16_gcc.s b/media/libstagefright/codecs/mp3dec/src/asm/pvmp3_dct_16_gcc.s index f83732b..e61c8d3 100644 --- a/media/libstagefright/codecs/mp3dec/src/asm/pvmp3_dct_16_gcc.s +++ b/media/libstagefright/codecs/mp3dec/src/asm/pvmp3_dct_16_gcc.s @@ -369,7 +369,9 @@ pvmp3_merge_in_place_N32: pvmp3_split: stmfd sp!,{r4,r5,lr} - ldr r2,constant16 + adr r1,constant16 + ldr r2,[r1] + add r2,r1 sub r1,r0,#4 mov r3,#3 loop1: @@ -449,7 +451,7 @@ constant14: constant15: .word 0x5a827980 constant16: - .word CosTable_dct32 + 60 + .word (CosTable_dct32 + 60)-constant16 diff --git a/media/libstagefright/codecs/mp3dec/src/asm/pvmp3_mdct_18_gcc.s b/media/libstagefright/codecs/mp3dec/src/asm/pvmp3_mdct_18_gcc.s index 96230c5..575acd6 100644 --- a/media/libstagefright/codecs/mp3dec/src/asm/pvmp3_mdct_18_gcc.s +++ b/media/libstagefright/codecs/mp3dec/src/asm/pvmp3_mdct_18_gcc.s @@ -43,7 +43,7 @@ pvmp3_mdct_18: stmfd sp!,{r4-r11,lr} mov r7,r2 - ldr r2,table + adr r2,constdata$1 mov r6,r1 add r3,r2,#0x24 add r12,r3,#0x44 @@ -321,8 +321,6 @@ Loop_2: smull r2,r1,r0,r1 str r1,[r6,#0x3c] ldmfd sp!,{r4-r11,pc} -table: - .word constdata$1 @------------------------------------------------------------------------------ diff --git a/media/libstagefright/codecs/mp3dec/src/asm/pvmp3_polyphase_filter_window_gcc.s b/media/libstagefright/codecs/mp3dec/src/asm/pvmp3_polyphase_filter_window_gcc.s index 4f45737..b74c849 100644 --- a/media/libstagefright/codecs/mp3dec/src/asm/pvmp3_polyphase_filter_window_gcc.s +++ b/media/libstagefright/codecs/mp3dec/src/asm/pvmp3_polyphase_filter_window_gcc.s @@ -46,8 +46,10 @@ pvmp3_polyphase_filter_window: stmfd sp!,{r0-r2,r4-r11,lr} sub sp,sp,#4 + adr r2,PolyPh_filter_coeff + ldr r1,[r2] + add r1,r2 ldr r2,[sp,#0xc] - ldr r1,PolyPh_filter_coeff sub r2,r2,#1 mov r10,#1 @@ -224,7 +226,7 @@ PolyPh_filter_loop2: ldmfd sp!,{r4-r11,pc} PolyPh_filter_coeff: - .word pqmfSynthWin + .word pqmfSynthWin-PolyPh_filter_coeff LOW_16BITS: .word 0x00007fff diff --git a/media/libstagefright/id3/ID3.cpp b/media/libstagefright/id3/ID3.cpp index ca14054..69274ca 100644 --- a/media/libstagefright/id3/ID3.cpp +++ b/media/libstagefright/id3/ID3.cpp @@ -743,7 +743,8 @@ static size_t StringSize(const uint8_t *start, uint8_t encoding) { n += 2; } - return n; + // Add size of null termination. + return n + 2; } const void * diff --git a/services/audioflinger/AudioMixer.cpp b/services/audioflinger/AudioMixer.cpp index 0c8b3ce..3e4c55e 100644 --- a/services/audioflinger/AudioMixer.cpp +++ b/services/audioflinger/AudioMixer.cpp @@ -93,8 +93,12 @@ bool AudioMixer::isMultichannelCapable = false; effect_descriptor_t AudioMixer::dwnmFxDesc; +// Ensure mConfiguredNames bitmask is initialized properly on all architectures. +// The value of 1 << x is undefined in C when x >= 32. + AudioMixer::AudioMixer(size_t frameCount, uint32_t sampleRate, uint32_t maxNumTracks) - : mTrackNames(0), mConfiguredNames((1 << maxNumTracks) - 1), mSampleRate(sampleRate) + : mTrackNames(0), mConfiguredNames((maxNumTracks >= 32 ? 0 : 1 << maxNumTracks) - 1), + mSampleRate(sampleRate) { // AudioMixer is not yet capable of multi-channel beyond stereo COMPILE_TIME_ASSERT_FUNCTION_SCOPE(2 == MAX_NUM_CHANNELS); diff --git a/services/camera/libcameraservice/CameraService.cpp b/services/camera/libcameraservice/CameraService.cpp index bf07f8b..385be50 100644 --- a/services/camera/libcameraservice/CameraService.cpp +++ b/services/camera/libcameraservice/CameraService.cpp @@ -721,9 +721,9 @@ void CameraService::Client::stopRecording() { Mutex::Autolock lock(mLock); if (checkPidAndHardware() != NO_ERROR) return; - mCameraService->playSound(SOUND_RECORDING); disableMsgType(CAMERA_MSG_VIDEO_FRAME); mHardware->stopRecording(); + mCameraService->playSound(SOUND_RECORDING); mPreviewBuffer.clear(); } |