#include "creator.h" #include "render.h" static void encode(AVCodecContext *enc_ctx, AVFrame *frame, AVPacket *pkt, FILE *outfile) { int ret; /* send the frame to the encoder */ ret = avcodec_send_frame(enc_ctx, frame); if (ret < 0) { fprintf(stderr, "error sending a frame for encoding\n"); exit(1); } while (ret >= 0) { ret = avcodec_receive_packet(enc_ctx, pkt); if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF) return; else if (ret < 0) { fprintf(stderr, "error during encoding\n"); exit(1); } //printf("encoded frame %3"PRId64" (size=%5d)\n", pkt->pts, pkt->size); fwrite(pkt->data, 1, pkt->size, outfile); av_packet_unref(pkt); } } int generateVideo(filename, int width, int height, int fps, int bitRate) { avcodec_register_all(); /* find the mpeg1video encoder */ codec = avcodec_find_encoder(AV_CODEC_ID_MPEG1VIDEO); if (!codec) { fprintf(stderr, "codec not found\n"); exit(1); } c = avcodec_alloc_context3(codec); picture = av_frame_alloc(); pkt = av_packet_alloc(); if (!pkt) exit(1); /* put sample parameters */ c->bit_rate = bitRate; /* resolution must be a multiple of two */ if ((width*height)%2) exit(1); c->width = width; c->height = height; /* frames per second */ c->time_base = (AVRational){1, fps}; c->framerate = (AVRational){fps, 1}; /* emit one intra frame every ten frames */ c->gop_size = 10; c->max_b_frames=1; c->pix_fmt = AV_PIX_FMT_RGBA; /* open it */ if (avcodec_open2(c, codec, NULL) < 0) { fprintf(stderr, "could not open codec\n"); exit(1); } f = fopen(filename, "wb"); if (!f) { fprintf(stderr, "could not open %s\n", filename); exit(1); } picture->format = c->pix_fmt; picture->width = c->width; picture->height = c->height; ret = av_frame_get_buffer(picture, 32); if (ret < 0) { fprintf(stderr, "could not alloc the frame data\n"); exit(1); } void addFrame(int *frame) { fflush(stdout); /* make sure the frame data is writable */ ret = av_frame_make_writable(picture); if (ret < 0) exit(1); picture->data[0] = frame; /* prepare a dummy image */ /* Y */ /*for(y=0;yheight;y++) { for(x=0;xwidth;x++) { picture->data[0][y * picture->linesize[0] + x] = x + y + i * 3; } } YCbCr colorCode /* Cb and Cr * for(y=0;yheight/2;y++) { for(x=0;xwidth/2;x++) { picture->data[1][y * picture->linesize[1] + x] = 128 + y + i * 2; picture->data[2][y * picture->linesize[2] + x] = 64 + x + i * 5; } } */ picture->pts = i; /* encode the image */ encode(c, picture, pkt, f); } void endFile(void){ uint8_t endcode[] = { 0, 0, 1, 0xb7 }; /* flush the encoder */ encode(c, NULL, pkt, f); /* add sequence end code to have a real MPEG file */ fwrite(endcode, 1, sizeof(endcode), f); fclose(f); avcodec_free_context(&c); av_frame_free(&picture); av_packet_free(&pkt); }