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 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
| for(;;) { memset(yuv_buf, 0, frame_bytes); size_t read_bytes = fread(yuv_buf, 1, frame_bytes, infile); if(read_bytes <= 0) { printf("read file finish\n"); break; }
int frame_is_writable = 1; if(av_frame_is_writable(frame) == 0){ printf("the frame can't write, buf:%p\n", frame->buf[0]); if(frame->buf && frame->buf[0]) printf("ref_count1(frame) = %d\n", av_buffer_ger_ref_count(frame->buf[0])); frame_is_writable = 0; } ret = av_frame_make_writable(frame); if(frame_is_writable == 0) { printf("av_frame_make_writable, buf:%p\n", frame->buf[0]); if(frame->buf && frame->buf[0]) printf("ref_count2(frame) = %d\n", av_buffer_get_ref_count(frame->buf[0])); } if(ret != 0) { printf("av_frame_make_writable failed, ret = %d\n", ret); break; } int need_size = av_image_fill_arrays(frame->data,frame->linesize,yuv_buf, frame->format, frame->width,frame->height,1); if(need_size != frame_bytes){ printf("av_image_fill_arrays failed, need_size:%d, frame_bytes:%d\n", need_size, frame_bytes); break; } pts += 40; frame->pts = pts; begin_time = get_time(); ret = encode(codec_ctx, frame, pkt, outfile); end_time = get_time(); printf("encode time:%lldms\n", end_time - begin_time); if(ret<0) { printf("encode failed\n"); break; } encode(codec_ctx, NULL, pkt, outfile); all_end_time = get_time(); printf("all encode time:%lldms\n", all_end_time - all_begin_time); }
|