2016-08-10 3 views
0

avformat_alloc_context 및 avio_alloc_context를 사용하여 사용자 정의 io를 구현하여 다른 함수의 출력을 실시간으로 읽을 수 있습니다. ffmpeg가 다른 스레드에서이 버퍼를 읽는 동안 버퍼는 boost asio 스레드에서이 함수로 채워집니다.C에서 ffmpeg에 대한 사용자 정의 실시간 입력

I는이 함수에 쓰는 입출력 버퍼를 초기화하고는 FFmpeg는 읽는 : 나 memset 함수 is explained here 할 이유

BufferData input_buffer = {0}; 
input_buffer.size = 65536; 
input_buffer.ptr = (uint8_t *) av_malloc(buf_size); 
memset(input_buffer.ptr,'0',100); 

fprintf(stdout, "initialisation: buffer pointer %p buffer data pointer: %p\n", &input_buffer, input_buffer.ptr); 

. 참조

typedef struct { 
    uint8_t *ptr; 
    size_t size; 
} BufferData; 

읽기 기능에 대한

BufferData * decode_buffer; 
decode_buffer->size = 65536; 
decode_buffer->ptr = (uint8_t *) av_malloc(decode_buffer->size); 

AVIOContext * av_io_ctx = avio_alloc_context(decode_buffer->ptr, decode_buffer->size, 0, &input_buffer, &read_function, NULL, NULL); 

AVFormatContext *av_fmt_ctx = avformat_alloc_context(); 
av_fmt_ctx->pb = av_io_ctx; 


BufferData * tmpPtr = (BufferData *) video_input_file->av_io_ctx->opaque; 

fprintf(stdout, "video decoder before: buffer pointer %p, buffer data pointer: %p\n", tmpPtr, tmpPtr->ptr); 

open_res = avformat_open_input(&av_fmt_ctx, "anyname", in_fmt, options ? &options : NULL); 

fprintf(stdout, "video decoder after: buffer pointer %p, buffer data pointer: %p\n", tmpPtr, tmpPtr->ptr); 

static int read_function(void* opaque, uint8_t* buf, int buf_size) { 
    BufferData *bd = (BufferData *) opaque; 
    buf_size = FFMIN(buf_size, bd->size); 
    memcpy(buf, bd->ptr, buf_size); 
    bd->ptr += buf_size; //This seemed to cause the problem 
    bd->size -= buf_size; 
    return buf_size; 
} 

그리고이 결과가 될 것입니다 :

initialisation: buffer pointer 0x7f2c4a613620, buffer data pointer: 0x7f2c48c56040 

video decoder before: buffer pointer 0x7f2c4a613620, buffer data pointer: 0x7f2c48c56040 

video decoder after: buffer pointer 0x7f2c4a613620, buffer data pointer: 0x7f2c49e24b50 

그럼 내가 한 포인터 주소를 테스트 정상 b입니까? 버퍼 데이터 ptr이 avformat_open_input에 의해 변경 되는가? 왜냐하면 나는 다른 포인터를 사용하여 초기 포인터 주소를 유지하고 싶고, 필요한 메모리를 malloc했다.

답변

0

내 읽기 기능과 관련이 있으며, avformat_open_input과 관련이 없습니다. 포인터를 통해 per described here (read_packet 함수 참조)으로 쓰고있었습니다. 그것에 대해 생각한 후에, read 함수가 포인터를 다음 프레임의 시작 부분으로 증가시켜야한다는 것을 감안할 때, 더 의미가 있습니다.

관련 문제