Recherche avancée

Médias (91)

Autres articles (55)

  • (Dés)Activation de fonctionnalités (plugins)

    18 février 2011, par

    Pour gérer l’ajout et la suppression de fonctionnalités supplémentaires (ou plugins), MediaSPIP utilise à partir de la version 0.2 SVP.
    SVP permet l’activation facile de plugins depuis l’espace de configuration de MediaSPIP.
    Pour y accéder, il suffit de se rendre dans l’espace de configuration puis de se rendre sur la page "Gestion des plugins".
    MediaSPIP est fourni par défaut avec l’ensemble des plugins dits "compatibles", ils ont été testés et intégrés afin de fonctionner parfaitement avec chaque (...)

  • Activation de l’inscription des visiteurs

    12 avril 2011, par

    Il est également possible d’activer l’inscription des visiteurs ce qui permettra à tout un chacun d’ouvrir soit même un compte sur le canal en question dans le cadre de projets ouverts par exemple.
    Pour ce faire, il suffit d’aller dans l’espace de configuration du site en choisissant le sous menus "Gestion des utilisateurs". Le premier formulaire visible correspond à cette fonctionnalité.
    Par défaut, MediaSPIP a créé lors de son initialisation un élément de menu dans le menu du haut de la page menant (...)

  • MediaSPIP : Modification des droits de création d’objets et de publication définitive

    11 novembre 2010, par

    Par défaut, MediaSPIP permet de créer 5 types d’objets.
    Toujours par défaut les droits de création et de publication définitive de ces objets sont réservés aux administrateurs, mais ils sont bien entendu configurables par les webmestres.
    Ces droits sont ainsi bloqués pour plusieurs raisons : parce que le fait d’autoriser à publier doit être la volonté du webmestre pas de l’ensemble de la plateforme et donc ne pas être un choix par défaut ; parce qu’avoir un compte peut servir à autre choses également, (...)

