| Index: source/libvpx/tools_common.c
|
| ===================================================================
|
| --- source/libvpx/tools_common.c (revision 251189)
|
| +++ source/libvpx/tools_common.c (working copy)
|
| @@ -15,6 +15,10 @@
|
| #include <stdlib.h>
|
| #include <string.h>
|
|
|
| +#if CONFIG_VP8_ENCODER || CONFIG_VP9_ENCODER
|
| +#include "vpx/vp8cx.h"
|
| +#endif
|
| +
|
| #if CONFIG_VP8_DECODER || CONFIG_VP9_DECODER
|
| #include "vpx/vp8dx.h"
|
| #endif
|
| @@ -144,33 +148,128 @@
|
| return shortread;
|
| }
|
|
|
| -vpx_codec_iface_t *get_codec_interface(unsigned int fourcc) {
|
| - switch (fourcc) {
|
| +static const VpxInterface vpx_encoders[] = {
|
| +#if CONFIG_VP8_ENCODER
|
| + {"vp8", VP8_FOURCC, &vpx_codec_vp8_cx},
|
| +#endif
|
| +
|
| +#if CONFIG_VP9_ENCODER
|
| + {"vp9", VP9_FOURCC, &vpx_codec_vp9_cx},
|
| +#endif
|
| +};
|
| +
|
| +int get_vpx_encoder_count() {
|
| + return sizeof(vpx_encoders) / sizeof(vpx_encoders[0]);
|
| +}
|
| +
|
| +const VpxInterface *get_vpx_encoder_by_index(int i) {
|
| + return &vpx_encoders[i];
|
| +}
|
| +
|
| +const VpxInterface *get_vpx_encoder_by_name(const char *name) {
|
| + int i;
|
| +
|
| + for (i = 0; i < get_vpx_encoder_count(); ++i) {
|
| + const VpxInterface *encoder = get_vpx_encoder_by_index(i);
|
| + if (strcmp(encoder->name, name) == 0)
|
| + return encoder;
|
| + }
|
| +
|
| + return NULL;
|
| +}
|
| +
|
| +static const VpxInterface vpx_decoders[] = {
|
| #if CONFIG_VP8_DECODER
|
| - case VP8_FOURCC:
|
| - return vpx_codec_vp8_dx();
|
| + {"vp8", VP8_FOURCC, &vpx_codec_vp8_dx},
|
| #endif
|
| +
|
| #if CONFIG_VP9_DECODER
|
| - case VP9_FOURCC:
|
| - return vpx_codec_vp9_dx();
|
| + {"vp9", VP9_FOURCC, &vpx_codec_vp9_dx},
|
| #endif
|
| - default:
|
| - return NULL;
|
| +};
|
| +
|
| +int get_vpx_decoder_count() {
|
| + return sizeof(vpx_decoders) / sizeof(vpx_decoders[0]);
|
| +}
|
| +
|
| +const VpxInterface *get_vpx_decoder_by_index(int i) {
|
| + return &vpx_decoders[i];
|
| +}
|
| +
|
| +const VpxInterface *get_vpx_decoder_by_name(const char *name) {
|
| + int i;
|
| +
|
| + for (i = 0; i < get_vpx_decoder_count(); ++i) {
|
| + const VpxInterface *const decoder = get_vpx_decoder_by_index(i);
|
| + if (strcmp(decoder->name, name) == 0)
|
| + return decoder;
|
| }
|
| +
|
| return NULL;
|
| }
|
|
|
| +const VpxInterface *get_vpx_decoder_by_fourcc(uint32_t fourcc) {
|
| + int i;
|
| +
|
| + for (i = 0; i < get_vpx_decoder_count(); ++i) {
|
| + const VpxInterface *const decoder = get_vpx_decoder_by_index(i);
|
| + if (decoder->fourcc == fourcc)
|
| + return decoder;
|
| + }
|
| +
|
| + return NULL;
|
| +}
|
| +
|
| +// TODO(dkovalev): move this function to vpx_image.{c, h}, so it will be part
|
| +// of vpx_image_t support
|
| +int vpx_img_plane_width(const vpx_image_t *img, int plane) {
|
| + if (plane > 0 && img->x_chroma_shift > 0)
|
| + return (img->d_w + 1) >> img->x_chroma_shift;
|
| + else
|
| + return img->d_w;
|
| +}
|
| +
|
| +int vpx_img_plane_height(const vpx_image_t *img, int plane) {
|
| + if (plane > 0 && img->y_chroma_shift > 0)
|
| + return (img->d_h + 1) >> img->y_chroma_shift;
|
| + else
|
| + return img->d_h;
|
| +}
|
| +
|
| void vpx_img_write(const vpx_image_t *img, FILE *file) {
|
| - int plane, y;
|
| + int plane;
|
|
|
| for (plane = 0; plane < 3; ++plane) {
|
| const unsigned char *buf = img->planes[plane];
|
| const int stride = img->stride[plane];
|
| - const int w = plane ? (img->d_w + 1) >> 1 : img->d_w;
|
| - const int h = plane ? (img->d_h + 1) >> 1 : img->d_h;
|
| + const int w = vpx_img_plane_width(img, plane);
|
| + const int h = vpx_img_plane_height(img, plane);
|
| + int y;
|
| +
|
| for (y = 0; y < h; ++y) {
|
| fwrite(buf, 1, w, file);
|
| buf += stride;
|
| }
|
| }
|
| }
|
| +
|
| +int vpx_img_read(vpx_image_t *img, FILE *file) {
|
| + int plane;
|
| +
|
| + for (plane = 0; plane < 3; ++plane) {
|
| + unsigned char *buf = img->planes[plane];
|
| + const int stride = img->stride[plane];
|
| + const int w = vpx_img_plane_width(img, plane);
|
| + const int h = vpx_img_plane_height(img, plane);
|
| + int y;
|
| +
|
| + for (y = 0; y < h; ++y) {
|
| + if (fread(buf, 1, w, file) != w)
|
| + return 0;
|
| + buf += stride;
|
| + }
|
| + }
|
| +
|
| + return 1;
|
| +}
|
| +
|
|
|