почему медиа-код c dequeueinputbuffer не блокируется, когда я использовал все буферы? - PullRequest
0 голосов
/ 08 января 2020

Я использую медиа-код c для декодирования видео в формате .mp4. Он хорошо работает на эмуляторе и моем android телефоне.

, но когда я пытаюсь перенести его на ht c vive focus plus (Android 7.1), кажется, что AMediaCodec_dequeueInputBuffer () всегда возвращает действительный индекс буфера от 0 до 3. У меня закрыт выходной поток, поэтому он должен быть заблокирован, когда я вызываю dequeueinputbuffer несколько раз. Но регистрируется следующим образом:

  2020-01-08 17:28:41.601 25109-25177/Queue timestamp 111 and buffer index is 2 flags is 1 buffer size is 105222
    2020-01-08 17:28:41.708 25109-25177/Queue timestamp 40000 and buffer index is 3 flags is 0 buffer size is 1554
    2020-01-08 17:28:41.813 25109-25177/Queue timestamp 80000 and buffer index is 0 flags is 0 buffer size is 2153
    2020-01-08 17:28:41.918 25109-25177/Queue timestamp 120000 and buffer index is 1 flags is 0 buffer size is 2208
    2020-01-08 17:28:42.020 25109-25177/Queue timestamp 160000 and buffer index is 2 flags is 0 buffer size is 2523
    2020-01-08 17:28:42.123 25109-25177/Queue timestamp 200000 and buffer index is 3 flags is 0 buffer size is 3088
    2020-01-08 17:28:42.227 25109-25177/Queue timestamp 240000 and buffer index is 0 flags is 0 buffer size is 4188
    2020-01-08 17:28:42.335 25109-25177/Queue timestamp 280000 and buffer index is 1 flags is 0 buffer size is 365
    2020-01-08 17:28:42.439 25109-25177/Queue timestamp 320000 and buffer index is 2 flags is 0 buffer size is 3571
    2020-01-08 17:28:42.543 25109-25177/Queue timestamp 360000 and buffer index is 3 flags is 0 buffer size is 3966
    2020-01-08 17:28:42.646 25109-25177/Queue timestamp 400000 and buffer index is 0 flags is 0 buffer size is 4081
    2020-01-08 17:28:42.749 25109-25177/Queue timestamp 440000 and buffer index is 1 flags is 0 buffer size is 4631
    2020-01-08 17:28:42.853 25109-25177/Queue timestamp 480000 and buffer index is 2 flags is 0 buffer size is 4996
    2020-01-08 17:28:42.956 25109-25177/Queue timestamp 520000 and buffer index is 3 flags is 0 buffer size is 5909
    2020-01-08 17:28:43.059 25109-25177/Queue timestamp 560000 and buffer index is 0 flags is 0 buffer size is 5995
    2020-01-08 17:28:43.163 25109-25177/Queue timestamp 600000 and buffer index is 1 flags is 0 buffer size is 6419
    2020-01-08 17:28:43.266 25109-25177/Queue timestamp 640000 and buffer index is 2 flags is 0 buffer size is 6212
    2020-01-08 17:28:43.370 25109-25177/Queue timestamp 680000 and buffer index is 3 flags is 0 buffer size is 6762
    2020-01-08 17:28:43.473 25109-25177/Queue timestamp 720000 and buffer index is 0 flags is 0 buffer size is 6291
    2020-01-08 17:28:43.576 25109-25177/Queue timestamp 760000 and buffer index is 1 flags is 0 buffer size is 6902
    2020-01-08 17:28:43.684 25109-25177/Queue timestamp 800000 and buffer index is 2 flags is 0 buffer size is 6916
    2020-01-08 17:28:43.789 25109-25177/Queue timestamp 840000 and buffer index is 3 flags is 0 buffer size is 7469
    2020-01-08 17:28:43.893 25109-25177/Queue timestamp 880000 and buffer index is 0 flags is 0 buffer size is 7152
    2020-01-08 17:28:43.998 25109-25177/Queue timestamp 920000 and buffer index is 1 flags is 0 buffer size is 7607
    2020-01-08 17:28:44.101 25109-25177/Queue timestamp 960000 and buffer index is 2 flags is 0 buffer size is 7663
    2020-01-08 17:28:44.205 25109-25177/Queue timestamp 1000000 and buffer index is 3 flags is 0 buffer size is 7637
    2020-01-08 17:28:44.308 25109-25177/Queue timestamp 1040000 and buffer index is 0 flags is 0 buffer size is 7241
    2020-01-08 17:28:44.413 25109-25177/Queue timestamp 1080000 and buffer index is 1 flags is 0 buffer size is 7520