Sur d’autres sites (10843)

  • FFMPEG Square video record issue in android ?

    20 avril 2017, par Mahesh

    When I start an android activity i get the following exception.
    I have tried many things to solve the problem without success.

    I am using the following github library for square video record :

    • https://github.com/sourab-sharma/TouchToRecord

      compile group: 'org.bytedeco', name: 'javacpp', version: '1.3.2'
      compile group: 'org.bytedeco', name: 'javacv', version: '1.3.2'
      compile group: 'org.bytedeco.javacpp-presets', name: 'opencv', version: '3.2.0-1.3', classifier: 'android-arm'
      compile group: 'org.bytedeco.javacpp-presets', name: 'opencv', version: '3.2.0-1.3', classifier: 'android-x86'
      compile group: 'org.bytedeco.javacpp-presets', name: 'ffmpeg', version: '3.2.1-1.3', classifier: 'android-arm'
      compile group: 'org.bytedeco.javacpp-presets', name: 'ffmpeg', version: '3.2.1-1.3', classifier: 'android-x86'
      compile group: 'org.bytedeco.javacpp-presets', name: 'opencv', version: '3.2.0-1.3'
      compile group: 'org.bytedeco.javacpp-presets', name: 'ffmpeg', version: '3.2.1-1.3'

    Here is the exception :

    04-20 17:53:15.433 30736-30792/com.sourab.videorecorder E/javacpp: Error getting static method ID of org/bytedeco/javacpp/Loader/putMemberOffset
    04-20 17:53:15.511 30736-30792/com.sourab.videorecorder A/art: art/runtime/java_vm_ext.cc:410] JNI DETECTED ERROR IN APPLICATION: JNI NewGlobalRef called with pending exception java.lang.NoSuchMethodError: no static method "Lorg/bytedeco/javacpp/Loader;.putMemberOffset(Ljava/lang/String;Ljava/lang/String;I)V"
    04-20 17:53:15.511 30736-30792/com.sourab.videorecorder A/art: art/runtime/java_vm_ext.cc:410]   at java.lang.String java.lang.Runtime.nativeLoad(java.lang.String, java.lang.ClassLoader, java.lang.String) (Runtime.java:-2)
    04-20 17:53:15.511 30736-30792/com.sourab.videorecorder A/art: art/runtime/java_vm_ext.cc:410]   at java.lang.String java.lang.Runtime.doLoad(java.lang.String, java.lang.ClassLoader) (Runtime.java:435)
    04-20 17:53:15.511 30736-30792/com.sourab.videorecorder A/art: art/runtime/java_vm_ext.cc:410]   at void java.lang.Runtime.loadLibrary(java.lang.String, java.lang.ClassLoader) (Runtime.java:370)
    04-20 17:53:15.511 30736-30792/com.sourab.videorecorder A/art: art/runtime/java_vm_ext.cc:410]   at void java.lang.System.loadLibrary(java.lang.String) (System.java:1076)
    04-20 17:53:15.511 30736-30792/com.sourab.videorecorder A/art: art/runtime/java_vm_ext.cc:410]   at java.lang.String org.bytedeco.javacpp.Loader.loadLibrary(java.net.URL[], java.lang.String) (Loader.java:963)
    04-20 17:53:15.511 30736-30792/com.sourab.videorecorder A/art: art/runtime/java_vm_ext.cc:410]   at java.lang.String org.bytedeco.javacpp.Loader.load(java.lang.Class, java.util.Properties, boolean) (Loader.java:764)
    04-20 17:53:15.511 30736-30792/com.sourab.videorecorder A/art: art/runtime/java_vm_ext.cc:410]   at java.lang.String org.bytedeco.javacpp.Loader.load() (Loader.java:671)
    04-20 17:53:15.511 30736-30792/com.sourab.videorecorder A/art: art/runtime/java_vm_ext.cc:410]   at void org.bytedeco.javacpp.avutil.<clinit>() (avutil.java:10)
    04-20 17:53:15.511 30736-30792/com.sourab.videorecorder A/art: art/runtime/java_vm_ext.cc:410]   at java.lang.Class java.lang.Class.classForName!(java.lang.String, boolean, java.lang.ClassLoader) (Class.java:-2)
    04-20 17:53:15.511 30736-30792/com.sourab.videorecorder A/art: art/runtime/java_vm_ext.cc:410]   at java.lang.Class java.lang.Class.forName(java.lang.String, boolean, java.lang.ClassLoader) (Class.java:324)
    04-20 17:53:15.511 30736-30792/com.sourab.videorecorder A/art: art/runtime/java_vm_ext.cc:410]   at java.lang.String org.bytedeco.javacpp.Loader.load(java.lang.Class, java.util.Properties, boolean) (Loader.java:726)
    04-20 17:53:15.511 30736-30792/com.sourab.videorecorder A/art: art/runtime/java_vm_ext.cc:410]   at java.lang.String org.bytedeco.javacpp.Loader.load(java.lang.Class) (Loader.java:687)
    04-20 17:53:15.511 30736-30792/com.sourab.videorecorder A/art: art/runtime/java_vm_ext.cc:410]   at void com.sourab.videorecorder.FFmpegFrameRecorder.tryLoad() (FFmpegFrameRecorder.java:110)
    04-20 17:53:15.511 30736-30792/com.sourab.videorecorder A/art: art/runtime/java_vm_ext.cc:410]   at void com.sourab.videorecorder.FFmpegFrameRecorder.<clinit>() (FFmpegFrameRecorder.java:131)
    04-20 17:53:15.511 30736-30792/com.sourab.videorecorder A/art: art/runtime/java_vm_ext.cc:410]   at void com.sourab.videorecorder.FFmpegRecorderActivity.initVideoRecorder() (FFmpegRecorderActivity.java:404)
    04-20 17:53:15.511 30736-30792/com.sourab.videorecorder A/art: art/runtime/java_vm_ext.cc:410]   at void com.sourab.videorecorder.FFmpegRecorderActivity.access$1700(com.sourab.videorecorder.FFmpegRecorderActivity) (FFmpegRecorderActivity.java:68)
    04-20 17:53:15.511 30736-30792/com.sourab.videorecorder A/art: art/runtime/java_vm_ext.cc:410]   at java.lang.Boolean com.sourab.videorecorder.FFmpegRecorderActivity$2.doInBackground(java.lang.String[]) (FFmpegRecorderActivity.java:314)
    04-20 17:53:15.511 30736-30792/com.sourab.videorecorder A/art: art/runtime/java_vm_ext.cc:410]   at java.lang.Object com.sourab.videorecorder.FFmpegRecorderActivity$2.doInBackground(java.lang.Object[]) (FFmpegRecorderActivity.java:308)
    04-20 17:53:15.511 30736-30792/com.sourab.videorecorder A/art: art/runtime/java_vm_ext.cc:410]   at java.lang.Object android.os.AsyncTask$2.call() (AsyncTask.java:295)
    04-20 17:53:15.511 30736-30792/com.sourab.videorecorder A/art: art/runtime/java_vm_ext.cc:410]   at void java.util.concurrent.FutureTask.run() (FutureTask.java:237)
    04-20 17:53:15.511 30736-30792/com.sourab.videorecorder A/art: art/runtime/java_vm_ext.cc:410]   at void android.os.AsyncTask$SerialExecutor$1.run() (AsyncTask.java:234)
    04-20 17:53:15.511 30736-30792/com.sourab.videorecorder A/art: art/runtime/java_vm_ext.cc:410]   at void java.util.concurrent.ThreadPoolExecutor.runWorker(java.util.concurrent.ThreadPoolExecutor$Worker) (ThreadPoolExecutor.java:1113)
    04-20 17:53:15.511 30736-30792/com.sourab.videorecorder A/art: art/runtime/java_vm_ext.cc:410]   at void java.util.concurrent.ThreadPoolExecutor$Worker.run() (ThreadPoolExecutor.java:588)
    04-20 17:53:15.511 30736-30792/com.sourab.videorecorder A/art: art/runtime/java_vm_ext.cc:410]   at void java.lang.Thread.run() (Thread.java:818)
    04-20 17:53:15.511 30736-30792/com.sourab.videorecorder A/art: art/runtime/java_vm_ext.cc:410]
    04-20 17:53:15.511 30736-30792/com.sourab.videorecorder A/art: art/runtime/java_vm_ext.cc:410]     in call to NewGlobalRef
    04-20 17:53:15.511 30736-30792/com.sourab.videorecorder A/art: art/runtime/java_vm_ext.cc:410]     from java.lang.String java.lang.Runtime.nativeLoad(java.lang.String, java.lang.ClassLoader, java.lang.String)
    04-20 17:53:15.511 30736-30792/com.sourab.videorecorder A/art: art/runtime/java_vm_ext.cc:410] "AsyncTask #1" prio=5 tid=10 Runnable
    04-20 17:53:15.511 30736-30792/com.sourab.videorecorder A/art: art/runtime/java_vm_ext.cc:410]   | group="main" sCount=0 dsCount=0 obj=0x12ce51c0 self=0xb87a5470
    04-20 17:53:15.511 30736-30792/com.sourab.videorecorder A/art: art/runtime/java_vm_ext.cc:410]   | sysTid=30792 nice=10 cgrp=bg_non_interactive sched=0/0 handle=0xa37f9930
    04-20 17:53:15.511 30736-30792/com.sourab.videorecorder A/art: art/runtime/java_vm_ext.cc:410]   | state=R schedstat=( 0 0 0 ) utm=11 stm=6 core=3 HZ=100
    04-20 17:53:15.511 30736-30792/com.sourab.videorecorder A/art: art/runtime/java_vm_ext.cc:410]   | stack=0xa36f7000-0xa36f9000 stackSize=1038KB
    04-20 17:53:15.511 30736-30792/com.sourab.videorecorder A/art: art/runtime/java_vm_ext.cc:410]   | held mutexes= "mutator lock"(shared held)
    04-20 17:53:15.511 30736-30792/com.sourab.videorecorder A/art: art/runtime/java_vm_ext.cc:410]   native: #00 pc 00370c01  /system/lib/libart.so (_ZN3art15DumpNativeStackERNSt3__113basic_ostreamIcNS0_11char_traitsIcEEEEiPKcPNS_9ArtMethodEPv+160)
    04-20 17:53:15.511 30736-30792/com.sourab.videorecorder A/art: art/runtime/java_vm_ext.cc:410]   native: #01 pc 0035054b  /system/lib/libart.so (_ZNK3art6Thread4DumpERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEE+150)
    04-20 17:53:15.511 30736-30792/com.sourab.videorecorder A/art: art/runtime/java_vm_ext.cc:410]   native: #02 pc 0025a50d  /system/lib/libart.so (_ZN3art9JavaVMExt8JniAbortEPKcS2_+740)
    04-20 17:53:15.511 30736-30792/com.sourab.videorecorder A/art: art/runtime/java_vm_ext.cc:410]   native: #03 pc 0025abe5  /system/lib/libart.so (_ZN3art9JavaVMExt9JniAbortVEPKcS2_St9__va_list+64)
    04-20 17:53:15.512 30736-30792/com.sourab.videorecorder A/art: art/runtime/java_vm_ext.cc:410]   native: #04 pc 000fd2e1  /system/lib/libart.so (_ZN3art11ScopedCheck6AbortFEPKcz+32)
    04-20 17:53:15.512 30736-30792/com.sourab.videorecorder A/art: art/runtime/java_vm_ext.cc:410]   native: #05 pc 001023f5  /system/lib/libart.so (_ZN3art11ScopedCheck5CheckERNS_18ScopedObjectAccessEbPKcPNS_12JniValueTypeE.constprop.95+5072)
    04-20 17:53:15.512 30736-30792/com.sourab.videorecorder A/art: art/runtime/java_vm_ext.cc:410]   native: #06 pc 001147e1  /system/lib/libart.so (_ZN3art8CheckJNI12NewGlobalRefEP7_JNIEnvP8_jobject+392)
    04-20 17:53:15.512 30736-30792/com.sourab.videorecorder A/art: art/runtime/java_vm_ext.cc:410]   native: #07 pc 0034918b  /system/lib/libart.so (_ZN3art6Thread22SetClassLoaderOverrideEP8_jobject+38)
    04-20 17:53:15.512 30736-30792/com.sourab.videorecorder A/art: art/runtime/java_vm_ext.cc:410]   native: #08 pc 0025b1a3  /system/lib/libart.so (_ZN3art9JavaVMExt17LoadNativeLibraryEP7_JNIEnvRKNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEEP8_jobjectPS9_+1290)
    04-20 17:53:15.512 30736-30792/com.sourab.videorecorder A/art: art/runtime/java_vm_ext.cc:410]   native: #09 pc 002d1427  /system/lib/libart.so (_ZN3artL18Runtime_nativeLoadEP7_JNIEnvP7_jclassP8_jstringP8_jobjectS5_+194)
    04-20 17:53:15.512 30736-30792/com.sourab.videorecorder A/art: art/runtime/java_vm_ext.cc:410]   native: #10 pc 00212035  /data/dalvik-cache/arm/system@framework@boot.oat (Java_java_lang_Runtime_nativeLoad__Ljava_lang_String_2Ljava_lang_ClassLoader_2Ljava_lang_String_2+144)
    04-20 17:53:15.512 30736-30792/com.sourab.videorecorder A/art: art/runtime/java_vm_ext.cc:410]   at java.lang.Runtime.nativeLoad(Native method)
    04-20 17:53:15.512 30736-30792/com.sourab.videorecorder A/art: art/runtime/java_vm_ext.cc:410]   at java.lang.Runtime.doLoad(Runtime.java:435)
    04-20 17:53:15.512 30736-30792/com.sourab.videorecorder A/art: art/runtime/java_vm_ext.cc:410]   - locked &lt;0x0cbcf61e> (a java.lang.Runtime)
    04-20 17:53:15.512 30736-30792/com.sourab.videorecorder A/art: art/runtime/java_vm_ext.cc:410]   at java.lang.Runtime.loadLibrary(Runtime.java:370)
    04-20 17:53:15.512 30736-30792/com.sourab.videorecorder A/art: art/runtime/java_vm_ext.cc:410]   at java.lang.System.loadLibrary(System.java:1076)
    04-20 17:53:15.512 30736-30792/com.sourab.videorecorder A/art: art/runtime/java_vm_ext.cc:410]   at org.bytedeco.javacpp.Loader.loadLibrary(Loader.java:963)
    04-20 17:53:15.512 30736-30792/com.sourab.videorecorder A/art: art/runtime/java_vm_ext.cc:410]   at org.bytedeco.javacpp.Loader.load(Loader.java:764)
    04-20 17:53:15.512 30736-30792/com.sourab.videorecorder A/art: art/runtime/java_vm_ext.cc:410]   at org.bytedeco.javacpp.Loader.load(Loader.java:671)
    04-20 17:53:15.512 30736-30792/com.sourab.videorecorder A/art: art/runtime/java_vm_ext.cc:410]   at org.bytedeco.javacpp.avutil.<clinit>(avutil.java:10)
    04-20 17:53:15.512 30736-30792/com.sourab.videorecorder A/art: art/runtime/java_vm_ext.cc:410]   at java.lang.Class.classForName!(Native method)
    04-20 17:53:15.512 30736-30792/com.sourab.videorecorder A/art: art/runtime/java_vm_ext.cc:410]   at java.lang.Class.forName(Class.java:324)
    04-20 17:53:15.512 30736-30792/com.sourab.videorecorder A/art: art/runtime/java_vm_ext.cc:410]   at org.bytedeco.javacpp.Loader.load(Loader.java:726)
    04-20 17:53:15.512 30736-30792/com.sourab.videorecorder A/art: art/runtime/java_vm_ext.cc:410]   at org.bytedeco.javacpp.Loader.load(Loader.java:687)
    04-20 17:53:15.512 30736-30792/com.sourab.videorecorder A/art: art/runtime/java_vm_ext.cc:410]   at com.sourab.videorecorder.FFmpegFrameRecorder.tryLoad(FFmpegFrameRecorder.java:110)
    04-20 17:53:15.512 30736-30792/com.sourab.videorecorder A/art: art/runtime/java_vm_ext.cc:410]   at com.sourab.videorecorder.FFmpegFrameRecorder.<clinit>(FFmpegFrameRecorder.java:131)
    04-20 17:53:15.512 30736-30792/com.sourab.videorecorder A/art: art/runtime/java_vm_ext.cc:410]   at com.sourab.videorecorder.FFmpegRecorderActivity.initVideoRecorder(FFmpegRecorderActivity.java:404)
    </clinit></clinit></clinit></clinit>
  • avcodec/riscv : add h264 qpel

    25 septembre 2024, par Niklas Haas
    avcodec/riscv : add h264 qpel
    

    Benched on K230 for VLEN 128, SpaceMIT for VLEN 256. Variants for 4
    width have no speedup for VLEN 256 vs VLEN 128 on available hardware,
    so were disabled.

    C RVV128 C RVV256
    avg_h264_qpel_4_mc00_8 33.9 33.6 (1.01x)
    avg_h264_qpel_4_mc01_8 218.8 89.1 (2.46x)
    avg_h264_qpel_4_mc02_8 218.8 79.8 (2.74x)
    avg_h264_qpel_4_mc03_8 218.8 89.1 (2.46x)
    avg_h264_qpel_4_mc10_8 172.3 126.1 (1.37x)
    avg_h264_qpel_4_mc11_8 339.1 190.8 (1.78x)
    avg_h264_qpel_4_mc12_8 533.6 357.6 (1.49x)
    avg_h264_qpel_4_mc13_8 348.4 190.8 (1.83x)
    avg_h264_qpel_4_mc20_8 144.8 116.8 (1.24x)
    avg_h264_qpel_4_mc21_8 478.1 385.6 (1.24x)
    avg_h264_qpel_4_mc22_8 348.4 283.6 (1.23x)
    avg_h264_qpel_4_mc23_8 478.1 394.6 (1.21x)
    avg_h264_qpel_4_mc30_8 172.6 126.1 (1.37x)
    avg_h264_qpel_4_mc31_8 339.4 191.1 (1.78x)
    avg_h264_qpel_4_mc32_8 542.9 357.6 (1.52x)
    avg_h264_qpel_4_mc33_8 339.4 191.1 (1.78x)
    avg_h264_qpel_8_mc00_8 116.8 42.9 (2.72x) 123.6 50.6 (2.44x)
    avg_h264_qpel_8_mc01_8 774.4 163.1 (4.75x) 779.8 165.1 (4.72x)
    avg_h264_qpel_8_mc02_8 774.4 154.1 (5.03x) 779.8 144.3 (5.40x)
    avg_h264_qpel_8_mc03_8 774.4 163.3 (4.74x) 779.8 165.3 (4.72x)
    avg_h264_qpel_8_mc10_8 617.1 237.3 (2.60x) 613.1 227.6 (2.69x)
    avg_h264_qpel_8_mc11_8 1209.3 376.4 (3.21x) 1206.8 363.1 (3.32x)
    avg_h264_qpel_8_mc12_8 1913.3 598.6 (3.20x) 1894.3 561.1 (3.38x)
    avg_h264_qpel_8_mc13_8 1218.6 376.4 (3.24x) 1217.1 363.1 (3.35x)
    avg_h264_qpel_8_mc20_8 524.4 228.1 (2.30x) 519.3 227.6 (2.28x)
    avg_h264_qpel_8_mc21_8 1709.6 681.9 (2.51x) 1707.1 644.3 (2.65x)
    avg_h264_qpel_8_mc22_8 1274.3 459.6 (2.77x) 1279.8 436.1 (2.93x)
    avg_h264_qpel_8_mc23_8 1700.3 672.6 (2.53x) 1706.8 644.6 (2.65x)
    avg_h264_qpel_8_mc30_8 607.6 246.6 (2.46x) 623.6 238.1 (2.62x)
    avg_h264_qpel_8_mc31_8 1209.6 376.4 (3.21x) 1206.8 363.1 (3.32x)
    avg_h264_qpel_8_mc32_8 1904.1 607.9 (3.13x) 1894.3 571.3 (3.32x)
    avg_h264_qpel_8_mc33_8 1209.6 376.1 (3.22x) 1206.8 363.1 (3.32x)
    avg_h264_qpel_16_mc00_8 431.9 89.1 (4.85x) 436.1 71.3 (6.12x)
    avg_h264_qpel_16_mc01_8 2894.6 376.1 (7.70x) 2842.3 300.6 (9.46x)
    avg_h264_qpel_16_mc02_8 2987.3 348.4 (8.57x) 2967.3 290.1 (10.23x)
    avg_h264_qpel_16_mc03_8 2885.3 376.4 (7.67x) 2842.3 300.6 (9.46x)
    avg_h264_qpel_16_mc10_8 2404.1 524.4 (4.58x) 2404.8 456.8 (5.26x)
    avg_h264_qpel_16_mc11_8 4709.4 811.6 (5.80x) 4675.6 706.8 (6.62x)
    avg_h264_qpel_16_mc12_8 7477.9 1274.3 (5.87x) 7436.1 1061.1 (7.01x)
    avg_h264_qpel_16_mc13_8 4718.6 820.6 (5.75x) 4655.1 706.8 (6.59x)
    avg_h264_qpel_16_mc20_8 2052.1 487.1 (4.21x) 2071.3 446.3 (4.64x)
    avg_h264_qpel_16_mc21_8 7440.6 1422.6 (5.23x) 6727.8 1217.3 (5.53x)
    avg_h264_qpel_16_mc22_8 5051.9 950.4 (5.32x) 5071.6 790.3 (6.42x)
    avg_h264_qpel_16_mc23_8 6764.9 1422.3 (4.76x) 6748.6 1217.3 (5.54x)
    avg_h264_qpel_16_mc30_8 2413.1 524.4 (4.60x) 2415.1 467.3 (5.17x)
    avg_h264_qpel_16_mc31_8 4681.6 839.1 (5.58x) 4675.6 727.6 (6.43x)
    avg_h264_qpel_16_mc32_8 8579.6 1292.8 (6.64x) 7436.3 1071.3 (6.94x)
    avg_h264_qpel_16_mc33_8 5375.9 829.9 (6.48x) 4665.3 717.3 (6.50x)
    put_h264_qpel_4_mc00_8 24.4 24.4 (1.00x)
    put_h264_qpel_4_mc01_8 987.4 79.8 (12.37x)
    put_h264_qpel_4_mc02_8 190.8 79.8 (2.39x)
    put_h264_qpel_4_mc03_8 209.6 89.1 (2.35x)
    put_h264_qpel_4_mc10_8 163.3 117.1 (1.39x)
    put_h264_qpel_4_mc11_8 339.4 181.6 (1.87x)
    put_h264_qpel_4_mc12_8 533.6 348.4 (1.53x)
    put_h264_qpel_4_mc13_8 339.4 190.8 (1.78x)
    put_h264_qpel_4_mc20_8 126.3 116.8 (1.08x)
    put_h264_qpel_4_mc21_8 468.9 376.1 (1.25x)
    put_h264_qpel_4_mc22_8 330.1 274.4 (1.20x)
    put_h264_qpel_4_mc23_8 468.9 376.1 (1.25x)
    put_h264_qpel_4_mc30_8 163.3 126.3 (1.29x)
    put_h264_qpel_4_mc31_8 339.1 191.1 (1.77x)
    put_h264_qpel_4_mc32_8 533.6 348.4 (1.53x)
    put_h264_qpel_4_mc33_8 339.4 181.8 (1.87x)
    put_h264_qpel_8_mc00_8 98.6 33.6 (2.93x) 92.3 40.1 (2.30x)
    put_h264_qpel_8_mc01_8 737.1 153.8 (4.79x) 738.1 144.3 (5.12x)
    put_h264_qpel_8_mc02_8 663.1 135.3 (4.90x) 665.1 134.1 (4.96x)
    put_h264_qpel_8_mc03_8 737.4 154.1 (4.79x) 1508.8 144.3 (10.46x)
    put_h264_qpel_8_mc10_8 598.4 237.1 (2.52x) 592.3 227.6 (2.60x)
    put_h264_qpel_8_mc11_8 1172.3 357.9 (3.28x) 1175.6 342.3 (3.43x)
    put_h264_qpel_8_mc12_8 1867.1 589.1 (3.17x) 1863.1 561.1 (3.32x)
    put_h264_qpel_8_mc13_8 1172.6 366.9 (3.20x) 1175.6 352.8 (3.33x)
    put_h264_qpel_8_mc20_8 450.4 218.8 (2.06x) 446.3 206.8 (2.16x)
    put_h264_qpel_8_mc21_8 1672.3 663.1 (2.52x) 1675.6 633.8 (2.64x)
    put_h264_qpel_8_mc22_8 1144.6 1200.1 (0.95x) 1144.3 425.6 (2.69x)
    put_h264_qpel_8_mc23_8 1672.6 672.4 (2.49x) 1665.3 634.1 (2.63x)
    put_h264_qpel_8_mc30_8 598.6 237.3 (2.52x) 613.1 227.6 (2.69x)
    put_h264_qpel_8_mc31_8 1172.3 376.1 (3.12x) 1175.6 352.6 (3.33x)
    put_h264_qpel_8_mc32_8 1857.8 598.6 (3.10x) 1863.1 561.1 (3.32x)
    put_h264_qpel_8_mc33_8 1172.3 376.1 (3.12x) 1175.6 352.8 (3.33x)
    put_h264_qpel_16_mc00_8 320.6 61.4 (5.22x) 321.3 60.8 (5.28x)
    put_h264_qpel_16_mc01_8 2774.3 339.1 (8.18x) 2759.1 279.8 (9.86x)
    put_h264_qpel_16_mc02_8 2589.1 320.6 (8.08x) 2571.6 269.3 (9.55x)
    put_h264_qpel_16_mc03_8 2774.3 339.4 (8.17x) 2738.1 290.1 (9.44x)
    put_h264_qpel_16_mc10_8 2274.3 487.4 (4.67x) 2290.1 436.1 (5.25x)
    put_h264_qpel_16_mc11_8 5237.1 792.9 (6.60x) 4529.8 685.8 (6.61x)
    put_h264_qpel_16_mc12_8 7357.6 1255.8 (5.86x) 7352.8 1040.1 (7.07x)
    put_h264_qpel_16_mc13_8 4579.9 792.9 (5.78x) 4571.6 686.1 (6.66x)
    put_h264_qpel_16_mc20_8 1802.1 459.6 (3.92x) 1800.6 425.6 (4.23x)
    put_h264_qpel_16_mc21_8 6644.6 2246.6 (2.96x) 6644.3 1196.6 (5.55x)
    put_h264_qpel_16_mc22_8 4589.1 913.4 (5.02x) 4592.3 769.3 (5.97x)
    put_h264_qpel_16_mc23_8 6644.6 1394.6 (4.76x) 6634.1 1196.6 (5.54x)
    put_h264_qpel_16_mc30_8 2274.3 496.6 (4.58x) 2290.1 456.8 (5.01x)
    put_h264_qpel_16_mc31_8 5255.6 802.1 (6.55x) 4550.8 706.8 (6.44x)
    put_h264_qpel_16_mc32_8 7376.1 1265.1 (5.83x) 7352.8 1050.6 (7.00x)
    put_h264_qpel_16_mc33_8 4579.9 802.1 (5.71x) 4561.1 696.3 (6.55x)

    Signed-off-by : Niklas Haas <git@haasn.dev>
    Signed-off-by : J. Dekker <jdek@itanimul.li>

    • [DH] libavcodec/h264qpel.c
    • [DH] libavcodec/h264qpel.h
    • [DH] libavcodec/riscv/Makefile
    • [DH] libavcodec/riscv/h264qpel_init.c
    • [DH] libavcodec/riscv/h264qpel_rvv.S
  • Reverse Engineering Clue Chronicles Compression

    15 janvier 2019, par Multimedia Mike — Game Hacking

    My last post described my exploration into the 1999 computer game Clue Chronicles : Fatal Illusion. Some readers expressed interest in the details so I thought I would post a bit more about how I have investigated and what I have learned.

    It’s frustrating to need to reverse engineer a compression algorithm that is only applied to a total of 8 files (out of a total set of 140), but here we are. Still, I’m glad some others expressed interest in this challenge as it motivated me to author this post, which in turn prompted me to test and challenge some of my assumptions.

    Spoiler : Commenter ‘m’ gave me the clue I needed : PKWare Data Compression Library used the implode algorithm rather than deflate. I was able to run this .ini data through an open source explode algorithm found in libmpq and got the correct data out.

    Files To Study
    I uploaded a selection of files for others to study, should they feel so inclined. These include the main game binary (if anyone has ideas about how to isolate the decompression algorithm from the deadlisting) ; compressed and uncompressed examples from 2 files (newspaper.ini and Drink.ini) ; and the compressed version of Clue.ini, which I suspect is the root of the game’s script.

    The Story So Far
    This ad-hoc scripting language found in the Clue Chronicles game is driven by a series of .ini files that are available in both compressed and uncompressed forms, save for a handful of them which only come in compressed flavor. I have figured out a few obvious details of the compressed file format :

    bytes 0-3 "COMP"
    bytes 4-11 unknown
    bytes 12-15 size of uncompressed data
    bytes 16-19 size of compressed data (filesize - 20 bytes)
    bytes 20- compressed payload
    

    The average compression ratio is on the same order as what could be achieved by running ‘gzip’ against the uncompressed files and using one of the lower number settings (i.e., favor speed vs. compression size, e.g., ‘gzip -2’ or ‘gzip -3’). Since the zlib/DEFLATE algorithm is quite widespread on every known computing platform, I thought that this would be a good candidate to test.

    Exploration
    My thinking was that I could load the bytes in the compressed ini file and feed it into Python’s zlib library, sliding through the first 100 bytes to see if any of them “catch” on the zlib decompression algorithm.

    Here is the exploration script :

    &lt;script src=&quot;https://gist.github.com/multimediamike/c95f1a9cc58b959f4d8b2a299927d35e.js&quot;&gt;&lt;/script&gt;

    It didn’t work, i.e., the script did not find any valid zlib data. A commentor on my last post suggested trying bzip2, so I tried the same script but with the bzip2 decompressor library. Still no luck.

    Wrong Approach
    I realized I had not tested to make sure that this exploratory script would work on known zlib data. So I ran it on a .gz file and it failed to find zlib data. So it looks like my assumptions were wrong. Meanwhile, I can instruct Python to compress data with zlib and dump the data to a file, and then run the script against that raw zlib output and the script recognizes the data.

    I spent some time examining how zlib and gzip interact at the format level. It looks like the zlib data doesn’t actually begin on byte boundaries within a gzip container. So this approach was doomed to failure.

    A Closer Look At The Executable
    Installation of Clue Chronicles results in a main Windows executable named Fatal_Illusion.exe. It occurred to me to examine this again, specifically for references to something like zlib.dll. Nothing like that. However, a search for ‘compr’ shows various error messages which imply that there is PNG-related code inside (referencing IHDR and zTXt data types), even though PNG files are not present in the game’s asset mix.

    But there are also strings like “PKWARE Data Compression Library for Win32”. So I have started going down the rabbit hole of determining whether the compression is part of a ZIP format file. After all, a ZIP local file header data structure has 4-byte compressed and uncompressed sizes, as seen in this format.

    Binary Reverse Engineering
    At one point, I took the approach of attempting to reverse engineer the binary. When studying a deadlisting of the code, it’s easy to search for the string “COMP” and find some code that cares about these compressed files. Unfortunately, the code quickly follows an indirect jump instruction which makes it intractable to track the algorithm from a simple deadlisting.

    I also tried installing some old Microsoft dev tools on my old Windows XP box and setting some breakpoints while the game was running and do some old-fashioned step debugging. That was a total non-starter. According to my notes :

    Address 0x004A3C32 is the setup to the strncmp(“COMP”, ini_data, 4) function call. Start there.

    Problem : The game forces 640x480x256 mode and that makes debugging very difficult.

    Just For One Game ?
    I keep wondering if this engine was used for any other games. Clue Chronicles was created by EAI Interactive. As I review the list of games they are known to have created (ranging between 1997 and 2000), a few of them jump out at me as possibly being able to leverage the same engine. I have a few of them, so I checked those… nothing. Then I scrubbed some YouTube videos showing gameplay of other suspects. None of those strike me as having similar engine characteristics to Clue Chronicles. So this remains a mystery : did they really craft this engine with its own scripting language just for one game ?

    The post Reverse Engineering Clue Chronicles Compression first appeared on Breaking Eggs And Making Omelettes.