bool V4l2Decoder::acceptInputBuffer(struct v4l2_buffer *qbuf) { VideoDecodeBuffer *inputBuffer = &(m_inputFrames[qbuf->index]); ASSERT(m_maxBufferSize[INPUT] > 0); ASSERT(m_bufferSpace[INPUT] || m_memoryMode[INPUT] != V4L2_MEMORY_MMAP ); ASSERT(qbuf->memory == m_memoryMode[INPUT]); ASSERT(qbuf->index < m_maxBufferCount[INPUT]); ASSERT(qbuf->length == 1); inputBuffer->size = qbuf->m.planes[0].bytesused; // one plane only if (!inputBuffer->size) // EOS inputBuffer->data = NULL; else { if (m_memoryMode[INPUT] == V4L2_MEMORY_MMAP) inputBuffer->data = m_bufferSpace[INPUT] + m_maxBufferSize[INPUT]*qbuf->index; else if (m_memoryMode[INPUT] == V4L2_MEMORY_USERPTR) { // FIXME, puzzle, videodev2.h uses 'unsigned long userptr', how could it support 64 bit mem address? uintptr_t *ptr = (uintptr_t*)qbuf->m.planes[0].reserved; inputBuffer->data = (uint8_t*)(*ptr); } } TIMEVAL_TO_INT64(inputBuffer->timeStamp, qbuf->timestamp); inputBuffer->flag = qbuf->flags; // set buffer unit-mode if possible, nal, frame? DEBUG("qbuf->index: %d, inputBuffer: %p, timestamp: %" PRId64, qbuf->index, inputBuffer->data, inputBuffer->timeStamp); return true; }
bool V4l2Decoder::acceptInputBuffer(struct v4l2_buffer *qbuf) { VideoDecodeBuffer *inputBuffer = &(m_inputFrames[qbuf->index]); ASSERT(m_maxBufferSize[INPUT] > 0); ASSERT(m_bufferSpace[INPUT]); ASSERT(qbuf->index >= 0 && qbuf->index < m_maxBufferCount[INPUT]); ASSERT(qbuf->length == 1); inputBuffer->size = qbuf->m.planes[0].bytesused; // one plane only if (!inputBuffer->size) // EOS inputBuffer->data = NULL; else inputBuffer->data = m_bufferSpace[INPUT] + m_maxBufferSize[INPUT]*qbuf->index; TIMEVAL_TO_INT64(inputBuffer->timeStamp, qbuf->timestamp); inputBuffer->flag = qbuf->flags; // set buffer unit-mode if possible, nal, frame? DEBUG("qbuf->index: %d, inputBuffer: %p, timestamp: %ld", qbuf->index, inputBuffer->data, inputBuffer->timeStamp); return true; }