mirror of
https://repo.dactyloidae.xyz/Dactyloidae/UXP.git
synced 2026-09-27 02:47:31 +09:00
Merge remote-tracking branch 'origin/tracking' into custom
This commit is contained in:
commit
1822f2031e
3280 changed files with 281114 additions and 237673 deletions
|
|
@ -1,166 +0,0 @@
|
|||
/********************************************************************
|
||||
* *
|
||||
* THIS FILE IS PART OF THE OggTheora SOFTWARE CODEC SOURCE CODE. *
|
||||
* USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS *
|
||||
* GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
|
||||
* IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. *
|
||||
* *
|
||||
* THE Theora SOURCE CODE IS COPYRIGHT (C) 2002-2009 *
|
||||
* by the Xiph.Org Foundation and contributors http://www.xiph.org/ *
|
||||
* *
|
||||
********************************************************************
|
||||
|
||||
function:
|
||||
last mod: $Id: apiwrapper.c 16503 2009-08-22 18:14:02Z giles $
|
||||
|
||||
********************************************************************/
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <limits.h>
|
||||
#include "apiwrapper.h"
|
||||
|
||||
|
||||
|
||||
const char *theora_version_string(void){
|
||||
return th_version_string();
|
||||
}
|
||||
|
||||
ogg_uint32_t theora_version_number(void){
|
||||
return th_version_number();
|
||||
}
|
||||
|
||||
void theora_info_init(theora_info *_ci){
|
||||
memset(_ci,0,sizeof(*_ci));
|
||||
}
|
||||
|
||||
void theora_info_clear(theora_info *_ci){
|
||||
th_api_wrapper *api;
|
||||
api=(th_api_wrapper *)_ci->codec_setup;
|
||||
memset(_ci,0,sizeof(*_ci));
|
||||
if(api!=NULL){
|
||||
if(api->clear!=NULL)(*api->clear)(api);
|
||||
_ogg_free(api);
|
||||
}
|
||||
}
|
||||
|
||||
void theora_clear(theora_state *_th){
|
||||
/*Provide compatibility with mixed encoder and decoder shared lib versions.*/
|
||||
if(_th->internal_decode!=NULL){
|
||||
(*((oc_state_dispatch_vtable *)_th->internal_decode)->clear)(_th);
|
||||
}
|
||||
if(_th->internal_encode!=NULL){
|
||||
(*((oc_state_dispatch_vtable *)_th->internal_encode)->clear)(_th);
|
||||
}
|
||||
if(_th->i!=NULL)theora_info_clear(_th->i);
|
||||
memset(_th,0,sizeof(*_th));
|
||||
}
|
||||
|
||||
int theora_control(theora_state *_th,int _req,void *_buf,size_t _buf_sz){
|
||||
/*Provide compatibility with mixed encoder and decoder shared lib versions.*/
|
||||
if(_th->internal_decode!=NULL){
|
||||
return (*((oc_state_dispatch_vtable *)_th->internal_decode)->control)(_th,
|
||||
_req,_buf,_buf_sz);
|
||||
}
|
||||
else if(_th->internal_encode!=NULL){
|
||||
return (*((oc_state_dispatch_vtable *)_th->internal_encode)->control)(_th,
|
||||
_req,_buf,_buf_sz);
|
||||
}
|
||||
else return TH_EINVAL;
|
||||
}
|
||||
|
||||
ogg_int64_t theora_granule_frame(theora_state *_th,ogg_int64_t _gp){
|
||||
/*Provide compatibility with mixed encoder and decoder shared lib versions.*/
|
||||
if(_th->internal_decode!=NULL){
|
||||
return (*((oc_state_dispatch_vtable *)_th->internal_decode)->granule_frame)(
|
||||
_th,_gp);
|
||||
}
|
||||
else if(_th->internal_encode!=NULL){
|
||||
return (*((oc_state_dispatch_vtable *)_th->internal_encode)->granule_frame)(
|
||||
_th,_gp);
|
||||
}
|
||||
else return -1;
|
||||
}
|
||||
|
||||
double theora_granule_time(theora_state *_th, ogg_int64_t _gp){
|
||||
/*Provide compatibility with mixed encoder and decoder shared lib versions.*/
|
||||
if(_th->internal_decode!=NULL){
|
||||
return (*((oc_state_dispatch_vtable *)_th->internal_decode)->granule_time)(
|
||||
_th,_gp);
|
||||
}
|
||||
else if(_th->internal_encode!=NULL){
|
||||
return (*((oc_state_dispatch_vtable *)_th->internal_encode)->granule_time)(
|
||||
_th,_gp);
|
||||
}
|
||||
else return -1;
|
||||
}
|
||||
|
||||
void oc_theora_info2th_info(th_info *_info,const theora_info *_ci){
|
||||
_info->version_major=_ci->version_major;
|
||||
_info->version_minor=_ci->version_minor;
|
||||
_info->version_subminor=_ci->version_subminor;
|
||||
_info->frame_width=_ci->width;
|
||||
_info->frame_height=_ci->height;
|
||||
_info->pic_width=_ci->frame_width;
|
||||
_info->pic_height=_ci->frame_height;
|
||||
_info->pic_x=_ci->offset_x;
|
||||
_info->pic_y=_ci->offset_y;
|
||||
_info->fps_numerator=_ci->fps_numerator;
|
||||
_info->fps_denominator=_ci->fps_denominator;
|
||||
_info->aspect_numerator=_ci->aspect_numerator;
|
||||
_info->aspect_denominator=_ci->aspect_denominator;
|
||||
switch(_ci->colorspace){
|
||||
case OC_CS_ITU_REC_470M:_info->colorspace=TH_CS_ITU_REC_470M;break;
|
||||
case OC_CS_ITU_REC_470BG:_info->colorspace=TH_CS_ITU_REC_470BG;break;
|
||||
default:_info->colorspace=TH_CS_UNSPECIFIED;break;
|
||||
}
|
||||
switch(_ci->pixelformat){
|
||||
case OC_PF_420:_info->pixel_fmt=TH_PF_420;break;
|
||||
case OC_PF_422:_info->pixel_fmt=TH_PF_422;break;
|
||||
case OC_PF_444:_info->pixel_fmt=TH_PF_444;break;
|
||||
default:_info->pixel_fmt=TH_PF_RSVD;
|
||||
}
|
||||
_info->target_bitrate=_ci->target_bitrate;
|
||||
_info->quality=_ci->quality;
|
||||
_info->keyframe_granule_shift=_ci->keyframe_frequency_force>0?
|
||||
OC_MINI(31,oc_ilog(_ci->keyframe_frequency_force-1)):0;
|
||||
}
|
||||
|
||||
int theora_packet_isheader(ogg_packet *_op){
|
||||
return th_packet_isheader(_op);
|
||||
}
|
||||
|
||||
int theora_packet_iskeyframe(ogg_packet *_op){
|
||||
return th_packet_iskeyframe(_op);
|
||||
}
|
||||
|
||||
int theora_granule_shift(theora_info *_ci){
|
||||
/*This breaks when keyframe_frequency_force is not positive or is larger than
|
||||
2**31 (if your int is more than 32 bits), but that's what the original
|
||||
function does.*/
|
||||
return oc_ilog(_ci->keyframe_frequency_force-1);
|
||||
}
|
||||
|
||||
void theora_comment_init(theora_comment *_tc){
|
||||
th_comment_init((th_comment *)_tc);
|
||||
}
|
||||
|
||||
char *theora_comment_query(theora_comment *_tc,char *_tag,int _count){
|
||||
return th_comment_query((th_comment *)_tc,_tag,_count);
|
||||
}
|
||||
|
||||
int theora_comment_query_count(theora_comment *_tc,char *_tag){
|
||||
return th_comment_query_count((th_comment *)_tc,_tag);
|
||||
}
|
||||
|
||||
void theora_comment_clear(theora_comment *_tc){
|
||||
th_comment_clear((th_comment *)_tc);
|
||||
}
|
||||
|
||||
void theora_comment_add(theora_comment *_tc,char *_comment){
|
||||
th_comment_add((th_comment *)_tc,_comment);
|
||||
}
|
||||
|
||||
void theora_comment_add_tag(theora_comment *_tc, char *_tag, char *_value){
|
||||
th_comment_add_tag((th_comment *)_tc,_tag,_value);
|
||||
}
|
||||
|
|
@ -1,54 +0,0 @@
|
|||
/********************************************************************
|
||||
* *
|
||||
* THIS FILE IS PART OF THE OggTheora SOFTWARE CODEC SOURCE CODE. *
|
||||
* USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS *
|
||||
* GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
|
||||
* IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. *
|
||||
* *
|
||||
* THE Theora SOURCE CODE IS COPYRIGHT (C) 2002-2009 *
|
||||
* by the Xiph.Org Foundation and contributors http://www.xiph.org/ *
|
||||
* *
|
||||
********************************************************************
|
||||
|
||||
function:
|
||||
last mod: $Id: apiwrapper.h 13596 2007-08-23 20:05:38Z tterribe $
|
||||
|
||||
********************************************************************/
|
||||
|
||||
#if !defined(_apiwrapper_H)
|
||||
# define _apiwrapper_H (1)
|
||||
# include <ogg/ogg.h>
|
||||
# include <theora/theora.h>
|
||||
# include "theora/theoradec.h"
|
||||
# include "theora/theoraenc.h"
|
||||
# include "state.h"
|
||||
|
||||
typedef struct th_api_wrapper th_api_wrapper;
|
||||
typedef struct th_api_info th_api_info;
|
||||
|
||||
/*Provide an entry point for the codec setup to clear itself in case we ever
|
||||
want to break pieces off into a common base library shared by encoder and
|
||||
decoder.
|
||||
In addition, this makes several other pieces of the API wrapper cleaner.*/
|
||||
typedef void (*oc_setup_clear_func)(void *_ts);
|
||||
|
||||
/*Generally only one of these pointers will be non-NULL in any given instance.
|
||||
Technically we do not even really need this struct, since we should be able
|
||||
to figure out which one from "context", but doing it this way makes sure we
|
||||
don't flub it up.*/
|
||||
struct th_api_wrapper{
|
||||
oc_setup_clear_func clear;
|
||||
th_setup_info *setup;
|
||||
th_dec_ctx *decode;
|
||||
th_enc_ctx *encode;
|
||||
};
|
||||
|
||||
struct th_api_info{
|
||||
th_api_wrapper api;
|
||||
theora_info info;
|
||||
};
|
||||
|
||||
|
||||
void oc_theora_info2th_info(th_info *_info,const theora_info *_ci);
|
||||
|
||||
#endif
|
||||
55
media/libtheora/lib/arm/arm2gnu.pl
Normal file → Executable file
55
media/libtheora/lib/arm/arm2gnu.pl
Normal file → Executable file
|
|
@ -23,6 +23,7 @@ $\ = "\n"; # automatically add newline on print
|
|||
$n=0;
|
||||
|
||||
$thumb = 0; # ARM mode by default, not Thumb.
|
||||
@proc_stack = ();
|
||||
|
||||
LINE:
|
||||
while (<>) {
|
||||
|
|
@ -85,13 +86,19 @@ while (<>) {
|
|||
# ".rdata" doesn't work in 'as' version 2.13.2, as it is ".rodata" there.
|
||||
#
|
||||
if ( /\bAREA\b/ ) {
|
||||
my $align;
|
||||
$align = "2";
|
||||
if ( /ALIGN=(\d+)/ ) {
|
||||
$align = $1;
|
||||
}
|
||||
if ( /CODE/ ) {
|
||||
$nxstack = 1;
|
||||
}
|
||||
s/^(.+)CODE(.+)READONLY(.*)/ .text/;
|
||||
s/^(.+)DATA(.+)READONLY(.*)/ .section .rdata\n .align 2/;
|
||||
s/^(.+)\|\|\.data\|\|(.+)/ .data\n .align 2/;
|
||||
s/^(.+)DATA(.+)READONLY(.*)/ .section .rdata/;
|
||||
s/^(.+)\|\|\.data\|\|(.+)/ .data/;
|
||||
s/^(.+)\|\|\.bss\|\|(.+)/ .bss/;
|
||||
s/$/; .p2align $align/;
|
||||
}
|
||||
|
||||
s/\|\|\.constdata\$(\d+)\|\|/.L_CONST$1/; # ||.constdata$3||
|
||||
|
|
@ -105,12 +112,30 @@ while (<>) {
|
|||
s/\bCODE16\b/.code 16/ && do {$thumb = 1};
|
||||
if (/\bPROC\b/)
|
||||
{
|
||||
print " .thumb_func" if ($thumb);
|
||||
my $prefix;
|
||||
my $proc;
|
||||
/^([A-Za-z_\.]\w+)\b/;
|
||||
$proc = $1;
|
||||
$prefix = "";
|
||||
if ($proc)
|
||||
{
|
||||
$prefix = $prefix.sprintf("\t.type\t%s, %%function; ",$proc);
|
||||
push(@proc_stack, $proc);
|
||||
s/^[A-Za-z_\.]\w+/$&:/;
|
||||
}
|
||||
$prefix = $prefix."\t.thumb_func; " if ($thumb);
|
||||
s/\bPROC\b/@ $&/;
|
||||
$_ = $prefix.$_;
|
||||
}
|
||||
s/^(\s*)(S|Q|SH|U|UQ|UH)ASX\b/$1$2ADDSUBX/;
|
||||
s/^(\s*)(S|Q|SH|U|UQ|UH)SAX\b/$1$2SUBADDX/;
|
||||
s/\bENDP\b/@ $&/;
|
||||
if (/\bENDP\b/)
|
||||
{
|
||||
my $proc;
|
||||
s/\bENDP\b/@ $&/;
|
||||
$proc = pop(@proc_stack);
|
||||
$_ = "\t.size $proc, .-$proc".$_ if ($proc);
|
||||
}
|
||||
s/\bSUBT\b/@ $&/;
|
||||
s/\bDATA\b/@ $&/; # DATA directive is deprecated -- Asm guide, p.7-25
|
||||
s/\bKEEP\b/@ $&/;
|
||||
|
|
@ -223,6 +248,7 @@ while (<>) {
|
|||
{
|
||||
my $cmd=$_;
|
||||
my $value;
|
||||
my $prefix;
|
||||
my $w1;
|
||||
my $w2;
|
||||
my $w3;
|
||||
|
|
@ -241,25 +267,22 @@ while (<>) {
|
|||
if( $bigend ne "")
|
||||
{
|
||||
# big endian
|
||||
|
||||
print " .byte 0x".$w1;
|
||||
print " .byte 0x".$w2;
|
||||
print " .byte 0x".$w3;
|
||||
print " .byte 0x".$w4;
|
||||
$prefix = "\t.byte\t0x".$w1.";".
|
||||
"\t.byte\t0x".$w2.";".
|
||||
"\t.byte\t0x".$w3.";".
|
||||
"\t.byte\t0x".$w4."; ";
|
||||
}
|
||||
else
|
||||
{
|
||||
# little endian
|
||||
|
||||
print " .byte 0x".$w4;
|
||||
print " .byte 0x".$w3;
|
||||
print " .byte 0x".$w2;
|
||||
print " .byte 0x".$w1;
|
||||
$prefix = "\t.byte\t0x".$w4.";".
|
||||
"\t.byte\t0x".$w3.";".
|
||||
"\t.byte\t0x".$w2.";".
|
||||
"\t.byte\t0x".$w1."; ";
|
||||
}
|
||||
|
||||
$_=$prefix.$_;
|
||||
}
|
||||
|
||||
|
||||
if ( /\badrl\b/i )
|
||||
{
|
||||
s/\badrl\s+(\w+)\s*,\s*(\w+)/ldr $1,=$2/i;
|
||||
|
|
|
|||
|
|
@ -11,18 +11,12 @@
|
|||
;********************************************************************
|
||||
;
|
||||
; function:
|
||||
; last mod: $Id: armbits.s 17481 2010-10-03 22:49:42Z tterribe $
|
||||
; last mod: $Id$
|
||||
;
|
||||
;********************************************************************
|
||||
|
||||
AREA |.text|, CODE, READONLY
|
||||
|
||||
; Explicitly specifying alignment here because some versions of
|
||||
; gas don't align code correctly. See
|
||||
; http://lists.gnu.org/archive/html/bug-binutils/2011-06/msg00199.html
|
||||
; https://bugzilla.mozilla.org/show_bug.cgi?id=920992
|
||||
ALIGN
|
||||
|
||||
EXPORT oc_pack_read_arm
|
||||
EXPORT oc_pack_read1_arm
|
||||
EXPORT oc_huff_token_decode_arm
|
||||
|
|
|
|||
|
|
@ -20,7 +20,7 @@
|
|||
#include "armcpu.h"
|
||||
|
||||
#if !defined(OC_ARM_ASM)|| \
|
||||
!defined(OC_ARM_ASM_EDSP)&&!defined(OC_ARM_ASM_ARMV6)&& \
|
||||
!defined(OC_ARM_ASM_EDSP)&&!defined(OC_ARM_ASM_MEDIA)&& \
|
||||
!defined(OC_ARM_ASM_NEON)
|
||||
ogg_uint32_t oc_cpu_flags_get(void){
|
||||
return 0;
|
||||
|
|
@ -107,6 +107,44 @@ ogg_uint32_t oc_cpu_flags_get(void){
|
|||
return flags;
|
||||
}
|
||||
|
||||
#elif defined(__riscos__)
|
||||
#include <kernel.h>
|
||||
#include <swis.h>
|
||||
|
||||
ogg_uint32_t oc_cpu_flags_get(void) {
|
||||
ogg_uint32_t flags = 0;
|
||||
|
||||
#if defined(OC_ARM_ASM_EDSP) || defined(OC_ARM_ASM_MEDIA)
|
||||
|
||||
if (_swi(OS_Byte,_IN(0)|_IN(2)|_RETURN(1), 129, 0xFF) <= 0xA9)
|
||||
_swix(OS_Module, _INR(0,1), 1, "System:Modules.CallASWI");
|
||||
|
||||
ogg_uint32_t features;
|
||||
_kernel_oserror* test = _swix(OS_PlatformFeatures, _IN(0)|_OUT(0), 0, &features);
|
||||
if (test == NULL) {
|
||||
#if defined(OC_ARM_ASM_EDSP)
|
||||
if((features>>10 & 1) == 1)flags|=OC_CPU_ARM_EDSP;
|
||||
#endif
|
||||
|
||||
#if defined(OC_ARM_ASM_MEDIA)
|
||||
if ((features>>31 & 1) == 1) {
|
||||
ogg_uint32_t shadd = 0;
|
||||
test =_swix(OS_PlatformFeatures, _INR(0,1)|_OUT(0), 34, 29, &shadd);
|
||||
if (test==NULL && shadd==1)flags|=OC_CPU_ARM_MEDIA;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(OC_ARM_ASM_NEON)
|
||||
ogg_uint32_t mvfr1;
|
||||
test = _swix(VFPSupport_Features, _IN(0)|_OUT(2), 0, &mvfr1);
|
||||
if (test==NULL && (mvfr1 & 0xFFF00)==0x11100)flags|=OC_CPU_ARM_NEON;
|
||||
#endif
|
||||
|
||||
return flags;
|
||||
}
|
||||
|
||||
#else
|
||||
/*The feature registers which can tell us what the processor supports are
|
||||
accessible in priveleged modes only, so we can't have a general user-space
|
||||
|
|
|
|||
|
|
@ -11,17 +11,11 @@
|
|||
;********************************************************************
|
||||
; Original implementation:
|
||||
; Copyright (C) 2009 Robin Watts for Pinknoise Productions Ltd
|
||||
; last mod: $Id: armfrag.s 17481 2010-10-03 22:49:42Z tterribe $
|
||||
; last mod: $Id$
|
||||
;********************************************************************
|
||||
|
||||
AREA |.text|, CODE, READONLY
|
||||
|
||||
; Explicitly specifying alignment here because some versions of
|
||||
; gas don't align code correctly. See
|
||||
; http://lists.gnu.org/archive/html/bug-binutils/2011-06/msg00199.html
|
||||
; https://bugzilla.mozilla.org/show_bug.cgi?id=920992
|
||||
ALIGN
|
||||
|
||||
GET armopts.s
|
||||
|
||||
; Vanilla ARM v4 versions
|
||||
|
|
@ -516,8 +510,7 @@ oc_frag_recon_intra_neon PROC
|
|||
; r0 = unsigned char *_dst
|
||||
; r1 = int _ystride
|
||||
; r2 = const ogg_int16_t _residue[64]
|
||||
MOV r3, #128
|
||||
VDUP.S16 Q0, r3
|
||||
VMOV.I16 Q0, #128
|
||||
VLDMIA r2, {D16-D31} ; D16= 3333222211110000 etc ; 9(8) cycles
|
||||
VQADD.S16 Q8, Q8, Q0
|
||||
VQADD.S16 Q9, Q9, Q0
|
||||
|
|
|
|||
|
|
@ -11,17 +11,11 @@
|
|||
;********************************************************************
|
||||
; Original implementation:
|
||||
; Copyright (C) 2009 Robin Watts for Pinknoise Productions Ltd
|
||||
; last mod: $Id: armidct.s 17481 2010-10-03 22:49:42Z tterribe $
|
||||
; last mod: $Id$
|
||||
;********************************************************************
|
||||
|
||||
AREA |.text|, CODE, READONLY
|
||||
|
||||
; Explicitly specifying alignment here because some versions of
|
||||
; gas don't align code correctly. See
|
||||
; http://lists.gnu.org/archive/html/bug-binutils/2011-06/msg00199.html
|
||||
; https://bugzilla.mozilla.org/show_bug.cgi?id=920992
|
||||
ALIGN
|
||||
|
||||
GET armopts.s
|
||||
|
||||
EXPORT oc_idct8x8_1_arm
|
||||
|
|
@ -70,11 +64,8 @@ oc_idct8x8_slow_arm
|
|||
BL idct8core_arm
|
||||
BL idct8core_arm
|
||||
LDR r0, [r13], #4 ; Write to the final destination.
|
||||
; Clear input data for next block (decoder only).
|
||||
SUB r2, r1, #8*16
|
||||
CMP r0, r2
|
||||
MOV r1, r13 ; And read from temp storage.
|
||||
BEQ oc_idct8x8_slow_arm_cols
|
||||
; Clear input data for next block.
|
||||
MOV r4, #0
|
||||
MOV r5, #0
|
||||
MOV r6, #0
|
||||
|
|
@ -87,7 +78,7 @@ oc_idct8x8_slow_arm
|
|||
STMIA r2!,{r4,r5,r6,r7}
|
||||
STMIA r2!,{r4,r5,r6,r7}
|
||||
STMIA r2!,{r4,r5,r6,r7}
|
||||
oc_idct8x8_slow_arm_cols
|
||||
MOV r1, r13 ; And read from temp storage.
|
||||
; Column transforms
|
||||
BL idct8core_down_arm
|
||||
BL idct8core_down_arm
|
||||
|
|
@ -111,18 +102,15 @@ oc_idct8x8_10_arm PROC
|
|||
BL idct3core_arm
|
||||
BL idct2core_arm
|
||||
BL idct1core_arm
|
||||
; Clear input data for next block (decoder only).
|
||||
SUB r0, r1, #4*16
|
||||
CMP r0, r2
|
||||
MOV r1, r13 ; Read from temp storage.
|
||||
BEQ oc_idct8x8_10_arm_cols
|
||||
; Clear input data for next block.
|
||||
MOV r4, #0
|
||||
STR r4, [r0]
|
||||
STR r4, [r0,#4]
|
||||
STR r4, [r0,#16]
|
||||
STR r4, [r0,#20]
|
||||
STR r4, [r0,#32]
|
||||
STR r4, [r0,#48]
|
||||
STR r4, [r1,#-4*16]!
|
||||
STR r4, [r1,#4]
|
||||
STR r4, [r1,#16]
|
||||
STR r4, [r1,#20]
|
||||
STR r4, [r1,#32]
|
||||
STR r4, [r1,#48]
|
||||
MOV r1, r13 ; Read from temp storage.
|
||||
MOV r0, r2 ; Write to the final destination
|
||||
oc_idct8x8_10_arm_cols
|
||||
; Column transforms
|
||||
|
|
@ -147,18 +135,14 @@ oc_idct8x8_6_arm PROC
|
|||
BL idct3core_arm
|
||||
BL idct2core_arm
|
||||
BL idct1core_arm
|
||||
; Clear input data for next block (decoder only).
|
||||
SUB r0, r1, #3*16
|
||||
CMP r0, r2
|
||||
MOV r1, r13 ; Read from temp storage.
|
||||
BEQ oc_idct8x8_6_arm_cols
|
||||
; Clear input data for next block.
|
||||
MOV r4, #0
|
||||
STR r4, [r0]
|
||||
STR r4, [r0,#4]
|
||||
STR r4, [r0,#16]
|
||||
STR r4, [r0,#32]
|
||||
STR r4, [r1,#-3*16]!
|
||||
STR r4, [r1,#4]
|
||||
STR r4, [r1,#16]
|
||||
STR r4, [r1,#32]
|
||||
MOV r1, r13 ; Read from temp storage.
|
||||
MOV r0, r2 ; Write to the final destination
|
||||
oc_idct8x8_6_arm_cols
|
||||
; Column transforms
|
||||
BL idct3core_down_arm
|
||||
BL idct3core_down_arm
|
||||
|
|
@ -180,14 +164,12 @@ oc_idct8x8_3_arm PROC
|
|||
MOV r0, r13 ; Write to temp storage.
|
||||
BL idct2core_arm
|
||||
BL idct1core_arm
|
||||
; Clear input data for next block (decoder only).
|
||||
SUB r0, r1, #2*16
|
||||
CMP r0, r2
|
||||
; Clear input data for next block.
|
||||
MOV r4, #0
|
||||
STR r4, [r1,#-2*16]!
|
||||
STR r4, [r1,#16]
|
||||
MOV r1, r13 ; Read from temp storage.
|
||||
MOVNE r4, #0
|
||||
STRNE r4, [r0]
|
||||
STRNE r4, [r0,#16]
|
||||
MOVNE r0, r2 ; Write to the final destination
|
||||
MOV r0, r2 ; Write to the final destination
|
||||
; Column transforms
|
||||
BL idct2core_down_arm
|
||||
BL idct2core_down_arm
|
||||
|
|
@ -805,30 +787,26 @@ oc_idct8x8_slow_v6
|
|||
BL idct8_8core_v6
|
||||
BL idct8_8core_v6
|
||||
LDR r0, [r13], #4 ; Write to the final destination.
|
||||
; Clear input data for next block (decoder only).
|
||||
SUB r2, r1, #8*16
|
||||
CMP r0, r2
|
||||
MOV r1, r13 ; And read from temp storage.
|
||||
BEQ oc_idct8x8_slow_v6_cols
|
||||
; Clear input data for next block.
|
||||
MOV r4, #0
|
||||
MOV r5, #0
|
||||
STRD r4, [r2], #8
|
||||
STRD r4, [r2], #8
|
||||
STRD r4, [r2], #8
|
||||
STRD r4, [r2], #8
|
||||
STRD r4, [r2], #8
|
||||
STRD r4, [r2], #8
|
||||
STRD r4, [r2], #8
|
||||
STRD r4, [r2], #8
|
||||
STRD r4, [r2], #8
|
||||
STRD r4, [r2], #8
|
||||
STRD r4, [r2], #8
|
||||
STRD r4, [r2], #8
|
||||
STRD r4, [r2], #8
|
||||
STRD r4, [r2], #8
|
||||
STRD r4, [r2], #8
|
||||
STRD r4, [r2], #8
|
||||
oc_idct8x8_slow_v6_cols
|
||||
STRD r4, [r1,#-8*16]!
|
||||
STRD r4, [r1,#8]
|
||||
STRD r4, [r1,#16]
|
||||
STRD r4, [r1,#24]
|
||||
STRD r4, [r1,#32]
|
||||
STRD r4, [r1,#40]
|
||||
STRD r4, [r1,#48]
|
||||
STRD r4, [r1,#56]
|
||||
STRD r4, [r1,#64]
|
||||
STRD r4, [r1,#72]
|
||||
STRD r4, [r1,#80]
|
||||
STRD r4, [r1,#88]
|
||||
STRD r4, [r1,#96]
|
||||
STRD r4, [r1,#104]
|
||||
STRD r4, [r1,#112]
|
||||
STRD r4, [r1,#120]
|
||||
MOV r1, r13 ; And read from temp storage.
|
||||
; Column transforms
|
||||
BL idct8_8core_down_v6
|
||||
BL idct8_8core_down_v6
|
||||
|
|
@ -849,20 +827,16 @@ oc_idct8x8_10_v6 PROC
|
|||
BL idct4_3core_v6
|
||||
BL idct2_1core_v6
|
||||
LDR r0, [r13], #4 ; Write to the final destination.
|
||||
; Clear input data for next block (decoder only).
|
||||
SUB r2, r1, #4*16
|
||||
CMP r0, r2
|
||||
AND r1, r13,#4 ; Align the stack.
|
||||
BEQ oc_idct8x8_10_v6_cols
|
||||
; Clear input data for next block.
|
||||
MOV r4, #0
|
||||
MOV r5, #0
|
||||
STRD r4, [r2]
|
||||
STRD r4, [r2,#16]
|
||||
STR r4, [r2,#32]
|
||||
STR r4, [r2,#48]
|
||||
oc_idct8x8_10_v6_cols
|
||||
; Column transforms
|
||||
STRD r4, [r1,#-4*16]!
|
||||
STRD r4, [r1,#16]
|
||||
STR r4, [r1,#32]
|
||||
STR r4, [r1,#48]
|
||||
AND r1, r13,#4 ; Align the stack.
|
||||
ADD r1, r1, r13 ; And read from temp storage.
|
||||
; Column transforms
|
||||
BL idct4_4core_down_v6
|
||||
BL idct4_4core_down_v6
|
||||
BL idct4_4core_down_v6
|
||||
|
|
@ -878,14 +852,12 @@ oc_idct8x8_3_v6 PROC
|
|||
MOV r8, r0
|
||||
MOV r0, r13 ; Write to temp storage.
|
||||
BL idct2_1core_v6
|
||||
; Clear input data for next block (decoder only).
|
||||
SUB r0, r1, #2*16
|
||||
CMP r0, r8
|
||||
; Clear input data for next block.
|
||||
MOV r4, #0
|
||||
STR r4, [r1,#-2*16]!
|
||||
STR r4, [r1,#16]
|
||||
MOV r1, r13 ; Read from temp storage.
|
||||
MOVNE r4, #0
|
||||
STRNE r4, [r0]
|
||||
STRNE r4, [r0,#16]
|
||||
MOVNE r0, r8 ; Write to the final destination.
|
||||
MOV r0, r8 ; Write to the final destination.
|
||||
; Column transforms
|
||||
BL idct2_2core_down_v6
|
||||
BL idct2_2core_down_v6
|
||||
|
|
@ -1041,20 +1013,16 @@ oc_idct8x8_6_v6 PROC
|
|||
ADD r0, r0, r13 ; Write to temp storage.
|
||||
BL idct3_2core_v6
|
||||
BL idct1core_v6
|
||||
; Clear input data for next block (decoder only).
|
||||
SUB r0, r1, #3*16
|
||||
CMP r0, r8
|
||||
AND r1, r13,#4 ; Align the stack.
|
||||
BEQ oc_idct8x8_6_v6_cols
|
||||
; Clear input data for next block.
|
||||
MOV r4, #0
|
||||
MOV r5, #0
|
||||
STRD r4, [r0]
|
||||
STR r4, [r0,#16]
|
||||
STR r4, [r0,#32]
|
||||
STRD r4, [r1,#-3*16]!
|
||||
STR r4, [r1,#16]
|
||||
STR r4, [r1,#32]
|
||||
AND r1, r13,#4 ; Align the stack.
|
||||
MOV r0, r8 ; Write to the final destination.
|
||||
oc_idct8x8_6_v6_cols
|
||||
; Column transforms
|
||||
ADD r1, r1, r13 ; And read from temp storage.
|
||||
; Column transforms
|
||||
BL idct3_3core_down_v6
|
||||
BL idct3_3core_down_v6
|
||||
BL idct3_3core_down_v6
|
||||
|
|
@ -1596,7 +1564,6 @@ oc_idct8x8_slow_neon
|
|||
VSWP D23,D30
|
||||
; Column transforms
|
||||
BL oc_idct8x8_stage123_neon
|
||||
CMP r0,r1
|
||||
; We have to put the return address back in the LR, or the branch
|
||||
; predictor will not recognize the function return and mis-predict the
|
||||
; entire call stack.
|
||||
|
|
@ -1610,7 +1577,6 @@ oc_idct8x8_slow_neon
|
|||
VADD.S16 Q10,Q10,Q5 ; Q10 = y[2]=t[2]'+t[5]''
|
||||
VSUB.S16 Q12,Q11,Q4 ; Q12 = y[4]=t[3]'-t[4]'
|
||||
VADD.S16 Q11,Q11,Q4 ; Q11 = y[3]=t[3]'+t[4]'
|
||||
BEQ oc_idct8x8_slow_neon_noclear
|
||||
VMOV.I8 Q2,#0
|
||||
VPOP {D8-D15}
|
||||
VMOV.I8 Q3,#0
|
||||
|
|
@ -1628,19 +1594,6 @@ oc_idct8x8_slow_neon
|
|||
VRSHR.S16 Q15,Q15,#4 ; Q15 = y[7]+8>>4
|
||||
VSTMIA r0, {D16-D31}
|
||||
MOV PC, r14
|
||||
|
||||
oc_idct8x8_slow_neon_noclear
|
||||
VPOP {D8-D15}
|
||||
VRSHR.S16 Q8, Q8, #4 ; Q8 = y[0]+8>>4
|
||||
VRSHR.S16 Q9, Q9, #4 ; Q9 = y[1]+8>>4
|
||||
VRSHR.S16 Q10,Q10,#4 ; Q10 = y[2]+8>>4
|
||||
VRSHR.S16 Q11,Q11,#4 ; Q11 = y[3]+8>>4
|
||||
VRSHR.S16 Q12,Q12,#4 ; Q12 = y[4]+8>>4
|
||||
VRSHR.S16 Q13,Q13,#4 ; Q13 = y[5]+8>>4
|
||||
VRSHR.S16 Q14,Q14,#4 ; Q14 = y[6]+8>>4
|
||||
VRSHR.S16 Q15,Q15,#4 ; Q15 = y[7]+8>>4
|
||||
VSTMIA r0, {D16-D31}
|
||||
MOV PC, r14
|
||||
ENDP
|
||||
|
||||
oc_idct8x8_stage123_neon PROC
|
||||
|
|
@ -1871,7 +1824,6 @@ oc_idct8x8_10_neon PROC
|
|||
VADD.S16 Q10,Q1, Q2 ; Q10= t[1]'=t[0]+t[2]
|
||||
VSUB.S16 Q2, Q1, Q2 ; Q2 = t[2]'=t[0]-t[2]
|
||||
; Stage 4
|
||||
CMP r0, r1
|
||||
VADD.S16 Q8, Q11,Q15 ; Q8 = y[0]=t[0]'+t[7]'
|
||||
VADD.S16 Q9, Q10,Q14 ; Q9 = y[1]=t[1]'+t[6]''
|
||||
VSUB.S16 Q15,Q11,Q15 ; Q15 = y[7]=t[0]'-t[7]'
|
||||
|
|
@ -1880,7 +1832,6 @@ oc_idct8x8_10_neon PROC
|
|||
VADD.S16 Q11,Q3, Q12 ; Q11 = y[3]=t[3]'+t[4]'
|
||||
VSUB.S16 Q12,Q3, Q12 ; Q12 = y[4]=t[3]'-t[4]'
|
||||
VSUB.S16 Q13,Q2, Q13 ; Q13 = y[5]=t[2]'-t[5]''
|
||||
BEQ oc_idct8x8_10_neon_noclear
|
||||
VMOV.I8 D2, #0
|
||||
VRSHR.S16 Q8, Q8, #4 ; Q8 = y[0]+8>>4
|
||||
VST1.64 {D2}, [r1@64], r12
|
||||
|
|
@ -1896,18 +1847,6 @@ oc_idct8x8_10_neon PROC
|
|||
VRSHR.S16 Q15,Q15,#4 ; Q15 = y[7]+8>>4
|
||||
VSTMIA r0, {D16-D31}
|
||||
MOV PC, r14
|
||||
|
||||
oc_idct8x8_10_neon_noclear
|
||||
VRSHR.S16 Q8, Q8, #4 ; Q8 = y[0]+8>>4
|
||||
VRSHR.S16 Q9, Q9, #4 ; Q9 = y[1]+8>>4
|
||||
VRSHR.S16 Q10,Q10,#4 ; Q10 = y[2]+8>>4
|
||||
VRSHR.S16 Q11,Q11,#4 ; Q11 = y[3]+8>>4
|
||||
VRSHR.S16 Q12,Q12,#4 ; Q12 = y[4]+8>>4
|
||||
VRSHR.S16 Q13,Q13,#4 ; Q13 = y[5]+8>>4
|
||||
VRSHR.S16 Q14,Q14,#4 ; Q14 = y[6]+8>>4
|
||||
VRSHR.S16 Q15,Q15,#4 ; Q15 = y[7]+8>>4
|
||||
VSTMIA r0, {D16-D31}
|
||||
MOV PC, r14
|
||||
ENDP
|
||||
]
|
||||
|
||||
|
|
|
|||
|
|
@ -11,17 +11,11 @@
|
|||
;********************************************************************
|
||||
; Original implementation:
|
||||
; Copyright (C) 2009 Robin Watts for Pinknoise Productions Ltd
|
||||
; last mod: $Id: armloop.s 17481 2010-10-03 22:49:42Z tterribe $
|
||||
; last mod: $Id$
|
||||
;********************************************************************
|
||||
|
||||
AREA |.text|, CODE, READONLY
|
||||
|
||||
; Explicitly specifying alignment here because some versions of
|
||||
; gas don't align code correctly. See
|
||||
; http://lists.gnu.org/archive/html/bug-binutils/2011-06/msg00199.html
|
||||
; https://bugzilla.mozilla.org/show_bug.cgi?id=920992
|
||||
ALIGN
|
||||
|
||||
GET armopts.s
|
||||
|
||||
EXPORT oc_loop_filter_frag_rows_arm
|
||||
|
|
|
|||
|
|
@ -11,7 +11,7 @@
|
|||
;********************************************************************
|
||||
; Original implementation:
|
||||
; Copyright (C) 2009 Robin Watts for Pinknoise Productions Ltd
|
||||
; last mod: $Id: armopts.s.in 17430 2010-09-22 21:54:09Z tterribe $
|
||||
; last mod: $Id$
|
||||
;********************************************************************
|
||||
|
||||
; Set the following to 1 if we have EDSP instructions
|
||||
|
|
|
|||
|
|
@ -11,7 +11,7 @@
|
|||
********************************************************************
|
||||
|
||||
function: packing variable sized words into an octet stream
|
||||
last mod: $Id: bitpack.c 17410 2010-09-21 21:53:48Z tterribe $
|
||||
last mod: $Id$
|
||||
|
||||
********************************************************************/
|
||||
#include <string.h>
|
||||
|
|
|
|||
|
|
@ -13,8 +13,8 @@
|
|||
/* Define to 1 if you have the <machine/soundcard.h> header file. */
|
||||
/* #undef HAVE_MACHINE_SOUNDCARD_H */
|
||||
|
||||
/* Define to 1 if you have the <memory.h> header file. */
|
||||
#define HAVE_MEMORY_H 1
|
||||
/* Abort if size exceeds 16384x16384 (for fuzzing only) */
|
||||
/* #undef HAVE_MEMORY_CONSTRAINT */
|
||||
|
||||
/* Define to 1 if you have the <soundcard.h> header file. */
|
||||
/* #undef HAVE_SOUNDCARD_H */
|
||||
|
|
@ -22,6 +22,9 @@
|
|||
/* Define to 1 if you have the <stdint.h> header file. */
|
||||
#define HAVE_STDINT_H 1
|
||||
|
||||
/* Define to 1 if you have the <stdio.h> header file. */
|
||||
#define HAVE_STDIO_H 1
|
||||
|
||||
/* Define to 1 if you have the <stdlib.h> header file. */
|
||||
#define HAVE_STDLIB_H 1
|
||||
|
||||
|
|
@ -43,56 +46,58 @@
|
|||
/* Define to 1 if you have the <unistd.h> header file. */
|
||||
#define HAVE_UNISTD_H 1
|
||||
|
||||
/* Define to 1 if your C compiler doesn't accept -c and -o together. */
|
||||
/* #undef NO_MINUS_C_MINUS_O */
|
||||
/* Define to the sub-directory where libtool stores uninstalled libraries. */
|
||||
#define LT_OBJDIR ".libs/"
|
||||
|
||||
/* make use of arm asm optimization */
|
||||
|
||||
/* #undef OC_ARM_ASM */
|
||||
|
||||
/* Define if assembler supports EDSP instructions */
|
||||
|
||||
/* #undef OC_ARM_ASM_EDSP */
|
||||
|
||||
/* Define if assembler supports ARMv6 media instructions */
|
||||
|
||||
/* #undef OC_ARM_ASM_MEDIA */
|
||||
|
||||
/* Define if compiler supports NEON instructions */
|
||||
|
||||
/* #undef OC_ARM_ASM_NEON */
|
||||
|
||||
/* make use of c64x+ asm optimization */
|
||||
/* #undef OC_C64X_ASM */
|
||||
|
||||
/* make use of x86_64 asm optimization */
|
||||
/* #undef OC_X86_64_ASM */
|
||||
/**/
|
||||
|
||||
/* make use of x86 asm optimization */
|
||||
/* #undef OC_X86_ASM */
|
||||
/**/
|
||||
|
||||
/* Name of package */
|
||||
#define PACKAGE "libtheora"
|
||||
|
||||
/* Define to the address where bug reports for this package should be sent. */
|
||||
#define PACKAGE_BUGREPORT ""
|
||||
#define PACKAGE_BUGREPORT "theora-dev@xiph.org"
|
||||
|
||||
/* Define to the full name of this package. */
|
||||
#define PACKAGE_NAME "libtheora"
|
||||
|
||||
/* Define to the full name and version of this package. */
|
||||
#define PACKAGE_STRING "libtheora 1.2.0alpha1+svn"
|
||||
#define PACKAGE_STRING "libtheora 1.2.0alpha1+git"
|
||||
|
||||
/* Define to the one symbol short name of this package. */
|
||||
#define PACKAGE_TARNAME "libtheora"
|
||||
|
||||
/* Define to the version of this package. */
|
||||
#define PACKAGE_VERSION "1.2.0alpha1+svn"
|
||||
/* Define to the home page for this package. */
|
||||
#define PACKAGE_URL ""
|
||||
|
||||
/* Define to 1 if you have the ANSI C header files. */
|
||||
/* Define to the version of this package. */
|
||||
#define PACKAGE_VERSION "1.2.0alpha1+git"
|
||||
|
||||
/* Define to 1 if all of the C90 standard headers exist (not just the ones
|
||||
required in a freestanding environment). This macro is provided for
|
||||
backward compatibility; new code need not use it. */
|
||||
#define STDC_HEADERS 1
|
||||
|
||||
/* Define to exclude encode support from the build */
|
||||
/* #undef THEORA_DISABLE_ENCODE */
|
||||
|
||||
/* Define to exclude floating point code from the build */
|
||||
/* #undef THEORA_DISABLE_FLOAT */
|
||||
|
||||
/* Version number of package */
|
||||
#define VERSION "1.2.0alpha1+svn"
|
||||
#define VERSION "1.2.0alpha1+git"
|
||||
|
|
|
|||
|
|
@ -11,7 +11,7 @@
|
|||
********************************************************************
|
||||
|
||||
function:
|
||||
last mod: $Id: dct.h 16503 2009-08-22 18:14:02Z giles $
|
||||
last mod: $Id$
|
||||
|
||||
********************************************************************/
|
||||
|
||||
|
|
|
|||
|
|
@ -1,193 +0,0 @@
|
|||
/********************************************************************
|
||||
* *
|
||||
* THIS FILE IS PART OF THE OggTheora SOFTWARE CODEC SOURCE CODE. *
|
||||
* USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS *
|
||||
* GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
|
||||
* IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. *
|
||||
* *
|
||||
* THE Theora SOURCE CODE IS COPYRIGHT (C) 2002-2009 *
|
||||
* by the Xiph.Org Foundation and contributors http://www.xiph.org/ *
|
||||
* *
|
||||
********************************************************************
|
||||
|
||||
function:
|
||||
last mod: $Id: decapiwrapper.c 13596 2007-08-23 20:05:38Z tterribe $
|
||||
|
||||
********************************************************************/
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <limits.h>
|
||||
#include "apiwrapper.h"
|
||||
#include "decint.h"
|
||||
#include "theora/theoradec.h"
|
||||
|
||||
static void th_dec_api_clear(th_api_wrapper *_api){
|
||||
if(_api->setup)th_setup_free(_api->setup);
|
||||
if(_api->decode)th_decode_free(_api->decode);
|
||||
memset(_api,0,sizeof(*_api));
|
||||
}
|
||||
|
||||
static void theora_decode_clear(theora_state *_td){
|
||||
if(_td->i!=NULL)theora_info_clear(_td->i);
|
||||
memset(_td,0,sizeof(*_td));
|
||||
}
|
||||
|
||||
static int theora_decode_control(theora_state *_td,int _req,
|
||||
void *_buf,size_t _buf_sz){
|
||||
return th_decode_ctl(((th_api_wrapper *)_td->i->codec_setup)->decode,
|
||||
_req,_buf,_buf_sz);
|
||||
}
|
||||
|
||||
static ogg_int64_t theora_decode_granule_frame(theora_state *_td,
|
||||
ogg_int64_t _gp){
|
||||
return th_granule_frame(((th_api_wrapper *)_td->i->codec_setup)->decode,_gp);
|
||||
}
|
||||
|
||||
static double theora_decode_granule_time(theora_state *_td,ogg_int64_t _gp){
|
||||
return th_granule_time(((th_api_wrapper *)_td->i->codec_setup)->decode,_gp);
|
||||
}
|
||||
|
||||
static const oc_state_dispatch_vtable OC_DEC_DISPATCH_VTBL={
|
||||
(oc_state_clear_func)theora_decode_clear,
|
||||
(oc_state_control_func)theora_decode_control,
|
||||
(oc_state_granule_frame_func)theora_decode_granule_frame,
|
||||
(oc_state_granule_time_func)theora_decode_granule_time,
|
||||
};
|
||||
|
||||
static void th_info2theora_info(theora_info *_ci,const th_info *_info){
|
||||
_ci->version_major=_info->version_major;
|
||||
_ci->version_minor=_info->version_minor;
|
||||
_ci->version_subminor=_info->version_subminor;
|
||||
_ci->width=_info->frame_width;
|
||||
_ci->height=_info->frame_height;
|
||||
_ci->frame_width=_info->pic_width;
|
||||
_ci->frame_height=_info->pic_height;
|
||||
_ci->offset_x=_info->pic_x;
|
||||
_ci->offset_y=_info->pic_y;
|
||||
_ci->fps_numerator=_info->fps_numerator;
|
||||
_ci->fps_denominator=_info->fps_denominator;
|
||||
_ci->aspect_numerator=_info->aspect_numerator;
|
||||
_ci->aspect_denominator=_info->aspect_denominator;
|
||||
switch(_info->colorspace){
|
||||
case TH_CS_ITU_REC_470M:_ci->colorspace=OC_CS_ITU_REC_470M;break;
|
||||
case TH_CS_ITU_REC_470BG:_ci->colorspace=OC_CS_ITU_REC_470BG;break;
|
||||
default:_ci->colorspace=OC_CS_UNSPECIFIED;break;
|
||||
}
|
||||
switch(_info->pixel_fmt){
|
||||
case TH_PF_420:_ci->pixelformat=OC_PF_420;break;
|
||||
case TH_PF_422:_ci->pixelformat=OC_PF_422;break;
|
||||
case TH_PF_444:_ci->pixelformat=OC_PF_444;break;
|
||||
default:_ci->pixelformat=OC_PF_RSVD;
|
||||
}
|
||||
_ci->target_bitrate=_info->target_bitrate;
|
||||
_ci->quality=_info->quality;
|
||||
_ci->keyframe_frequency_force=1<<_info->keyframe_granule_shift;
|
||||
}
|
||||
|
||||
int theora_decode_init(theora_state *_td,theora_info *_ci){
|
||||
th_api_info *apiinfo;
|
||||
th_api_wrapper *api;
|
||||
th_info info;
|
||||
api=(th_api_wrapper *)_ci->codec_setup;
|
||||
/*Allocate our own combined API wrapper/theora_info struct.
|
||||
We put them both in one malloc'd block so that when the API wrapper is
|
||||
freed, the info struct goes with it.
|
||||
This avoids having to figure out whether or not we need to free the info
|
||||
struct in either theora_info_clear() or theora_clear().*/
|
||||
apiinfo=(th_api_info *)_ogg_calloc(1,sizeof(*apiinfo));
|
||||
if(apiinfo==NULL)return OC_FAULT;
|
||||
/*Make our own copy of the info struct, since its lifetime should be
|
||||
independent of the one we were passed in.*/
|
||||
*&apiinfo->info=*_ci;
|
||||
/*Convert the info struct now instead of saving the the one we decoded with
|
||||
theora_decode_header(), since the user might have modified values (i.e.,
|
||||
color space, aspect ratio, etc. can be specified from a higher level).
|
||||
The user also might be doing something "clever" with the header packets if
|
||||
they are not using an Ogg encapsulation.*/
|
||||
oc_theora_info2th_info(&info,_ci);
|
||||
/*Don't bother to copy the setup info; th_decode_alloc() makes its own copy
|
||||
of the stuff it needs.*/
|
||||
apiinfo->api.decode=th_decode_alloc(&info,api->setup);
|
||||
if(apiinfo->api.decode==NULL){
|
||||
_ogg_free(apiinfo);
|
||||
return OC_EINVAL;
|
||||
}
|
||||
apiinfo->api.clear=(oc_setup_clear_func)th_dec_api_clear;
|
||||
_td->internal_encode=NULL;
|
||||
/*Provide entry points for ABI compatibility with old decoder shared libs.*/
|
||||
_td->internal_decode=(void *)&OC_DEC_DISPATCH_VTBL;
|
||||
_td->granulepos=0;
|
||||
_td->i=&apiinfo->info;
|
||||
_td->i->codec_setup=&apiinfo->api;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int theora_decode_header(theora_info *_ci,theora_comment *_cc,ogg_packet *_op){
|
||||
th_api_wrapper *api;
|
||||
th_info info;
|
||||
int ret;
|
||||
api=(th_api_wrapper *)_ci->codec_setup;
|
||||
/*Allocate an API wrapper struct on demand, since it will not also include a
|
||||
theora_info struct like the ones that are used in a theora_state struct.*/
|
||||
if(api==NULL){
|
||||
_ci->codec_setup=_ogg_calloc(1,sizeof(*api));
|
||||
if(_ci->codec_setup==NULL)return OC_FAULT;
|
||||
api=(th_api_wrapper *)_ci->codec_setup;
|
||||
api->clear=(oc_setup_clear_func)th_dec_api_clear;
|
||||
}
|
||||
/*Convert from the theora_info struct instead of saving our own th_info
|
||||
struct between calls.
|
||||
The user might be doing something "clever" with the header packets if they
|
||||
are not using an Ogg encapsulation, and we don't want to break this.*/
|
||||
oc_theora_info2th_info(&info,_ci);
|
||||
/*We rely on the fact that theora_comment and th_comment structures are
|
||||
actually identical.
|
||||
Take care not to change this fact unless you change the code here as
|
||||
well!*/
|
||||
ret=th_decode_headerin(&info,(th_comment *)_cc,&api->setup,_op);
|
||||
/*We also rely on the fact that the error return code values are the same,
|
||||
and that the implementations of these two functions return the same set of
|
||||
them.
|
||||
Note that theora_decode_header() really can return OC_NOTFORMAT, even
|
||||
though it is not currently documented to do so.*/
|
||||
if(ret<0)return ret;
|
||||
th_info2theora_info(_ci,&info);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int theora_decode_packetin(theora_state *_td,ogg_packet *_op){
|
||||
th_api_wrapper *api;
|
||||
ogg_int64_t gp;
|
||||
int ret;
|
||||
if(!_td||!_td->i||!_td->i->codec_setup)return OC_FAULT;
|
||||
api=(th_api_wrapper *)_td->i->codec_setup;
|
||||
ret=th_decode_packetin(api->decode,_op,&gp);
|
||||
if(ret<0)return OC_BADPACKET;
|
||||
_td->granulepos=gp;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int theora_decode_YUVout(theora_state *_td,yuv_buffer *_yuv){
|
||||
th_api_wrapper *api;
|
||||
th_dec_ctx *decode;
|
||||
th_ycbcr_buffer buf;
|
||||
int ret;
|
||||
if(!_td||!_td->i||!_td->i->codec_setup)return OC_FAULT;
|
||||
api=(th_api_wrapper *)_td->i->codec_setup;
|
||||
decode=(th_dec_ctx *)api->decode;
|
||||
if(!decode)return OC_FAULT;
|
||||
ret=th_decode_ycbcr_out(decode,buf);
|
||||
if(ret>=0){
|
||||
_yuv->y_width=buf[0].width;
|
||||
_yuv->y_height=buf[0].height;
|
||||
_yuv->y_stride=buf[0].stride;
|
||||
_yuv->uv_width=buf[1].width;
|
||||
_yuv->uv_height=buf[1].height;
|
||||
_yuv->uv_stride=buf[1].stride;
|
||||
_yuv->y=buf[0].data;
|
||||
_yuv->u=buf[1].data;
|
||||
_yuv->v=buf[2].data;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
|
@ -11,7 +11,7 @@
|
|||
********************************************************************
|
||||
|
||||
function:
|
||||
last mod: $Id: decinfo.c 17276 2010-06-05 05:57:05Z tterribe $
|
||||
last mod: $Id$
|
||||
|
||||
********************************************************************/
|
||||
|
||||
|
|
@ -20,6 +20,11 @@
|
|||
#include <limits.h>
|
||||
#include "decint.h"
|
||||
|
||||
/*Only used for fuzzing.*/
|
||||
#if defined(HAVE_MEMORY_CONSTRAINT)
|
||||
static const int MAX_FUZZING_WIDTH = 16384;
|
||||
static const int MAX_FUZZING_HEIGHT = 16384;
|
||||
#endif
|
||||
|
||||
|
||||
/*Unpacks a series of octets from a given byte array into the pack buffer.
|
||||
|
|
@ -55,8 +60,8 @@ static int oc_info_unpack(oc_pack_buf *_opb,th_info *_info){
|
|||
/*verify we can parse this bitstream version.
|
||||
We accept earlier minors and all subminors, by spec*/
|
||||
if(_info->version_major>TH_VERSION_MAJOR||
|
||||
_info->version_major==TH_VERSION_MAJOR&&
|
||||
_info->version_minor>TH_VERSION_MINOR){
|
||||
(_info->version_major==TH_VERSION_MAJOR&&
|
||||
_info->version_minor>TH_VERSION_MINOR)){
|
||||
return TH_EVERSION;
|
||||
}
|
||||
/*Read the encoded frame description.*/
|
||||
|
|
@ -82,6 +87,11 @@ static int oc_info_unpack(oc_pack_buf *_opb,th_info *_info){
|
|||
_info->fps_numerator==0||_info->fps_denominator==0){
|
||||
return TH_EBADHEADER;
|
||||
}
|
||||
#if defined(HAVE_MEMORY_CONSTRAINT)
|
||||
if(_info->frame_width>=MAX_FUZZING_WIDTH&&_info->frame_height>=MAX_FUZZING_HEIGHT){
|
||||
return TH_EBADHEADER;
|
||||
}
|
||||
#endif
|
||||
/*Note: The sense of pic_y is inverted in what we pass back to the
|
||||
application compared to how it is stored in the bitstream.
|
||||
This is because the bitstream uses a right-handed coordinate system, while
|
||||
|
|
|
|||
|
|
@ -11,7 +11,7 @@
|
|||
********************************************************************
|
||||
|
||||
function:
|
||||
last mod: $Id: decint.h 17457 2010-09-24 02:05:49Z tterribe $
|
||||
last mod: $Id$
|
||||
|
||||
********************************************************************/
|
||||
|
||||
|
|
@ -162,7 +162,6 @@ struct th_dec_ctx{
|
|||
# endif
|
||||
# if defined(HAVE_CAIRO)
|
||||
/*Output metrics for debugging.*/
|
||||
int telemetry;
|
||||
int telemetry_mbmode;
|
||||
int telemetry_mv;
|
||||
int telemetry_qi;
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load diff
|
|
@ -11,7 +11,7 @@
|
|||
********************************************************************
|
||||
|
||||
function:
|
||||
last mod: $Id: dequant.c 16503 2009-08-22 18:14:02Z giles $
|
||||
last mod: $Id$
|
||||
|
||||
********************************************************************/
|
||||
|
||||
|
|
|
|||
|
|
@ -11,7 +11,7 @@
|
|||
********************************************************************
|
||||
|
||||
function:
|
||||
last mod: $Id: dequant.h 16503 2009-08-22 18:14:02Z giles $
|
||||
last mod: $Id$
|
||||
|
||||
********************************************************************/
|
||||
|
||||
|
|
|
|||
|
|
@ -11,7 +11,7 @@
|
|||
********************************************************************
|
||||
|
||||
function:
|
||||
last mod: $Id: fragment.c 17410 2010-09-21 21:53:48Z tterribe $
|
||||
last mod: $Id$
|
||||
|
||||
********************************************************************/
|
||||
#include <string.h>
|
||||
|
|
|
|||
|
|
@ -11,7 +11,7 @@
|
|||
********************************************************************
|
||||
|
||||
function:
|
||||
last mod: $Id: huffdec.c 17577 2010-10-29 04:00:07Z tterribe $
|
||||
last mod: $Id$
|
||||
|
||||
********************************************************************/
|
||||
|
||||
|
|
|
|||
|
|
@ -11,7 +11,7 @@
|
|||
********************************************************************
|
||||
|
||||
function:
|
||||
last mod: $Id: huffdec.h 17410 2010-09-21 21:53:48Z tterribe $
|
||||
last mod: $Id$
|
||||
|
||||
********************************************************************/
|
||||
|
||||
|
|
|
|||
|
|
@ -11,12 +11,12 @@
|
|||
********************************************************************
|
||||
|
||||
function:
|
||||
last mod: $Id: huffman.h 16503 2009-08-22 18:14:02Z giles $
|
||||
last mod: $Id$
|
||||
|
||||
********************************************************************/
|
||||
|
||||
#if !defined(_huffman_H)
|
||||
# define _hufffman_H (1)
|
||||
# define _huffman_H (1)
|
||||
# include "theora/codec.h"
|
||||
# include "ocintrin.h"
|
||||
|
||||
|
|
|
|||
|
|
@ -11,7 +11,7 @@
|
|||
********************************************************************
|
||||
|
||||
function:
|
||||
last mod: $Id: idct.c 17410 2010-09-21 21:53:48Z tterribe $
|
||||
last mod: $Id$
|
||||
|
||||
********************************************************************/
|
||||
|
||||
|
|
@ -241,8 +241,8 @@ static void oc_idct8x8_3(ogg_int16_t _y[64],ogg_int16_t _x[64]){
|
|||
for(i=0;i<8;i++)idct8_2(_y+i,w+i*8);
|
||||
/*Adjust for the scale factor.*/
|
||||
for(i=0;i<64;i++)_y[i]=(ogg_int16_t)(_y[i]+8>>4);
|
||||
/*Clear input data for next block (decoder only).*/
|
||||
if(_x!=_y)_x[0]=_x[1]=_x[8]=0;
|
||||
/*Clear input data for next block.*/
|
||||
_x[0]=_x[1]=_x[8]=0;
|
||||
}
|
||||
|
||||
/*Performs an inverse 8x8 Type-II DCT transform.
|
||||
|
|
@ -272,8 +272,8 @@ static void oc_idct8x8_10(ogg_int16_t _y[64],ogg_int16_t _x[64]){
|
|||
for(i=0;i<8;i++)idct8_4(_y+i,w+i*8);
|
||||
/*Adjust for the scale factor.*/
|
||||
for(i=0;i<64;i++)_y[i]=(ogg_int16_t)(_y[i]+8>>4);
|
||||
/*Clear input data for next block (decoder only).*/
|
||||
if(_x!=_y)_x[0]=_x[1]=_x[2]=_x[3]=_x[8]=_x[9]=_x[10]=_x[16]=_x[17]=_x[24]=0;
|
||||
/*Clear input data for next block.*/
|
||||
_x[0]=_x[1]=_x[2]=_x[3]=_x[8]=_x[9]=_x[10]=_x[16]=_x[17]=_x[24]=0;
|
||||
}
|
||||
|
||||
/*Performs an inverse 8x8 Type-II DCT transform.
|
||||
|
|
@ -291,7 +291,8 @@ static void oc_idct8x8_slow(ogg_int16_t _y[64],ogg_int16_t _x[64]){
|
|||
for(i=0;i<8;i++)idct8(_y+i,w+i*8);
|
||||
/*Adjust for the scale factor.*/
|
||||
for(i=0;i<64;i++)_y[i]=(ogg_int16_t)(_y[i]+8>>4);
|
||||
if(_x!=_y)for(i=0;i<64;i++)_x[i]=0;
|
||||
/*Clear input data for next block.*/
|
||||
for(i=0;i<64;i++)_x[i]=0;
|
||||
}
|
||||
|
||||
/*Performs an inverse 8x8 Type-II DCT transform.
|
||||
|
|
|
|||
|
|
@ -11,7 +11,7 @@
|
|||
********************************************************************
|
||||
|
||||
function:
|
||||
last mod: $Id: info.c 16503 2009-08-22 18:14:02Z giles $
|
||||
last mod: $Id$
|
||||
|
||||
********************************************************************/
|
||||
|
||||
|
|
@ -54,7 +54,7 @@ void th_comment_init(th_comment *_tc){
|
|||
memset(_tc,0,sizeof(*_tc));
|
||||
}
|
||||
|
||||
void th_comment_add(th_comment *_tc,char *_comment){
|
||||
void th_comment_add(th_comment *_tc,const char *_comment){
|
||||
char **user_comments;
|
||||
int *comment_lengths;
|
||||
int comment_len;
|
||||
|
|
@ -75,7 +75,7 @@ void th_comment_add(th_comment *_tc,char *_comment){
|
|||
_tc->user_comments[_tc->comments]=NULL;
|
||||
}
|
||||
|
||||
void th_comment_add_tag(th_comment *_tc,char *_tag,char *_val){
|
||||
void th_comment_add_tag(th_comment *_tc,const char *_tag,const char *_val){
|
||||
char *comment;
|
||||
int tag_len;
|
||||
int val_len;
|
||||
|
|
@ -91,7 +91,7 @@ void th_comment_add_tag(th_comment *_tc,char *_tag,char *_val){
|
|||
_ogg_free(comment);
|
||||
}
|
||||
|
||||
char *th_comment_query(th_comment *_tc,char *_tag,int _count){
|
||||
char *th_comment_query(th_comment *_tc,const char *_tag,int _count){
|
||||
long i;
|
||||
int found;
|
||||
int tag_len;
|
||||
|
|
@ -107,7 +107,7 @@ char *th_comment_query(th_comment *_tc,char *_tag,int _count){
|
|||
return NULL;
|
||||
}
|
||||
|
||||
int th_comment_query_count(th_comment *_tc,char *_tag){
|
||||
int th_comment_query_count(th_comment *_tc,const char *_tag){
|
||||
long i;
|
||||
int tag_len;
|
||||
int count;
|
||||
|
|
|
|||
|
|
@ -11,7 +11,7 @@
|
|||
********************************************************************
|
||||
|
||||
function:
|
||||
last mod: $Id: internal.c 17506 2010-10-13 02:52:41Z tterribe $
|
||||
last mod: $Id$
|
||||
|
||||
********************************************************************/
|
||||
|
||||
|
|
|
|||
|
|
@ -11,7 +11,7 @@
|
|||
********************************************************************
|
||||
|
||||
function:
|
||||
last mod: $Id: internal.h 17578 2010-10-29 04:21:26Z tterribe $
|
||||
last mod: $Id$
|
||||
|
||||
********************************************************************/
|
||||
#if !defined(_internal_H)
|
||||
|
|
|
|||
|
|
@ -11,7 +11,7 @@
|
|||
********************************************************************
|
||||
|
||||
function:
|
||||
last mod: $Id: ocintrin.h 16503 2009-08-22 18:14:02Z giles $
|
||||
last mod: $Id$
|
||||
|
||||
********************************************************************/
|
||||
|
||||
|
|
|
|||
|
|
@ -11,7 +11,7 @@
|
|||
********************************************************************
|
||||
|
||||
function:
|
||||
last mod: $Id: quant.c 17307 2010-06-27 06:02:15Z tterribe $
|
||||
last mod: $Id$
|
||||
|
||||
********************************************************************/
|
||||
|
||||
|
|
|
|||
|
|
@ -11,7 +11,7 @@
|
|||
********************************************************************
|
||||
|
||||
function:
|
||||
last mod: $Id: quant.h 16503 2009-08-22 18:14:02Z giles $
|
||||
last mod: $Id$
|
||||
|
||||
********************************************************************/
|
||||
|
||||
|
|
|
|||
|
|
@ -11,7 +11,7 @@
|
|||
********************************************************************
|
||||
|
||||
function:
|
||||
last mod: $Id: state.c 17576 2010-10-29 01:07:51Z tterribe $
|
||||
last mod: $Id$
|
||||
|
||||
********************************************************************/
|
||||
|
||||
|
|
@ -21,6 +21,7 @@
|
|||
#if defined(OC_DUMP_IMAGES)
|
||||
# include <stdio.h>
|
||||
# include "png.h"
|
||||
# include "zlib.h"
|
||||
#endif
|
||||
|
||||
/*The function used to fill in the chroma plane motion vectors for a macro
|
||||
|
|
@ -706,7 +707,8 @@ int oc_state_init(oc_theora_state *_state,const th_info *_info,int _nrefs){
|
|||
how it is specified in the bitstream, because the Y axis is flipped in
|
||||
the bitstream.
|
||||
The displayable frame must fit inside the encoded frame.
|
||||
The color space must be one known by the encoder.*/
|
||||
The color space must be one known by the encoder.
|
||||
The framerate ratio must not contain a zero value.*/
|
||||
if((_info->frame_width&0xF)||(_info->frame_height&0xF)||
|
||||
_info->frame_width<=0||_info->frame_width>=0x100000||
|
||||
_info->frame_height<=0||_info->frame_height>=0x100000||
|
||||
|
|
@ -719,7 +721,8 @@ int oc_state_init(oc_theora_state *_state,const th_info *_info,int _nrefs){
|
|||
but there are a number of compilers which will mis-optimize this.
|
||||
It's better to live with the spurious warnings.*/
|
||||
_info->colorspace<0||_info->colorspace>=TH_CS_NSPACES||
|
||||
_info->pixel_fmt<0||_info->pixel_fmt>=TH_PF_NFORMATS){
|
||||
_info->pixel_fmt<0||_info->pixel_fmt>=TH_PF_NFORMATS||
|
||||
_info->fps_numerator<1||_info->fps_denominator<1){
|
||||
return TH_EINVAL;
|
||||
}
|
||||
memset(_state,0,sizeof(*_state));
|
||||
|
|
|
|||
|
|
@ -11,7 +11,7 @@
|
|||
********************************************************************
|
||||
|
||||
function:
|
||||
last mod: $Id: mmxfrag.c 17410 2010-09-21 21:53:48Z tterribe $
|
||||
last mod: $Id$
|
||||
|
||||
********************************************************************/
|
||||
|
||||
|
|
@ -355,7 +355,7 @@ void oc_frag_recon_inter2_mmx(unsigned char *_dst,const unsigned char *_src1,
|
|||
/*Advance dest ptr.*/
|
||||
"lea (%[dst],%[ystride],2),%[dst]\n\t"
|
||||
:[dst]"+r"(_dst),[residue]"+r"(_residue),
|
||||
[src1]"+%r"(_src1),[src2]"+r"(_src2)
|
||||
[src1]"+r"(_src1),[src2]"+r"(_src2)
|
||||
:[ystride]"r"((ptrdiff_t)_ystride)
|
||||
:"memory"
|
||||
);
|
||||
|
|
|
|||
|
|
@ -11,7 +11,7 @@
|
|||
********************************************************************
|
||||
|
||||
function:
|
||||
last mod: $Id: mmxidct.c 17446 2010-09-23 20:06:20Z tterribe $
|
||||
last mod: $Id$
|
||||
|
||||
********************************************************************/
|
||||
|
||||
|
|
@ -284,6 +284,7 @@
|
|||
"#end OC_COLUMN_IDCT\n\t" \
|
||||
|
||||
static void oc_idct8x8_slow_mmx(ogg_int16_t _y[64],ogg_int16_t _x[64]){
|
||||
int i;
|
||||
/*This routine accepts an 8x8 matrix, but in partially transposed form.
|
||||
Every 4x4 block is transposed.*/
|
||||
__asm__ __volatile__(
|
||||
|
|
@ -313,18 +314,15 @@ static void oc_idct8x8_slow_mmx(ogg_int16_t _y[64],ogg_int16_t _x[64]){
|
|||
:[x]"m"OC_CONST_ARRAY_OPERAND(ogg_int16_t,_x,64),
|
||||
[c]"m"OC_CONST_ARRAY_OPERAND(ogg_int16_t,OC_IDCT_CONSTS,128)
|
||||
);
|
||||
if(_x!=_y){
|
||||
int i;
|
||||
__asm__ __volatile__("pxor %%mm0,%%mm0\n\t"::);
|
||||
for(i=0;i<4;i++){
|
||||
__asm__ __volatile__(
|
||||
"movq %%mm0,"OC_MEM_OFFS(0x00,x)"\n\t"
|
||||
"movq %%mm0,"OC_MEM_OFFS(0x08,x)"\n\t"
|
||||
"movq %%mm0,"OC_MEM_OFFS(0x10,x)"\n\t"
|
||||
"movq %%mm0,"OC_MEM_OFFS(0x18,x)"\n\t"
|
||||
:[x]"=m"OC_ARRAY_OPERAND(ogg_int16_t,_x+16*i,16)
|
||||
);
|
||||
}
|
||||
__asm__ __volatile__("pxor %%mm0,%%mm0\n\t"::);
|
||||
for(i=0;i<4;i++){
|
||||
__asm__ __volatile__(
|
||||
"movq %%mm0,"OC_MEM_OFFS(0x00,x)"\n\t"
|
||||
"movq %%mm0,"OC_MEM_OFFS(0x08,x)"\n\t"
|
||||
"movq %%mm0,"OC_MEM_OFFS(0x10,x)"\n\t"
|
||||
"movq %%mm0,"OC_MEM_OFFS(0x18,x)"\n\t"
|
||||
:[x]"=m"OC_ARRAY_OPERAND(ogg_int16_t,_x+16*i,16)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -514,16 +512,14 @@ static void oc_idct8x8_10_mmx(ogg_int16_t _y[64],ogg_int16_t _x[64]){
|
|||
:[x]"m"OC_CONST_ARRAY_OPERAND(ogg_int16_t,_x,64),
|
||||
[c]"m"OC_CONST_ARRAY_OPERAND(ogg_int16_t,OC_IDCT_CONSTS,128)
|
||||
);
|
||||
if(_x!=_y){
|
||||
__asm__ __volatile__(
|
||||
"pxor %%mm0,%%mm0\n\t"
|
||||
"movq %%mm0,"OC_MEM_OFFS(0x00,x)"\n\t"
|
||||
"movq %%mm0,"OC_MEM_OFFS(0x10,x)"\n\t"
|
||||
"movq %%mm0,"OC_MEM_OFFS(0x20,x)"\n\t"
|
||||
"movq %%mm0,"OC_MEM_OFFS(0x30,x)"\n\t"
|
||||
:[x]"+m"OC_ARRAY_OPERAND(ogg_int16_t,_x,28)
|
||||
);
|
||||
}
|
||||
__asm__ __volatile__(
|
||||
"pxor %%mm0,%%mm0\n\t"
|
||||
"movq %%mm0,"OC_MEM_OFFS(0x00,x)"\n\t"
|
||||
"movq %%mm0,"OC_MEM_OFFS(0x10,x)"\n\t"
|
||||
"movq %%mm0,"OC_MEM_OFFS(0x20,x)"\n\t"
|
||||
"movq %%mm0,"OC_MEM_OFFS(0x30,x)"\n\t"
|
||||
:[x]"+m"OC_ARRAY_OPERAND(ogg_int16_t,_x,28)
|
||||
);
|
||||
}
|
||||
|
||||
/*Performs an inverse 8x8 Type-II DCT transform.
|
||||
|
|
|
|||
|
|
@ -11,7 +11,7 @@
|
|||
********************************************************************
|
||||
|
||||
function:
|
||||
last mod: $Id: mmxstate.c 17563 2010-10-25 17:40:54Z tterribe $
|
||||
last mod: $Id$
|
||||
|
||||
********************************************************************/
|
||||
|
||||
|
|
|
|||
|
|
@ -208,6 +208,7 @@ const unsigned short __attribute__((aligned(16),used)) OC_IDCT_CONSTS[64]={
|
|||
|
||||
static void oc_idct8x8_slow_sse2(ogg_int16_t _y[64],ogg_int16_t _x[64]){
|
||||
OC_ALIGN16(ogg_int16_t buf[16]);
|
||||
int i;
|
||||
/*This routine accepts an 8x8 matrix pre-transposed.*/
|
||||
__asm__ __volatile__(
|
||||
/*Load rows 2, 3, 5, and 6 for the first stage of the iDCT.*/
|
||||
|
|
@ -230,19 +231,16 @@ static void oc_idct8x8_slow_sse2(ogg_int16_t _y[64],ogg_int16_t _x[64]){
|
|||
:[x]"m"(OC_CONST_ARRAY_OPERAND(ogg_int16_t,_x,64)),
|
||||
[c]"m"(OC_CONST_ARRAY_OPERAND(ogg_int16_t,OC_IDCT_CONSTS,128))
|
||||
);
|
||||
if(_x!=_y){
|
||||
int i;
|
||||
__asm__ __volatile__("pxor %%xmm0,%%xmm0\n\t"::);
|
||||
/*Clear input data for next block (decoder only).*/
|
||||
for(i=0;i<2;i++){
|
||||
__asm__ __volatile__(
|
||||
"movdqa %%xmm0,"OC_MEM_OFFS(0x00,x)"\n\t"
|
||||
"movdqa %%xmm0,"OC_MEM_OFFS(0x10,x)"\n\t"
|
||||
"movdqa %%xmm0,"OC_MEM_OFFS(0x20,x)"\n\t"
|
||||
"movdqa %%xmm0,"OC_MEM_OFFS(0x30,x)"\n\t"
|
||||
:[x]"=m"(OC_ARRAY_OPERAND(ogg_int16_t,_x+i*32,32))
|
||||
);
|
||||
}
|
||||
__asm__ __volatile__("pxor %%xmm0,%%xmm0\n\t"::);
|
||||
/*Clear input data for next block (decoder only).*/
|
||||
for(i=0;i<2;i++){
|
||||
__asm__ __volatile__(
|
||||
"movdqa %%xmm0,"OC_MEM_OFFS(0x00,x)"\n\t"
|
||||
"movdqa %%xmm0,"OC_MEM_OFFS(0x10,x)"\n\t"
|
||||
"movdqa %%xmm0,"OC_MEM_OFFS(0x20,x)"\n\t"
|
||||
"movdqa %%xmm0,"OC_MEM_OFFS(0x30,x)"\n\t"
|
||||
:[x]"=m"(OC_ARRAY_OPERAND(ogg_int16_t,_x+i*32,32))
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -411,17 +409,15 @@ static void oc_idct8x8_10_sse2(ogg_int16_t _y[64],ogg_int16_t _x[64]){
|
|||
:[x]"m"OC_CONST_ARRAY_OPERAND(ogg_int16_t,_x,64),
|
||||
[c]"m"(OC_CONST_ARRAY_OPERAND(ogg_int16_t,OC_IDCT_CONSTS,128))
|
||||
);
|
||||
if(_x!=_y){
|
||||
/*Clear input data for next block (decoder only).*/
|
||||
__asm__ __volatile__(
|
||||
"pxor %%mm0,%%mm0\n\t"
|
||||
"movq %%mm0,"OC_MEM_OFFS(0x00,x)"\n\t"
|
||||
"movq %%mm0,"OC_MEM_OFFS(0x10,x)"\n\t"
|
||||
"movq %%mm0,"OC_MEM_OFFS(0x20,x)"\n\t"
|
||||
"movq %%mm0,"OC_MEM_OFFS(0x30,x)"\n\t"
|
||||
:[x]"+m"(OC_ARRAY_OPERAND(ogg_int16_t,_x,28))
|
||||
);
|
||||
}
|
||||
/*Clear input data for next block (decoder only).*/
|
||||
__asm__ __volatile__(
|
||||
"pxor %%mm0,%%mm0\n\t"
|
||||
"movq %%mm0,"OC_MEM_OFFS(0x00,x)"\n\t"
|
||||
"movq %%mm0,"OC_MEM_OFFS(0x10,x)"\n\t"
|
||||
"movq %%mm0,"OC_MEM_OFFS(0x20,x)"\n\t"
|
||||
"movq %%mm0,"OC_MEM_OFFS(0x30,x)"\n\t"
|
||||
:[x]"+m"(OC_ARRAY_OPERAND(ogg_int16_t,_x,28))
|
||||
);
|
||||
}
|
||||
|
||||
/*Performs an inverse 8x8 Type-II DCT transform.
|
||||
|
|
|
|||
|
|
@ -14,7 +14,7 @@
|
|||
Originally written by Rudolf Marek.
|
||||
|
||||
function:
|
||||
last mod: $Id: x86cpu.c 17410 2010-09-21 21:53:48Z tterribe $
|
||||
last mod: $Id$
|
||||
|
||||
********************************************************************/
|
||||
|
||||
|
|
|
|||
|
|
@ -10,7 +10,7 @@
|
|||
* *
|
||||
********************************************************************
|
||||
function:
|
||||
last mod: $Id: x86cpu.h 17410 2010-09-21 21:53:48Z tterribe $
|
||||
last mod: $Id$
|
||||
|
||||
********************************************************************/
|
||||
|
||||
|
|
|
|||
|
|
@ -11,7 +11,7 @@
|
|||
********************************************************************
|
||||
|
||||
function:
|
||||
last mod: $Id: x86int.h 17578 2010-10-29 04:21:26Z tterribe $
|
||||
last mod: $Id$
|
||||
|
||||
********************************************************************/
|
||||
|
||||
|
|
|
|||
|
|
@ -11,7 +11,7 @@
|
|||
********************************************************************
|
||||
|
||||
function:
|
||||
last mod: $Id: x86state.c 17421 2010-09-22 16:46:18Z giles $
|
||||
last mod: $Id$
|
||||
|
||||
********************************************************************/
|
||||
|
||||
|
|
@ -19,6 +19,7 @@
|
|||
|
||||
#if defined(OC_X86_ASM)
|
||||
|
||||
#if defined(OC_STATE_USE_VTABLE)
|
||||
/*This table has been modified from OC_FZIG_ZAG by baking a 4x4 transpose into
|
||||
each quadrant of the destination.*/
|
||||
static const unsigned char OC_FZIG_ZAG_MMX[128]={
|
||||
|
|
@ -39,6 +40,7 @@ static const unsigned char OC_FZIG_ZAG_MMX[128]={
|
|||
64,64,64,64,64,64,64,64,
|
||||
64,64,64,64,64,64,64,64
|
||||
};
|
||||
#endif
|
||||
|
||||
/*This table has been modified from OC_FZIG_ZAG by baking an 8x8 transpose into
|
||||
the destination.*/
|
||||
|
|
|
|||
|
|
@ -11,7 +11,7 @@
|
|||
********************************************************************
|
||||
|
||||
function:
|
||||
last mod: $Id: mmxfrag.c 17446 2010-09-23 20:06:20Z tterribe $
|
||||
last mod: $Id$
|
||||
|
||||
********************************************************************/
|
||||
|
||||
|
|
|
|||
|
|
@ -11,7 +11,7 @@
|
|||
********************************************************************
|
||||
|
||||
function:
|
||||
last mod: $Id: mmxidct.c 17446 2010-09-23 20:06:20Z tterribe $
|
||||
last mod: $Id$
|
||||
|
||||
********************************************************************/
|
||||
|
||||
|
|
@ -339,22 +339,19 @@ static void oc_idct8x8_slow(ogg_int16_t _y[64],ogg_int16_t _x[64]){
|
|||
#undef Y
|
||||
#undef X
|
||||
}
|
||||
if(_x!=_y){
|
||||
int i;
|
||||
__asm pxor mm0,mm0;
|
||||
for(i=0;i<4;i++){
|
||||
ogg_int16_t *x;
|
||||
x=_x+16*i;
|
||||
__asm pxor mm0,mm0;
|
||||
for(i=0;i<4;i++){
|
||||
ogg_int16_t *x;
|
||||
x=_x+16*i;
|
||||
#define X ecx
|
||||
__asm{
|
||||
mov X,x
|
||||
movq [X+0x00],mm0
|
||||
movq [X+0x08],mm0
|
||||
movq [X+0x10],mm0
|
||||
movq [X+0x18],mm0
|
||||
}
|
||||
#undef X
|
||||
__asm{
|
||||
mov X,x
|
||||
movq [X+0x00],mm0
|
||||
movq [X+0x08],mm0
|
||||
movq [X+0x10],mm0
|
||||
movq [X+0x18],mm0
|
||||
}
|
||||
#undef X
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -547,18 +544,16 @@ static void oc_idct8x8_10(ogg_int16_t _y[64],ogg_int16_t _x[64]){
|
|||
#undef Y
|
||||
#undef X
|
||||
}
|
||||
if(_x!=_y){
|
||||
#define X ecx
|
||||
__asm{
|
||||
pxor mm0,mm0;
|
||||
mov X,_x
|
||||
movq [X+0x00],mm0
|
||||
movq [X+0x10],mm0
|
||||
movq [X+0x20],mm0
|
||||
movq [X+0x30],mm0
|
||||
}
|
||||
#undef X
|
||||
__asm{
|
||||
pxor mm0,mm0;
|
||||
mov X,_x
|
||||
movq [X+0x00],mm0
|
||||
movq [X+0x10],mm0
|
||||
movq [X+0x20],mm0
|
||||
movq [X+0x30],mm0
|
||||
}
|
||||
#undef X
|
||||
}
|
||||
|
||||
/*Performs an inverse 8x8 Type-II DCT transform.
|
||||
|
|
|
|||
|
|
@ -11,7 +11,7 @@
|
|||
********************************************************************
|
||||
|
||||
function:
|
||||
last mod: $Id: mmxstate.c 17563 2010-10-25 17:40:54Z tterribe $
|
||||
last mod: $Id$
|
||||
|
||||
********************************************************************/
|
||||
|
||||
|
|
|
|||
|
|
@ -14,7 +14,7 @@
|
|||
Originally written by Rudolf Marek.
|
||||
|
||||
function:
|
||||
last mod: $Id: x86cpu.c 17410 2010-09-21 21:53:48Z tterribe $
|
||||
last mod: $Id$
|
||||
|
||||
********************************************************************/
|
||||
|
||||
|
|
|
|||
|
|
@ -10,7 +10,7 @@
|
|||
* *
|
||||
********************************************************************
|
||||
function:
|
||||
last mod: $Id: x86cpu.h 17410 2010-09-21 21:53:48Z tterribe $
|
||||
last mod: $Id$
|
||||
|
||||
********************************************************************/
|
||||
|
||||
|
|
|
|||
|
|
@ -11,7 +11,7 @@
|
|||
********************************************************************
|
||||
|
||||
function:
|
||||
last mod: $Id: x86int.h 17410 2010-09-21 21:53:48Z tterribe $
|
||||
last mod: $Id$
|
||||
|
||||
********************************************************************/
|
||||
|
||||
|
|
|
|||
|
|
@ -11,7 +11,7 @@
|
|||
********************************************************************
|
||||
|
||||
function:
|
||||
last mod: $Id: x86state.c 17410 2010-09-21 21:53:48Z tterribe $
|
||||
last mod: $Id$
|
||||
|
||||
********************************************************************/
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue