Compare commits
2 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
4dae3ca262 | ||
![]() |
1a23086bc6 |
@@ -211,6 +211,8 @@ common_top() {
|
|||||||
$(process_forward_decls)
|
$(process_forward_decls)
|
||||||
|
|
||||||
$(declare_function_pointers c $ALL_ARCHS)
|
$(declare_function_pointers c $ALL_ARCHS)
|
||||||
|
|
||||||
|
void ${symbol:-rtcd}(void);
|
||||||
EOF
|
EOF
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -231,11 +233,10 @@ x86() {
|
|||||||
|
|
||||||
cat <<EOF
|
cat <<EOF
|
||||||
$(common_top)
|
$(common_top)
|
||||||
void ${symbol:-rtcd}(void);
|
|
||||||
|
|
||||||
#ifdef RTCD_C
|
#ifdef RTCD_C
|
||||||
#include "vpx_ports/x86.h"
|
#include "vpx_ports/x86.h"
|
||||||
void ${symbol:-rtcd}(void)
|
static void setup_rtcd_internal(void)
|
||||||
{
|
{
|
||||||
int flags = x86_simd_caps();
|
int flags = x86_simd_caps();
|
||||||
|
|
||||||
@@ -261,11 +262,9 @@ arm() {
|
|||||||
$(common_top)
|
$(common_top)
|
||||||
#include "vpx_config.h"
|
#include "vpx_config.h"
|
||||||
|
|
||||||
void ${symbol:-rtcd}(void);
|
|
||||||
|
|
||||||
#ifdef RTCD_C
|
#ifdef RTCD_C
|
||||||
#include "vpx_ports/arm.h"
|
#include "vpx_ports/arm.h"
|
||||||
void ${symbol:-rtcd}(void)
|
static void setup_rtcd_internal(void)
|
||||||
{
|
{
|
||||||
int flags = arm_cpu_caps();
|
int flags = arm_cpu_caps();
|
||||||
|
|
||||||
@@ -285,10 +284,8 @@ unoptimized() {
|
|||||||
$(common_top)
|
$(common_top)
|
||||||
#include "vpx_config.h"
|
#include "vpx_config.h"
|
||||||
|
|
||||||
void ${symbol:-rtcd}(void);
|
|
||||||
|
|
||||||
#ifdef RTCD_C
|
#ifdef RTCD_C
|
||||||
void ${symbol:-rtcd}(void)
|
static void setup_rtcd_internal(void)
|
||||||
{
|
{
|
||||||
$(set_function_pointers c)
|
$(set_function_pointers c)
|
||||||
}
|
}
|
||||||
|
@@ -83,57 +83,6 @@ static int get_cpu_count()
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#if HAVE_PTHREAD_H
|
|
||||||
#include <pthread.h>
|
|
||||||
static void once(void (*func)(void))
|
|
||||||
{
|
|
||||||
static pthread_once_t lock = PTHREAD_ONCE_INIT;
|
|
||||||
pthread_once(&lock, func);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#elif defined(_WIN32)
|
|
||||||
static void once(void (*func)(void))
|
|
||||||
{
|
|
||||||
/* Using a static initializer here rather than InitializeCriticalSection()
|
|
||||||
* since there's no race-free context in which to execute it. Protecting
|
|
||||||
* it with an atomic op like InterlockedCompareExchangePointer introduces
|
|
||||||
* an x86 dependency, and InitOnceExecuteOnce requires Vista.
|
|
||||||
*/
|
|
||||||
static CRITICAL_SECTION lock = {(void *)-1, -1, 0, 0, 0, 0};
|
|
||||||
static int done;
|
|
||||||
|
|
||||||
EnterCriticalSection(&lock);
|
|
||||||
|
|
||||||
if (!done)
|
|
||||||
{
|
|
||||||
func();
|
|
||||||
done = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
LeaveCriticalSection(&lock);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#else
|
|
||||||
/* No-op version that performs no synchronization. vpx_rtcd() is idempotent,
|
|
||||||
* so as long as your platform provides atomic loads/stores of pointers
|
|
||||||
* no synchronization is strictly necessary.
|
|
||||||
*/
|
|
||||||
|
|
||||||
static void once(void (*func)(void))
|
|
||||||
{
|
|
||||||
static int done;
|
|
||||||
|
|
||||||
if(!done)
|
|
||||||
{
|
|
||||||
func();
|
|
||||||
done = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
void vp8_machine_specific_config(VP8_COMMON *ctx)
|
void vp8_machine_specific_config(VP8_COMMON *ctx)
|
||||||
{
|
{
|
||||||
#if CONFIG_MULTITHREAD
|
#if CONFIG_MULTITHREAD
|
||||||
@@ -145,6 +94,4 @@ void vp8_machine_specific_config(VP8_COMMON *ctx)
|
|||||||
#elif ARCH_X86 || ARCH_X86_64
|
#elif ARCH_X86 || ARCH_X86_64
|
||||||
ctx->cpu_caps = x86_simd_caps();
|
ctx->cpu_caps = x86_simd_caps();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
once(vpx_rtcd);
|
|
||||||
}
|
}
|
||||||
|
@@ -106,7 +106,7 @@ extern "C"
|
|||||||
int Width; // width of data passed to the compressor
|
int Width; // width of data passed to the compressor
|
||||||
int Height; // height of data passed to the compressor
|
int Height; // height of data passed to the compressor
|
||||||
struct vpx_rational timebase;
|
struct vpx_rational timebase;
|
||||||
int target_bandwidth; // bandwidth to be used in kilobits per second
|
unsigned int target_bandwidth; // bandwidth to be used in kilobits per second
|
||||||
|
|
||||||
int noise_sensitivity; // parameter used for applying pre processing blur: recommendation 0
|
int noise_sensitivity; // parameter used for applying pre processing blur: recommendation 0
|
||||||
int Sharpness; // parameter used for sharpening output: recommendation 0:
|
int Sharpness; // parameter used for sharpening output: recommendation 0:
|
||||||
|
@@ -10,3 +10,60 @@
|
|||||||
#include "vpx_config.h"
|
#include "vpx_config.h"
|
||||||
#define RTCD_C
|
#define RTCD_C
|
||||||
#include "vpx_rtcd.h"
|
#include "vpx_rtcd.h"
|
||||||
|
|
||||||
|
#if CONFIG_MULTITHREAD && HAVE_PTHREAD_H
|
||||||
|
#include <pthread.h>
|
||||||
|
static void once(void (*func)(void))
|
||||||
|
{
|
||||||
|
static pthread_once_t lock = PTHREAD_ONCE_INIT;
|
||||||
|
pthread_once(&lock, func);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#elif CONFIG_MULTITHREAD && defined(_WIN32)
|
||||||
|
#include <windows.h>
|
||||||
|
static void once(void (*func)(void))
|
||||||
|
{
|
||||||
|
/* Using a static initializer here rather than InitializeCriticalSection()
|
||||||
|
* since there's no race-free context in which to execute it. Protecting
|
||||||
|
* it with an atomic op like InterlockedCompareExchangePointer introduces
|
||||||
|
* an x86 dependency, and InitOnceExecuteOnce requires Vista.
|
||||||
|
*/
|
||||||
|
static CRITICAL_SECTION lock = {(void *)-1, -1, 0, 0, 0, 0};
|
||||||
|
static int done;
|
||||||
|
|
||||||
|
EnterCriticalSection(&lock);
|
||||||
|
|
||||||
|
if (!done)
|
||||||
|
{
|
||||||
|
func();
|
||||||
|
done = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
LeaveCriticalSection(&lock);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#else
|
||||||
|
/* No-op version that performs no synchronization. vpx_rtcd() is idempotent,
|
||||||
|
* so as long as your platform provides atomic loads/stores of pointers
|
||||||
|
* no synchronization is strictly necessary.
|
||||||
|
*/
|
||||||
|
|
||||||
|
static void once(void (*func)(void))
|
||||||
|
{
|
||||||
|
static int done;
|
||||||
|
|
||||||
|
if(!done)
|
||||||
|
{
|
||||||
|
func();
|
||||||
|
done = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
void vpx_rtcd()
|
||||||
|
{
|
||||||
|
once(setup_rtcd_internal);
|
||||||
|
}
|
||||||
|
@@ -549,8 +549,8 @@ static void setup_token_decoder(VP8D_COMP *pbi,
|
|||||||
{
|
{
|
||||||
vp8_reader *bool_decoder = &pbi->bc2;
|
vp8_reader *bool_decoder = &pbi->bc2;
|
||||||
unsigned int partition_idx;
|
unsigned int partition_idx;
|
||||||
int fragment_idx;
|
unsigned int fragment_idx;
|
||||||
int num_token_partitions;
|
unsigned int num_token_partitions;
|
||||||
const unsigned char *first_fragment_end = pbi->fragments[0] +
|
const unsigned char *first_fragment_end = pbi->fragments[0] +
|
||||||
pbi->fragment_sizes[0];
|
pbi->fragment_sizes[0];
|
||||||
|
|
||||||
@@ -1132,7 +1132,7 @@ int vp8_decode_frame(VP8D_COMP *pbi)
|
|||||||
#if CONFIG_MULTITHREAD
|
#if CONFIG_MULTITHREAD
|
||||||
if (pbi->b_multithreaded_rd && pc->multi_token_partition != ONE_PARTITION)
|
if (pbi->b_multithreaded_rd && pc->multi_token_partition != ONE_PARTITION)
|
||||||
{
|
{
|
||||||
int i;
|
unsigned int i;
|
||||||
vp8mt_decode_mb_rows(pbi, xd);
|
vp8mt_decode_mb_rows(pbi, xd);
|
||||||
vp8_yv12_extend_frame_borders(&pc->yv12_fb[pc->new_fb_idx]); /*cm->frame_to_show);*/
|
vp8_yv12_extend_frame_borders(&pc->yv12_fb[pc->new_fb_idx]); /*cm->frame_to_show);*/
|
||||||
for (i = 0; i < pbi->decoding_thread_count; ++i)
|
for (i = 0; i < pbi->decoding_thread_count; ++i)
|
||||||
|
@@ -300,7 +300,7 @@ int vp8dx_receive_compressed_data(VP8D_COMP *pbi, unsigned long size, const unsi
|
|||||||
if (pbi->num_fragments == 0)
|
if (pbi->num_fragments == 0)
|
||||||
{
|
{
|
||||||
/* New frame, reset fragment pointers and sizes */
|
/* New frame, reset fragment pointers and sizes */
|
||||||
vpx_memset(pbi->fragments, 0, sizeof(pbi->fragments));
|
vpx_memset((void*)pbi->fragments, 0, sizeof(pbi->fragments));
|
||||||
vpx_memset(pbi->fragment_sizes, 0, sizeof(pbi->fragment_sizes));
|
vpx_memset(pbi->fragment_sizes, 0, sizeof(pbi->fragment_sizes));
|
||||||
}
|
}
|
||||||
if (pbi->input_fragments && !(source == NULL && size == 0))
|
if (pbi->input_fragments && !(source == NULL && size == 0))
|
||||||
|
@@ -62,7 +62,7 @@ typedef struct VP8D_COMP
|
|||||||
volatile int b_multithreaded_rd;
|
volatile int b_multithreaded_rd;
|
||||||
int max_threads;
|
int max_threads;
|
||||||
int current_mb_col_main;
|
int current_mb_col_main;
|
||||||
int decoding_thread_count;
|
unsigned int decoding_thread_count;
|
||||||
int allocated_decoding_thread_count;
|
int allocated_decoding_thread_count;
|
||||||
|
|
||||||
int mt_baseline_filter_level[MAX_MB_SEGMENTS];
|
int mt_baseline_filter_level[MAX_MB_SEGMENTS];
|
||||||
|
@@ -667,7 +667,7 @@ static THREAD_FUNCTION thread_decoding_proc(void *p_data)
|
|||||||
void vp8_decoder_create_threads(VP8D_COMP *pbi)
|
void vp8_decoder_create_threads(VP8D_COMP *pbi)
|
||||||
{
|
{
|
||||||
int core_count = 0;
|
int core_count = 0;
|
||||||
int ithread;
|
unsigned int ithread;
|
||||||
|
|
||||||
pbi->b_multithreaded_rd = 0;
|
pbi->b_multithreaded_rd = 0;
|
||||||
pbi->allocated_decoding_thread_count = 0;
|
pbi->allocated_decoding_thread_count = 0;
|
||||||
@@ -881,7 +881,8 @@ void vp8_decoder_remove_threads(VP8D_COMP *pbi)
|
|||||||
void vp8mt_decode_mb_rows( VP8D_COMP *pbi, MACROBLOCKD *xd)
|
void vp8mt_decode_mb_rows( VP8D_COMP *pbi, MACROBLOCKD *xd)
|
||||||
{
|
{
|
||||||
VP8_COMMON *pc = &pbi->common;
|
VP8_COMMON *pc = &pbi->common;
|
||||||
int i;
|
unsigned int i;
|
||||||
|
int j;
|
||||||
|
|
||||||
int filter_level = pc->filter_level;
|
int filter_level = pc->filter_level;
|
||||||
|
|
||||||
@@ -892,19 +893,19 @@ void vp8mt_decode_mb_rows( VP8D_COMP *pbi, MACROBLOCKD *xd)
|
|||||||
vpx_memset(pbi->mt_uabove_row[0] + (VP8BORDERINPIXELS>>1)-1, 127, (pc->yv12_fb[pc->lst_fb_idx].y_width>>1) +5);
|
vpx_memset(pbi->mt_uabove_row[0] + (VP8BORDERINPIXELS>>1)-1, 127, (pc->yv12_fb[pc->lst_fb_idx].y_width>>1) +5);
|
||||||
vpx_memset(pbi->mt_vabove_row[0] + (VP8BORDERINPIXELS>>1)-1, 127, (pc->yv12_fb[pc->lst_fb_idx].y_width>>1) +5);
|
vpx_memset(pbi->mt_vabove_row[0] + (VP8BORDERINPIXELS>>1)-1, 127, (pc->yv12_fb[pc->lst_fb_idx].y_width>>1) +5);
|
||||||
|
|
||||||
for (i=1; i<pc->mb_rows; i++)
|
for (j=1; j<pc->mb_rows; j++)
|
||||||
{
|
{
|
||||||
vpx_memset(pbi->mt_yabove_row[i] + VP8BORDERINPIXELS-1, (unsigned char)129, 1);
|
vpx_memset(pbi->mt_yabove_row[j] + VP8BORDERINPIXELS-1, (unsigned char)129, 1);
|
||||||
vpx_memset(pbi->mt_uabove_row[i] + (VP8BORDERINPIXELS>>1)-1, (unsigned char)129, 1);
|
vpx_memset(pbi->mt_uabove_row[j] + (VP8BORDERINPIXELS>>1)-1, (unsigned char)129, 1);
|
||||||
vpx_memset(pbi->mt_vabove_row[i] + (VP8BORDERINPIXELS>>1)-1, (unsigned char)129, 1);
|
vpx_memset(pbi->mt_vabove_row[j] + (VP8BORDERINPIXELS>>1)-1, (unsigned char)129, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Set left_col to 129 initially */
|
/* Set left_col to 129 initially */
|
||||||
for (i=0; i<pc->mb_rows; i++)
|
for (j=0; j<pc->mb_rows; j++)
|
||||||
{
|
{
|
||||||
vpx_memset(pbi->mt_yleft_col[i], (unsigned char)129, 16);
|
vpx_memset(pbi->mt_yleft_col[j], (unsigned char)129, 16);
|
||||||
vpx_memset(pbi->mt_uleft_col[i], (unsigned char)129, 8);
|
vpx_memset(pbi->mt_uleft_col[j], (unsigned char)129, 8);
|
||||||
vpx_memset(pbi->mt_vleft_col[i], (unsigned char)129, 8);
|
vpx_memset(pbi->mt_vleft_col[j], (unsigned char)129, 8);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Initialize the loop filter for this frame. */
|
/* Initialize the loop filter for this frame. */
|
||||||
|
@@ -107,7 +107,7 @@ typedef struct macroblock
|
|||||||
|
|
||||||
int skip;
|
int skip;
|
||||||
|
|
||||||
int encode_breakout;
|
unsigned int encode_breakout;
|
||||||
|
|
||||||
//char * gf_active_ptr;
|
//char * gf_active_ptr;
|
||||||
signed char *gf_active_ptr;
|
signed char *gf_active_ptr;
|
||||||
|
@@ -4909,7 +4909,7 @@ int vp8_get_compressed_data(VP8_COMP *cpi, unsigned int *frame_flags, unsigned l
|
|||||||
|
|
||||||
if (cpi->oxcf.number_of_layers > 1)
|
if (cpi->oxcf.number_of_layers > 1)
|
||||||
{
|
{
|
||||||
int i;
|
unsigned int i;
|
||||||
|
|
||||||
// Update frame rates for each layer
|
// Update frame rates for each layer
|
||||||
for (i=0; i<cpi->oxcf.number_of_layers; i++)
|
for (i=0; i<cpi->oxcf.number_of_layers; i++)
|
||||||
|
@@ -458,7 +458,7 @@ static void check_for_encode_breakout(unsigned int sse, MACROBLOCK* x)
|
|||||||
if (sse < x->encode_breakout)
|
if (sse < x->encode_breakout)
|
||||||
{
|
{
|
||||||
// Check u and v to make sure skip is ok
|
// Check u and v to make sure skip is ok
|
||||||
int sse2 = 0;
|
unsigned int sse2 = 0;
|
||||||
|
|
||||||
sse2 = VP8_UVSSE(x);
|
sse2 = VP8_UVSSE(x);
|
||||||
|
|
||||||
|
@@ -357,7 +357,7 @@ static void calc_iframe_target_size(VP8_COMP *cpi)
|
|||||||
{
|
{
|
||||||
// boost defaults to half second
|
// boost defaults to half second
|
||||||
int kf_boost;
|
int kf_boost;
|
||||||
int target;
|
unsigned int target;
|
||||||
|
|
||||||
// Clear down mmx registers to allow floating point in what follows
|
// Clear down mmx registers to allow floating point in what follows
|
||||||
vp8_clear_system_state(); //__asm emms;
|
vp8_clear_system_state(); //__asm emms;
|
||||||
|
@@ -1766,7 +1766,7 @@ static int evaluate_inter_mode_rd(int mdcounts[4],
|
|||||||
{
|
{
|
||||||
unsigned int sse;
|
unsigned int sse;
|
||||||
unsigned int var;
|
unsigned int var;
|
||||||
int threshold = (xd->block[0].dequant[1]
|
unsigned int threshold = (xd->block[0].dequant[1]
|
||||||
* xd->block[0].dequant[1] >>4);
|
* xd->block[0].dequant[1] >>4);
|
||||||
|
|
||||||
if(threshold < x->encode_breakout)
|
if(threshold < x->encode_breakout)
|
||||||
@@ -1785,7 +1785,7 @@ static int evaluate_inter_mode_rd(int mdcounts[4],
|
|||||||
(sse /2 > var && sse-var < 64))
|
(sse /2 > var && sse-var < 64))
|
||||||
{
|
{
|
||||||
// Check u and v to make sure skip is ok
|
// Check u and v to make sure skip is ok
|
||||||
int sse2= VP8_UVSSE(x);
|
unsigned int sse2 = VP8_UVSSE(x);
|
||||||
if (sse2 * 2 < threshold)
|
if (sse2 * 2 < threshold)
|
||||||
{
|
{
|
||||||
x->skip = 1;
|
x->skip = 1;
|
||||||
|
@@ -9,6 +9,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include "vpx_rtcd.h"
|
||||||
#include "vpx/vpx_codec.h"
|
#include "vpx/vpx_codec.h"
|
||||||
#include "vpx/internal/vpx_codec_internal.h"
|
#include "vpx/internal/vpx_codec_internal.h"
|
||||||
#include "vpx_version.h"
|
#include "vpx_version.h"
|
||||||
@@ -227,7 +228,7 @@ static vpx_codec_err_t validate_config(vpx_codec_alg_priv_t *ctx,
|
|||||||
|
|
||||||
if (cfg->ts_number_layers > 1)
|
if (cfg->ts_number_layers > 1)
|
||||||
{
|
{
|
||||||
int i;
|
unsigned int i;
|
||||||
RANGE_CHECK_HI(cfg, ts_periodicity, 16);
|
RANGE_CHECK_HI(cfg, ts_periodicity, 16);
|
||||||
|
|
||||||
for (i=1; i<cfg->ts_number_layers; i++)
|
for (i=1; i<cfg->ts_number_layers; i++)
|
||||||
@@ -568,6 +569,8 @@ static vpx_codec_err_t vp8e_init(vpx_codec_ctx_t *ctx,
|
|||||||
|
|
||||||
struct VP8_COMP *optr;
|
struct VP8_COMP *optr;
|
||||||
|
|
||||||
|
vpx_rtcd();
|
||||||
|
|
||||||
if (!ctx->priv)
|
if (!ctx->priv)
|
||||||
{
|
{
|
||||||
priv = calloc(1, sizeof(struct vpx_codec_alg_priv));
|
priv = calloc(1, sizeof(struct vpx_codec_alg_priv));
|
||||||
|
@@ -11,6 +11,7 @@
|
|||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include "vpx_rtcd.h"
|
||||||
#include "vpx/vpx_decoder.h"
|
#include "vpx/vpx_decoder.h"
|
||||||
#include "vpx/vp8dx.h"
|
#include "vpx/vp8dx.h"
|
||||||
#include "vpx/internal/vpx_codec_internal.h"
|
#include "vpx/internal/vpx_codec_internal.h"
|
||||||
@@ -187,6 +188,8 @@ static vpx_codec_err_t vp8_init(vpx_codec_ctx_t *ctx,
|
|||||||
vpx_codec_err_t res = VPX_CODEC_OK;
|
vpx_codec_err_t res = VPX_CODEC_OK;
|
||||||
(void) data;
|
(void) data;
|
||||||
|
|
||||||
|
vpx_rtcd();
|
||||||
|
|
||||||
/* This function only allocates space for the vpx_codec_alg_priv_t
|
/* This function only allocates space for the vpx_codec_alg_priv_t
|
||||||
* structure. More memory may be required at the time the stream
|
* structure. More memory may be required at the time the stream
|
||||||
* information becomes known.
|
* information becomes known.
|
||||||
|
@@ -113,6 +113,10 @@ extern "C" {
|
|||||||
* function directly, to ensure that the ABI version number parameter
|
* function directly, to ensure that the ABI version number parameter
|
||||||
* is properly initialized.
|
* is properly initialized.
|
||||||
*
|
*
|
||||||
|
* If the library was configured with --disable-multithread, this call
|
||||||
|
* is not thread safe and should be guarded with a lock if being used
|
||||||
|
* in a multithreaded context.
|
||||||
|
*
|
||||||
* In XMA mode (activated by setting VPX_CODEC_USE_XMA in the flags
|
* In XMA mode (activated by setting VPX_CODEC_USE_XMA in the flags
|
||||||
* parameter), the storage pointed to by the cfg parameter must be
|
* parameter), the storage pointed to by the cfg parameter must be
|
||||||
* kept readable and stable until all memory maps have been set.
|
* kept readable and stable until all memory maps have been set.
|
||||||
|
@@ -655,6 +655,10 @@ extern "C" {
|
|||||||
* function directly, to ensure that the ABI version number parameter
|
* function directly, to ensure that the ABI version number parameter
|
||||||
* is properly initialized.
|
* is properly initialized.
|
||||||
*
|
*
|
||||||
|
* If the library was configured with --disable-multithread, this call
|
||||||
|
* is not thread safe and should be guarded with a lock if being used
|
||||||
|
* in a multithreaded context.
|
||||||
|
*
|
||||||
* In XMA mode (activated by setting VPX_CODEC_USE_XMA in the flags
|
* In XMA mode (activated by setting VPX_CODEC_USE_XMA in the flags
|
||||||
* parameter), the storage pointed to by the cfg parameter must be
|
* parameter), the storage pointed to by the cfg parameter must be
|
||||||
* kept readable and stable until all memory maps have been set.
|
* kept readable and stable until all memory maps have been set.
|
||||||
|
Reference in New Issue
Block a user