Created
June 13, 2016 18:11
-
-
Save fernandoc1/6227b78b11146b5db327aa144bf6d963 to your computer and use it in GitHub Desktop.
A test encoder with libavcodec
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <stdlib.h> | |
#include <stdio.h> | |
#include <string.h> | |
#ifdef HAVE_AV_CONFIG_H | |
#undef HAVE_AV_CONFIG_H | |
#endif | |
extern "C" { | |
#include <libavcodec/avcodec.h> | |
#include <libavutil/mathematics.h> | |
} | |
#define INBUF_SIZE 4096 | |
#define AUDIO_INBUF_SIZE 20480 | |
#define AUDIO_REFILL_THRESH 4096 | |
static void video_encode_example(const char *filename) | |
{ | |
AVCodec *codec; | |
AVCodecContext *c= NULL; | |
int i, out_size, size, x, y, outbuf_size; | |
FILE *f; | |
AVFrame *picture; | |
uint8_t *outbuf, *picture_buf; | |
printf("Video encoding\n"); | |
/* find the mpeg1 video encoder */ | |
codec = avcodec_find_encoder(CODEC_ID_MPEG1VIDEO); | |
if (!codec) { | |
fprintf(stderr, "codec not found\n"); | |
exit(1); | |
} | |
c = avcodec_alloc_context3(codec); | |
picture= avcodec_alloc_frame(); | |
/* put sample parameters */ | |
c->bit_rate = 400000; | |
/* resolution must be a multiple of two */ | |
c->width = 640; | |
c->height = 480; | |
/* frames per second */ | |
c->time_base= (AVRational){1,25}; | |
c->gop_size = 10; /* emit one intra frame every ten frames */ | |
c->max_b_frames=1; | |
c->pix_fmt = PIX_FMT_YUV420P; | |
/* 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); | |
} | |
/* alloc image and output buffer */ | |
outbuf_size = 100000; | |
outbuf = (uint8_t*)malloc(outbuf_size); | |
size = c->width * c->height; | |
picture_buf = (uint8_t*)malloc((size * 3) / 2); /* size for YUV 420 */ | |
picture->data[0] = picture_buf; | |
picture->data[1] = picture->data[0] + size; | |
picture->data[2] = picture->data[1] + size / 4; | |
picture->linesize[0] = c->width; | |
picture->linesize[1] = c->width / 2; | |
picture->linesize[2] = c->width / 2; | |
/* encode 1 second of video */ | |
for(i=0;i<25;i++) { | |
fflush(stdout); | |
/* prepare a dummy image */ | |
/* Y */ | |
for(y=0;y<c->height;y++) { | |
for(x=0;x<c->width;x++) { | |
picture->data[0][y * picture->linesize[0] + x] = x + y + i * 3; | |
} | |
} | |
/* Cb and Cr */ | |
for(y=0;y<c->height/2;y++) { | |
for(x=0;x<c->width/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; | |
} | |
} | |
/* encode the image */ | |
out_size = avcodec_encode_video(c, outbuf, outbuf_size, picture); | |
printf("encoding frame %3d (size=%5d)\n", i, out_size); | |
fwrite(outbuf, 1, out_size, f); | |
} | |
/* get the delayed frames */ | |
for(; out_size; i++) { | |
fflush(stdout); | |
out_size = avcodec_encode_video(c, outbuf, outbuf_size, NULL); | |
printf("write frame %3d (size=%5d)\n", i, out_size); | |
fwrite(outbuf, 1, out_size, f); | |
} | |
/* add sequence end code to have a real mpeg file */ | |
outbuf[0] = 0x00; | |
outbuf[1] = 0x00; | |
outbuf[2] = 0x01; | |
outbuf[3] = 0xb7; | |
fwrite(outbuf, 1, 4, f); | |
fclose(f); | |
free(picture_buf); | |
free(outbuf); | |
avcodec_close(c); | |
av_free(c); | |
av_free(picture); | |
printf("\n"); | |
} | |
int main(int argc, char **argv) | |
{ | |
const char *filename; | |
avcodec_register_all(); | |
video_encode_example("test.mpg"); | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
all: | |
g++ main.cpp -lavcodec -lavutil-ffmpeg -o TestEncoder |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment