18f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani/* 28f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani * Copyright 2015 The Android Open Source Project 38f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani * 48f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani * Licensed under the Apache License, Version 2.0 (the "License"); 58f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani * you may not use this file except in compliance with the License. 68f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani * You may obtain a copy of the License at 78f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani * 88f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani * http://www.apache.org/licenses/LICENSE-2.0 98f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani * 108f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani * Unless required by applicable law or agreed to in writing, software 118f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani * distributed under the License is distributed on an "AS IS" BASIS, 128f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 138f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani * See the License for the specific language governing permissions and 148f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani * limitations under the License. 158f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani */ 168f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 178f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani#ifndef SOFT_MPEG2_H_ 188f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 198f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani#define SOFT_MPEG2_H_ 208f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 218f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani#include "SoftVideoDecoderOMXComponent.h" 228f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani#include <sys/time.h> 238f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 248f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhaninamespace android { 258f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 268f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani#define ivd_aligned_malloc(alignment, size) memalign(alignment, size) 278f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani#define ivd_aligned_free(buf) free(buf) 288f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 298f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani/** Number of entries in the time-stamp array */ 308f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani#define MAX_TIME_STAMPS 64 318f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 328f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani/** Maximum number of cores supported by the codec */ 338f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani#define CODEC_MAX_NUM_CORES 4 348f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 358f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani#define CODEC_MAX_WIDTH 1920 368f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 378f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani#define CODEC_MAX_HEIGHT 1088 388f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 398f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani/** Input buffer size */ 408f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani#define INPUT_BUF_SIZE (1024 * 1024) 418f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 428f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani#define MIN(a, b) ((a) < (b)) ? (a) : (b) 438f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 448f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani/** Used to remove warnings about unused parameters */ 458f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani#define UNUSED(x) ((void)(x)) 468f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 478f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani/** Get time */ 488f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani#define GETTIME(a, b) gettimeofday(a, b); 498f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 508f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani/** Compute difference between start and end */ 518f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani#define TIME_DIFF(start, end, diff) \ 528f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani diff = ((end.tv_sec - start.tv_sec) * 1000000) + \ 538f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani (end.tv_usec - start.tv_usec); 548f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 558f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhanistruct SoftMPEG2 : public SoftVideoDecoderOMXComponent { 568f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani SoftMPEG2( 578f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani const char *name, const OMX_CALLBACKTYPE *callbacks, 588f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani OMX_PTR appData, OMX_COMPONENTTYPE **component); 598f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 608f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhaniprotected: 618f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani virtual ~SoftMPEG2(); 628f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 638f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani virtual void onQueueFilled(OMX_U32 portIndex); 648f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani virtual void onPortFlushCompleted(OMX_U32 portIndex); 658f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani virtual void onReset(); 668f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani virtual OMX_ERRORTYPE internalSetParameter(OMX_INDEXTYPE index, const OMX_PTR params); 678f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhaniprivate: 688f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani // Number of input and output buffers 698f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani enum { 708f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani kNumBuffers = 8 718f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani }; 728f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 738f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani iv_obj_t *mCodecCtx; // Codec context 748f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani iv_mem_rec_t *mMemRecords; // Memory records requested by the codec 758f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani size_t mNumMemRecords; // Number of memory records requested by the codec 768f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 778f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani size_t mNumCores; // Number of cores to be uesd by the codec 788f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 798f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani struct timeval mTimeStart; // Time at the start of decode() 808f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani struct timeval mTimeEnd; // Time at the end of decode() 818f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 828f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani // Internal buffer to be used to flush out the buffers from decoder 838f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani uint8_t *mFlushOutBuffer; 848f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 858f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani // Status of entries in the timestamp array 868f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani bool mTimeStampsValid[MAX_TIME_STAMPS]; 878f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 888f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani // Timestamp array - Since codec does not take 64 bit timestamps, 898f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani // they are maintained in the plugin 908f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani OMX_S64 mTimeStamps[MAX_TIME_STAMPS]; 918f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 928f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani#ifdef FILE_DUMP_ENABLE 938f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani char mInFile[200]; 948f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani#endif /* FILE_DUMP_ENABLE */ 958f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 968f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani OMX_COLOR_FORMATTYPE mOmxColorFormat; // OMX Color format 978f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani IV_COLOR_FORMAT_T mIvColorFormat; // Ittiam Color format 988f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 998f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani bool mIsInFlush; // codec is flush mode 1008f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani bool mReceivedEOS; // EOS is receieved on input port 1018f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani bool mInitNeeded; 1028f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani uint32_t mNewWidth; 1038f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani uint32_t mNewHeight; 1048f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani // The input stream has changed to a different resolution, which is still supported by the 1058f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani // codec. So the codec is switching to decode the new resolution. 1068f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani bool mChangingResolution; 1078f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani bool mFlushNeeded; 1088f81045b9219cada36c7be7e6f0541cfa7bd94c8Venkatarama Avadhani bool mWaitForI; 1091ef423ccd884679893b3622c86aae9792b345088Harish Mahendrakar size_t mStride; 1108f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 1118f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani status_t initDecoder(); 1128f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani status_t deInitDecoder(); 1138f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani status_t setFlushMode(); 1148f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani status_t setParams(size_t stride); 1158f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani void logVersion(); 1168f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani status_t setNumCores(); 1178f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani status_t resetDecoder(); 1188f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani status_t resetPlugin(); 1198f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani status_t reInitDecoder(); 1208f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 12187fdee0bc9e3ac4d2a88ef0a8e150cfdf08c161dWonsik Kim bool setDecodeArgs( 1228f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani ivd_video_decode_ip_t *ps_dec_ip, 1238f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani ivd_video_decode_op_t *ps_dec_op, 1248f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani OMX_BUFFERHEADERTYPE *inHeader, 1258f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani OMX_BUFFERHEADERTYPE *outHeader, 1268f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani size_t timeStampIx); 1278f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 1288f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani DISALLOW_EVIL_CONSTRUCTORS(SoftMPEG2); 1298f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani}; 1308f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 1318f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani#ifdef FILE_DUMP_ENABLE 1328f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 1338f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani#define INPUT_DUMP_PATH "/sdcard/media/mpeg2d_input" 1348f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani#define INPUT_DUMP_EXT "m2v" 1358f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 1368f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani#define GENERATE_FILE_NAMES() { \ 1378f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani GETTIME(&mTimeStart, NULL); \ 1388f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani strcpy(mInFile, ""); \ 1398f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani sprintf(mInFile, "%s_%ld.%ld.%s", INPUT_DUMP_PATH, \ 1408f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani mTimeStart.tv_sec, mTimeStart.tv_usec, \ 1418f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani INPUT_DUMP_EXT); \ 1428f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani} 1438f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 1448f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani#define CREATE_DUMP_FILE(m_filename) { \ 1458f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani FILE *fp = fopen(m_filename, "wb"); \ 1468f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani if (fp != NULL) { \ 1478f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani fclose(fp); \ 1488f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani } else { \ 1498f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani ALOGD("Could not open file %s", m_filename); \ 1508f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani } \ 1518f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani} 1528f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani#define DUMP_TO_FILE(m_filename, m_buf, m_size) \ 1538f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani{ \ 1548f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani FILE *fp = fopen(m_filename, "ab"); \ 1558f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani if (fp != NULL && m_buf != NULL) { \ 1568f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani int i; \ 1578f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani i = fwrite(m_buf, 1, m_size, fp); \ 1588f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani ALOGD("fwrite ret %d to write %d", i, m_size); \ 1598f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani if (i != (int)m_size) { \ 1608f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani ALOGD("Error in fwrite, returned %d", i); \ 1618f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani perror("Error in write to file"); \ 1628f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani } \ 1638f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani fclose(fp); \ 1648f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani } else { \ 1658f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani ALOGD("Could not write to file %s", m_filename);\ 1668f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani } \ 1678f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani} 1688f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani#else /* FILE_DUMP_ENABLE */ 1698f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani#define INPUT_DUMP_PATH 1708f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani#define INPUT_DUMP_EXT 1718f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani#define OUTPUT_DUMP_PATH 1728f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani#define OUTPUT_DUMP_EXT 1738f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani#define GENERATE_FILE_NAMES() 1748f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani#define CREATE_DUMP_FILE(m_filename) 1758f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani#define DUMP_TO_FILE(m_filename, m_buf, m_size) 1768f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani#endif /* FILE_DUMP_ENABLE */ 1778f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 1788f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani} // namespace android 1798f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani 1808f9d9d06ed6c8447c7fd02745b2a22dd4bba8e7eVenkatarama Avadhani#endif // SOFT_MPEG2_H_ 181