В результате, если я включаю выходной поток, я могу получить только часть выходных кадров (1 кадр на каждые 6). Очевидно, это из-за покрытия входного буфера. Также записывается следующее:

2020-01-08 17:13:22.810 25109-25179/release output buffer, presentTime=111
2020-01-08 17:13:23.389 25109-25179/release output buffer, presentTime=240000
2020-01-08 17:13:24.011 25109-25179/release output buffer, presentTime=480000
2020-01-08 17:13:24.636 25109-25179/release output buffer, presentTime=720000
2020-01-08 17:13:25.262 25109-25179/release output buffer, presentTime=960000
2020-01-08 17:13:25.891 25109-25179/release output buffer, presentTime=1200000
2020-01-08 17:13:26.513 25109-25179/release output buffer, presentTime=1440000
2020-01-08 17:13:27.135 25109-25179/release output buffer, presentTime=1680000
2020-01-08 17:13:27.764 25109-25179/release output buffer, presentTime=1920000
2020-01-08 17:13:28.383 25109-25179/release output buffer, presentTime=2160000
2020-01-08 17:13:29.012 25109-25179/release output buffer, presentTime=2400000

код ввода:

mediaCodec = AMediaCodec_createDecoderByType(mime);
AMediaCodec_configure(mediaCodec, format, nullptr, nullptr, 0);
AMediaCodec_start(mediaCodec);

  while (!shutDown) {
        const int trackIndex = AMediaExtractor_getSampleTrackIndex(theExtractor);

    if (trackIndex == -1) {
        LOG("track input EOS");
        AMediaExtractor_seekTo(theExtractor, 0, AMEDIAEXTRACTOR_SEEK_PREVIOUS_SYNC);
    }
    //input buffer
    ExtractedBuffer eb;
    ssize_t sampleSize = AMediaExtractor_readSampleData(theExtractor, maxExtractorBuffer.data(),
                                                        maxExtractorBuffer.size());
    if (sampleSize < 0) {
        LOG("Read sample data failed ,the sample size is <0");
        shutDown = true;
        break;
    }

    eb.PresentationTimeUs = std::max(111, (int) AMediaExtractor_getSampleTime(theExtractor));
    eb.Flags = AMediaExtractor_getSampleFlags(theExtractor);
    eb.Buffer.resize(sampleSize);
    memmove(eb.Buffer.data(), maxExtractorBuffer.data(), sampleSize);
    AMediaExtractor_advance(theExtractor);

    if (trackIndex == audioTrack) {
        continue;
    }
    if (trackIndex == videoTrack) {
        //now we get the sample data and can push into media codec
        while (!shutDown) {
            const ssize_t bufidx = AMediaCodec_dequeueInputBuffer(mediaCodec, -1);
            if (bufidx < 0) {
                std::this_thread::sleep_for(std::chrono::milliseconds(100));
                continue;
            }

            size_t bufsize;
            uint8_t *buf = AMediaCodec_getInputBuffer(mediaCodec, bufidx, &bufsize);
            size_t copy = std::min(bufsize, eb.Buffer.size());
            memcpy(buf, eb.Buffer.data(), copy);
            AMediaCodec_queueInputBuffer(mediaCodec, bufidx, 0, copy, eb.PresentationTimeUs,
                                         eb.Flags);
            LOG("Queue timestamp %lli and buffer index is %d flags is %d buffer size is %d", eb.PresentationTimeUs,bufidx,eb.Flags,copy);
            break;
        }
    }
}

Так что, если что-то, что я не заметил, может привести к этому? Это беспокоило меня в течение недели. Если кто-нибудь может сказать мне, что это что-то связано с медиа-кодом c или просто ht c vive? Спасибо!

...