1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| #define VIDEO_INBUF_SIZE 20480 #define VIDEO_REFILL_THRESH 4096
uint8_t inbuf[VIDEO_INBUF_SIZE + VIDEO_REFILL_THRESH]; uint8_t *data = NULL; size_t data_size = 0; int ret = 0; int len = 0; data = inbuf; data_size = fread(inbuf, 1, VIDEO_INBUF_SIZE, infile); while(data_size > 0) { if(!decoded_frame){ if(!decoded_frame = av_frame_alloc()){printf("不能分配帧内存\n");return;} } ret = av_parser_parse2(parser, codec_ctx, &pkt->data, &pkt->size, data, data_size, AV_NOPTS_VALUE, AV_NOPTS_VALUE, 0); if(ret < 0){printf("解析出错\n");return;} data += ret; data_size -= ret; if(pkt->size) decode(codec_ctx, pkt, decodecd_frame, outfile); if(data_size < AUDIO_REFILL_THRESH) { memmove(inbuf, data, data_size); data = inbuf; len = fread(data + data_size, 1, AUDIO_INBUF_SIZE - data_size, infile); if(len > 0) data_size += len; } }
pkt->data = NULL; pkt->size = 0; decode(codec_ctx, pkt, decodecd_frame, outfile);
|