codec = avcodec_find_encoder(CODEC_ID_MSMPEG4V1);
if (!codec)
{
NSLog("Couldn't init codec");
abort();
}
codecContext = avcodec_alloc_context();
codecContext->bit_rate = 384000;
codecContext->width = FRAME_WIDTH;
codecContext->height = FRAME_HEIGHT;
codecContext->time_base = (AVRational) {
1,
FPS
};
codecContext->pix_fmt = PIX_FMT_YUV420P;
int codec_open_result = avcodec_open(codecContext, codec);
if (codec_open_result < 0)
{
NSLog(@"Couldn't open codec");
abort();
}
/* previously defined
#define FRAME_WIDTH 320
#define FRAME_HEIGHT 480
*/
uint8_t *rgb_data = buffer + (frameSize * ((*totalCaptured - 1) % BUFFER_FRAME_MAX_COUNT));
uint8_t *rgb_src[3] = {
rgb_data,
NULL,
NULL
};
int rgb_stride[3] = {
4 * FRAME_WIDTH,
0,
0
};
uint8_t *src[4] = {
scaleBuffer,
scaleBuffer + FRAME_WIDTH * FRAME_HEIGHT,
scaleBuffer + ( FRAME_WIDTH * FRAME_HEIGHT ) + ( FRAME_WIDTH * FRAME_HEIGHT / 4 ),
NULL
};
int stride[4] = {
FRAME_WIDTH,
FRAME_WIDTH / 2,
FRAME_WIDTH / 2,
0
};
struct SwsContext *sws;
sws = sws_getContext(FRAME_WIDTH, // src width
FRAME_HEIGHT, // src height
PIX_FMT_RGB32, // src pixel format ,
FRAME_WIDTH, // dest width
FRAME_HEIGHT, // dest height
PIX_FMT_YUV420P, // dest pix format
SWS_BILINEAR, // FLAGS
NULL,
NULL,
NULL);
int sliceHeight = sws_scale(sws,
rgb_src,
rgb_stride,
0,
FRAME_HEIGHT,
src,
stride);
// the "sliceHeight" variable evaluates to 480 in GDB at this point, which seems correct
if (sliceHeight <= 0)
{
NSLog(@"couldn't scale");
abort();
}
sws_freeContext(sws);
currentPicture->data[0] = src[0];
currentPicture->data[1] = src[1];
currentPicture->data[2] = src[2];
currentPicture->data[3] = src[3];
currentPicture->linesize[0] = stride[0];
currentPicture->linesize[1] = stride[1];
currentPicture->linesize[2] = stride[2];
currentPicture->linesize[3] = stride[3];
int out_size = avcodec_encode_video(codecContext, encodeBuffer, frameSize, currentPicture);
// the "out_size" variable evaluates to 4 in GDB, which seems incorrect