3

I am trying to use the low-level media APIs to decode files in mp3 and other formats so I can process them. I am following the tutorial here to take an encoded file and play it back with an AudioTrack and my code is largely the same but I am getting an error.

Here is my code:

public void playSongMono(View view)
{   
    //create extractor and point it to file
    AssetFileDescriptor fd = getResources().openRawResourceFd(R.raw.song);

    MediaExtractor extractor = new MediaExtractor();
    extractor.setDataSource(fd.getFileDescriptor(),fd.getStartOffset(),fd.getLength());

    //get MIME type of file
    MediaFormat inputFormat = extractor.getTrackFormat(0);
    Log.d("MonoPlayer","TRACKS #: "+extractor.getTrackCount());
    String mime = inputFormat.getString(MediaFormat.KEY_MIME);
    Log.d("MonoPlayer","FORMAT: "+mime);

    extractor.selectTrack(0);

    //create codec
    MediaCodec codec = MediaCodec.createDecoderByType(mime);
    Log.d("MonoPlayer","1");
    codec.configure(inputFormat, null, null, 0);
    Log.d("MonoPlayer","2");
    codec.start();
    Log.d("MonoPlayer","3");

    ByteBuffer[] inputBuffers = codec.getInputBuffers();
    ByteBuffer[] outputBuffers  = codec.getOutputBuffers();

    //get a buffer and fill it
    int inputBufferIndex = codec.dequeueInputBuffer(1000000);

    if(inputBufferIndex >= 0)
    {
        Log.d("MonoPlayer","4");
        //fill the buffer
        int sampleSize = extractor.readSampleData(inputBuffers[inputBufferIndex], 0);
        long presentationTimeUs = 0;
        boolean sawInputEOS= false;

        if (sampleSize < 0) {
            sawInputEOS = true;
            sampleSize = 0;
        } else {
            presentationTimeUs = extractor.getSampleTime();
        }

        codec.queueInputBuffer(inputBufferIndex,
                                0,
                                sampleSize,
                                presentationTimeUs,
                                sawInputEOS ? MediaCodec.BUFFER_FLAG_END_OF_STREAM : 0);

        if (!sawInputEOS) {
            extractor.advance();
        }
    }

    BufferInfo info = new BufferInfo(); //this will be populated with data by dequeueOutputBuffer

    //get the index of a finished buffer. since we only enqueued one we should only wait for one
    int resultBufferIndex = codec.dequeueOutputBuffer(info, 1000000);

    if (resultBufferIndex >= 0 )
    {
        Log.d("MonoPlayer","5");
        //we now have a buffer of pcm data
        byte[] chunk = new byte[info.size];
        outputBuffers[resultBufferIndex].get(chunk); 
        outputBuffers[resultBufferIndex].clear();
        codec.releaseOutputBuffer(resultBufferIndex, false);

        //create audiotrack to play sound
        audiotrack = new AudioTrack(AudioManager.STREAM_MUSIC,
                44100,
                AudioFormat.CHANNEL_OUT_STEREO,
                AudioFormat.ENCODING_PCM_16BIT,
                chunk.length,
                AudioTrack.MODE_STATIC);

        audiotrack.play();
        audiotrack.write(chunk, 0, chunk.length);

    }

    extractor.release();
    extractor = null;

    codec.stop();
    codec.release();
    codec = null;
}

And upon execution of this code I get the following logcat output

D MonoPlayer       TRACKS #: 1
D MonoPlayer       FORMAT: audio/mpeg
I OMXClient        Using client-side OMX mux.
D MonoPlayer       1
E OMXNodeInstance  OMX_GetExtensionIndex failed
D MonoPlayer       2
D MonoPlayer       3
D MonoPlayer       4

Above is the error I mentioned. I'm not exactly sure why this error is occurring or what it means. However, I have tried to gather some information. The use of log output suggests that the error happens with the line codec.configure(inputFormat, null, null, 0);. I have tried removing the line, which predictably results in an illegal state error but removes the error in question. Additionally, in the code I posted, the Log.d("MonoPlayer","5"); is never reached, even if the time out on the dequeue call is set to indefinite, so I assume the decoder is not properly configured.

If anyone has any information on why I might be getting this error and what I could do to fix it, that would be great. Thanks in advance.

bobs
  • 21,844
  • 12
  • 67
  • 78
KevinAckeral
  • 31
  • 1
  • 2

1 Answers1

2

That message is probably harmless. I see it in tests that succeed.

It appears to be coming from line 288 of OMXNodeInstance.cpp. The OMX.google.android.index.enableAndroidNativeBuffers extension lookup fails, which just means the extension wasn't defined on that device.

fadden
  • 51,356
  • 5
  • 116
  • 166