mediacodec - Android Precise seeking of video -


i'm struggling precise seeking using mediaextractor's seekto(). while can seek sync frames without problems, seek specific time. this question led me ideas how this, i'm not sure if valid. basicly, have seek closest previous sync frame , advance() extractor until target time reached. every frame in process fed decoder, i.e first i-frame , rest p-frames. related code snippet (based on google/grafika's movieplayer):

extractor.seekto((long) seektarget[threadnr], mediaextractor.seek_to_previous_sync);  ...  while (extractor.getsampletime() < (long) seektarget[threadnr]) {     log.d(tag, "thread " + threadnr + " advanced timestamp " + extractor.getsampletime());      int inputbufindex = decoder.dequeueinputbuffer(timeout_usec);     if (inputbufindex >= 0) {         bytebuffer inbufer = decoderinputbuffers[inputbufindex];         int chunksize = extractor.readsampledata(inbufer, 0);          if (chunksize < 0) {             // end of stream -- send empty frame eos flag set.             decoder.queueinputbuffer(inputbufindex, 0, 0, 0l,                     mediacodec.buffer_flag_end_of_stream);             inputdone = true;             if (verbose) log.d(tag, "sent input eos");         } else {             if (extractor.getsampletrackindex() != trackindex) {                 log.w(tag, "weird: got sample track " +                         extractor.getsampletrackindex() + ", expected " + trackindex);             }              long presentationtimeus = extractor.getsampletime();             decoder.queueinputbuffer(inputbufindex, 0, chunksize,                     presentationtimeus, 0 /*flags*/);             if (verbose) {                 log.d(tag, "submitted frame " + inputchunk + " dec, size=" +                         chunksize + " inputbufindex: " + inputbufindex);             }             inputchunk++;             extractor.advance();         }     } } 

as can imagine, i'm queuing large amount of frames, i'm fine memory consumption or eventual lag. problem dequeueinputbuffer() method works time in loop, eventualy stucks @ returning -1, accordingly documentation means buffer unavailiable. if change timeout_usec -1, infinite loop.

can please tell me if approach correct or why @ point can't access inputbuffer?

you don't appear pulling buffers output side. mediacodec decoder doesn't drop frames, when internal buffers fill stop handing input buffers.

you need drain decoder requesting output buffers. when release buffer, set "render" flag false doesn't appear on screen.


Comments