#include <string.h>
#include "roqvideo.h"
#include "bytestream.h"
#include "elbg.h"
#include "mathops.h"
Go to the source code of this file.
Data Structures | |
struct | SubcelEvaluation |
struct | CelEvaluation |
struct | RoqCodebooks |
struct | RoqTempData |
Temporary vars. More... | |
struct | CodingSpool |
Defines | |
#define | CHROMA_BIAS 1 |
#define | MAX_CBS_4x4 255 |
Maximum number of generated 4x4 codebooks. | |
#define | MAX_CBS_2x2 256 |
Maximum number of 2x2 codebooks. | |
#define | ROQ_LAMBDA_SCALE ((uint64_t) FF_LAMBDA_SCALE) |
#define | EVAL_MOTION(MOTION) |
Typedefs | |
typedef struct RoqTempData | RoqTempdata |
Temporary vars. | |
Functions | |
static void | unpack_roq_cell (roq_cell *cell, uint8_t u[4 *3]) |
static void | unpack_roq_qcell (uint8_t cb2[], roq_qcell *qcell, uint8_t u[4 *4 *3]) |
static void | enlarge_roq_mb4 (uint8_t base[3 *16], uint8_t u[3 *64]) |
static int | square (int x) |
static int | eval_sse (uint8_t *a, uint8_t *b, int count) |
static int | block_sse (uint8_t **buf1, uint8_t **buf2, int x1, int y1, int x2, int y2, int *stride1, int *stride2, int size) |
static int | eval_motion_dist (RoqContext *enc, int x, int y, motion_vect vect, int size) |
static int | squared_diff_macroblock (uint8_t a[], uint8_t b[], int size) |
static void | create_cel_evals (RoqContext *enc, RoqTempdata *tempData) |
Initialize cel evaluators and set their source coordinates. | |
static void | get_frame_mb (AVFrame *frame, int x, int y, uint8_t mb[], int dim) |
Get macroblocks from parts of the image. | |
static int | index_mb (uint8_t cluster[], uint8_t cb[], int numCB, int *outIndex, int dim) |
Find the codebook with the lowest distortion from an image. | |
static void | motion_search (RoqContext *enc, int blocksize) |
static void | gather_data_for_subcel (SubcelEvaluation *subcel, int x, int y, RoqContext *enc, RoqTempdata *tempData) |
Get distortion for all options available to a subcel. | |
static void | gather_data_for_cel (CelEvaluation *cel, RoqContext *enc, RoqTempdata *tempData) |
Get distortion for all options available to a cel. | |
static void | remap_codebooks (RoqContext *enc, RoqTempdata *tempData) |
static void | write_codebooks (RoqContext *enc, RoqTempdata *tempData) |
Write codebook chunk. | |
static uint8_t | motion_arg (motion_vect mot) |
static void | write_typecode (CodingSpool *s, uint8_t type) |
static void | reconstruct_and_encode_image (RoqContext *enc, RoqTempdata *tempData, int w, int h, int numBlocks) |
static void | frame_block_to_cell (uint8_t *block, uint8_t **data, int top, int left, int *stride) |
Create a single YUV cell from a 2x2 section of the image. | |
static void | create_clusters (AVFrame *frame, int w, int h, uint8_t *yuvClusters) |
Create YUV clusters for the entire image. | |
static void | generate_codebook (RoqContext *enc, RoqTempdata *tempdata, int *points, int inputCount, roq_cell *results, int size, int cbsize) |
static void | generate_new_codebooks (RoqContext *enc, RoqTempdata *tempData) |
static void | roq_encode_video (RoqContext *enc) |
static int | roq_encode_init (AVCodecContext *avctx) |
static void | roq_write_video_info_chunk (RoqContext *enc) |
static int | roq_encode_frame (AVCodecContext *avctx, unsigned char *buf, int buf_size, void *data) |
static int | roq_encode_end (AVCodecContext *avctx) |
Variables | |
AVCodec | ff_roq_encoder |
Based on the Switchblade3 library and the Switchblade3 FFmpeg glue by Eric Lasota.
Definition in file roqvideoenc.c.
#define CHROMA_BIAS 1 |
Definition at line 64 of file roqvideoenc.c.
Referenced by block_sse(), generate_codebook(), generate_new_codebooks(), and squared_diff_macroblock().
#define EVAL_MOTION | ( | MOTION | ) |
Value:
do { \ diff = eval_motion_dist(enc, j, i, MOTION, blocksize); \ \ if (diff < lowestdiff) { \ lowestdiff = diff; \ bestpick = MOTION; \ } \ } while(0)
Definition at line 296 of file roqvideoenc.c.
Referenced by motion_search().
#define MAX_CBS_2x2 256 |
Maximum number of 2x2 codebooks.
Definition at line 72 of file roqvideoenc.c.
Referenced by generate_new_codebooks(), and remap_codebooks().
#define MAX_CBS_4x4 255 |
Maximum number of generated 4x4 codebooks.
Can't be 256 to workaround a Quake 3 bug.
Definition at line 70 of file roqvideoenc.c.
Referenced by generate_new_codebooks(), and remap_codebooks().
#define ROQ_LAMBDA_SCALE ((uint64_t) FF_LAMBDA_SCALE) |
Definition at line 75 of file roqvideoenc.c.
Referenced by gather_data_for_cel(), gather_data_for_subcel(), and roq_encode_frame().
typedef struct RoqTempData RoqTempdata |
Temporary vars.
static int block_sse | ( | uint8_t ** | buf1, | |
uint8_t ** | buf2, | |||
int | x1, | |||
int | y1, | |||
int | x2, | |||
int | y2, | |||
int * | stride1, | |||
int * | stride2, | |||
int | size | |||
) | [static] |
Definition at line 127 of file roqvideoenc.c.
Referenced by eval_motion_dist(), gather_data_for_cel(), gather_data_for_subcel(), and reconstruct_and_encode_image().
static void create_cel_evals | ( | RoqContext * | enc, | |
RoqTempdata * | tempData | |||
) | [static] |
Initialize cel evaluators and set their source coordinates.
Definition at line 245 of file roqvideoenc.c.
Referenced by roq_encode_video().
static void create_clusters | ( | AVFrame * | frame, | |
int | w, | |||
int | h, | |||
uint8_t * | yuvClusters | |||
) | [static] |
Create YUV clusters for the entire image.
Definition at line 778 of file roqvideoenc.c.
Referenced by generate_new_codebooks().
static void enlarge_roq_mb4 | ( | uint8_t | base[3 *16], | |
uint8_t | u[3 *64] | |||
) | [static] |
static int eval_motion_dist | ( | RoqContext * | enc, | |
int | x, | |||
int | y, | |||
motion_vect | vect, | |||
int | size | |||
) | [static] |
Definition at line 143 of file roqvideoenc.c.
Referenced by gather_data_for_cel(), gather_data_for_subcel(), and motion_search().
static int eval_sse | ( | uint8_t * | a, | |
uint8_t * | b, | |||
int | count | |||
) | [inline, static] |
Definition at line 115 of file roqvideoenc.c.
Referenced by block_sse(), and squared_diff_macroblock().
static void frame_block_to_cell | ( | uint8_t * | block, | |
uint8_t ** | data, | |||
int | top, | |||
int | left, | |||
int * | stride | |||
) | [inline, static] |
Create a single YUV cell from a 2x2 section of the image.
Definition at line 757 of file roqvideoenc.c.
Referenced by create_clusters().
static void gather_data_for_cel | ( | CelEvaluation * | cel, | |
RoqContext * | enc, | |||
RoqTempdata * | tempData | |||
) | [static] |
Get distortion for all options available to a cel.
Definition at line 462 of file roqvideoenc.c.
Referenced by roq_encode_video().
static void gather_data_for_subcel | ( | SubcelEvaluation * | subcel, | |
int | x, | |||
int | y, | |||
RoqContext * | enc, | |||
RoqTempdata * | tempData | |||
) | [static] |
Get distortion for all options available to a subcel.
Definition at line 398 of file roqvideoenc.c.
Referenced by gather_data_for_cel().
static void generate_codebook | ( | RoqContext * | enc, | |
RoqTempdata * | tempdata, | |||
int * | points, | |||
int | inputCount, | |||
roq_cell * | results, | |||
int | size, | |||
int | cbsize | |||
) | [static] |
static void generate_new_codebooks | ( | RoqContext * | enc, | |
RoqTempdata * | tempData | |||
) | [static] |
static void get_frame_mb | ( | AVFrame * | frame, | |
int | x, | |||
int | y, | |||
uint8_t | mb[], | |||
int | dim | |||
) | [static] |
Get macroblocks from parts of the image.
Definition at line 263 of file roqvideoenc.c.
Referenced by gather_data_for_cel(), and gather_data_for_subcel().
static int index_mb | ( | uint8_t | cluster[], | |
uint8_t | cb[], | |||
int | numCB, | |||
int * | outIndex, | |||
int | dim | |||
) | [static] |
Find the codebook with the lowest distortion from an image.
Definition at line 278 of file roqvideoenc.c.
Referenced by gather_data_for_cel(), gather_data_for_subcel(), and generate_new_codebooks().
static uint8_t motion_arg | ( | motion_vect | mot | ) | [inline, static] |
static void motion_search | ( | RoqContext * | enc, | |
int | blocksize | |||
) | [static] |
static void reconstruct_and_encode_image | ( | RoqContext * | enc, | |
RoqTempdata * | tempData, | |||
int | w, | |||
int | h, | |||
int | numBlocks | |||
) | [static] |
static void remap_codebooks | ( | RoqContext * | enc, | |
RoqTempdata * | tempData | |||
) | [static] |
static int roq_encode_end | ( | AVCodecContext * | avctx | ) | [static] |
Definition at line 1052 of file roqvideoenc.c.
static int roq_encode_frame | ( | AVCodecContext * | avctx, | |
unsigned char * | buf, | |||
int | buf_size, | |||
void * | data | |||
) | [static] |
Definition at line 1004 of file roqvideoenc.c.
static int roq_encode_init | ( | AVCodecContext * | avctx | ) | [static] |
Definition at line 938 of file roqvideoenc.c.
static void roq_encode_video | ( | RoqContext * | enc | ) | [static] |
static void roq_write_video_info_chunk | ( | RoqContext * | enc | ) | [static] |
static int square | ( | int | x | ) | [inline, static] |
static int squared_diff_macroblock | ( | uint8_t | a[], | |
uint8_t | b[], | |||
int | size | |||
) | [inline, static] |
Definition at line 170 of file roqvideoenc.c.
Referenced by gather_data_for_subcel(), and index_mb().
static void unpack_roq_cell | ( | roq_cell * | cell, | |
uint8_t | u[4 *3] | |||
) | [static] |
static void unpack_roq_qcell | ( | uint8_t | cb2[], | |
roq_qcell * | qcell, | |||
uint8_t | u[4 *4 *3] | |||
) | [static] |
static void write_codebooks | ( | RoqContext * | enc, | |
RoqTempdata * | tempData | |||
) | [static] |
Write codebook chunk.
Definition at line 568 of file roqvideoenc.c.
Referenced by roq_encode_video().
static void write_typecode | ( | CodingSpool * | s, | |
uint8_t | type | |||
) | [static] |
Initial value:
{ .name = "roqvideo", .type = AVMEDIA_TYPE_VIDEO, .id = CODEC_ID_ROQ, .priv_data_size = sizeof(RoqContext), .init = roq_encode_init, .encode = roq_encode_frame, .close = roq_encode_end, .supported_framerates = (const AVRational[]){{30,1}, {0,0}}, .pix_fmts = (const enum PixelFormat[]){PIX_FMT_YUV444P, PIX_FMT_NONE}, .long_name = NULL_IF_CONFIG_SMALL("id RoQ video"), }
Definition at line 1068 of file roqvideoenc.c.