install:
$(INSTALL) -d "$(DESTDIR)$(prefix)"
+ $(INSTALL) -d "$(DESTDIR)$(prefix)/$(libdir)"
$(INSTALL) -d "$(DESTDIR)$(prefix)/bin"
$(INSTALL) $(INSTFLAGS) -m 755 bin/gcc/MP4Box "$(DESTDIR)$(prefix)/bin"
$(INSTALL) $(INSTFLAGS) -m 755 bin/gcc/MP4Client "$(DESTDIR)$(prefix)/bin"
+ if [ -d $(DESTDIR)$(prefix)/$(libdir)/pkgconfig ] ; then \
+ $(INSTALL) $(INSTFLAGS) -m 644 gpac.pc "$(DESTDIR)$(prefix)/$(libdir)/pkgconfig" ; \
+ fi
$(INSTALL) -d "$(DESTDIR)$(moddir)"
$(INSTALL) bin/gcc/*.$(DYN_LIB_SUFFIX) "$(DESTDIR)$(moddir)"
rm -f $(DESTDIR)$(moddir)/libgpac.$(DYN_LIB_SUFFIX)
$(MAKE) -C applications uninstall
rm -rf $(DESTDIR)$(moddir)
rm -rf $(DESTDIR)$(prefix)/$(libdir)/libgpac*
+ rm -rf $(DESTDIR)$(prefix)/$(libdir)/pkgconfig/gpac.pc
rm -rf $(DESTDIR)$(prefix)/bin/MP4Box
rm -rf $(DESTDIR)$(prefix)/bin/MP4Client
rm -rf $(DESTDIR)$(mandir)/man1/mp4box.1
else if (!stricmp(arg, "-split-chunk") || !stricmp(arg, "-splitx") || !stricmp(arg, "-splitz")) {
CHECK_NEXT_ARG
if (!strstr(argv[i+1], ":")) {
- fprintf(stdout, "Chunk extraction usage: \"-splitx start->end\" expressed in seconds\n");
+ fprintf(stdout, "Chunk extraction usage: \"-splitx start:end\" expressed in seconds\n");
return 1;
}
sscanf(argv[i+1], "%lf:%lf", &split_start, &split_duration);
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
- <classpathentry kind="src" path="src"/>
- <classpathentry kind="src" path="gen"/>
- <classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
- <classpathentry kind="output" path="bin"/>
-</classpath>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
- <name>mp4box</name>
- <comment></comment>
- <projects>
- </projects>
- <buildSpec>
- <buildCommand>
- <name>com.android.ide.eclipse.adt.ResourceManagerBuilder</name>
- <arguments>
- </arguments>
- </buildCommand>
- <buildCommand>
- <name>com.android.ide.eclipse.adt.PreCompilerBuilder</name>
- <arguments>
- </arguments>
- </buildCommand>
- <buildCommand>
- <name>org.eclipse.jdt.core.javabuilder</name>
- <arguments>
- </arguments>
- </buildCommand>
- <buildCommand>
- <name>com.android.ide.eclipse.adt.ApkBuilder</name>
- <arguments>
- </arguments>
- </buildCommand>
- </buildSpec>
- <natures>
- <nature>com.android.ide.eclipse.adt.AndroidNature</nature>
- <nature>org.eclipse.jdt.core.javanature</nature>
- </natures>
-</projectDescription>
+++ /dev/null
-<?xml version="1.0" encoding="utf-8"?>
- <manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.enst.mp4box"
- android:versionCode="1"
- android:versionName="1.0">
-<uses-sdk minSdkVersion="3"/>
-<application android:label="@string/app_name" android:icon="@drawable/icon">
- <activity android:label="@string/app_name" android:name="com.enst.mp4box">
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <category android:name="android.intent.category.LAUNCHER" />
- </intent-filter>
- </activity>
-</application>
-</manifest>
-
+++ /dev/null
-# This file is automatically generated by Android Tools.
-# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
-#
-# This file must be checked in Version Control Systems.
-#
-# To customize properties used by the Ant build system use,
-# "build.properties", and override values to adapt the script to your
-# project structure.
-
-# Project target.
-target=android-8
+++ /dev/null
-/* AUTO-GENERATED FILE. DO NOT MODIFY.
- *
- * This class was automatically generated by the
- * aapt tool from the resource data it found. It
- * should not be modified by hand.
- */
-
-package com.enst.mp4box;
-
-public final class R {
- public static final class attr {
- }
- public static final class drawable {
- public static final int icon=0x7f020000;
- }
- public static final class id {
- public static final int CommandLineEdit=0x7f050001;
- public static final int OkButton=0x7f050002;
- public static final int textView1=0x7f050000;
- }
- public static final class layout {
- public static final int main=0x7f030000;
- }
- public static final class string {
- public static final int CommandLineTitle=0x7f040002;
- public static final int OkButton=0x7f040003;
- public static final int app_name=0x7f040001;
- public static final int hello=0x7f040000;
- }
-}
+++ /dev/null
--optimizationpasses 5
--dontusemixedcaseclassnames
--dontskipnonpubliclibraryclasses
--dontpreverify
--verbose
--optimizations !code/simplification/arithmetic,!field/*,!class/merging/*
-
--keep public class * extends android.app.Activity
--keep public class * extends android.app.Application
--keep public class * extends android.app.Service
--keep public class * extends android.content.BroadcastReceiver
--keep public class * extends android.content.ContentProvider
--keep public class * extends android.app.backup.BackupAgentHelper
--keep public class * extends android.preference.Preference
--keep public class com.android.vending.licensing.ILicensingService
-
--keepclasseswithmembernames class * {
- native <methods>;
-}
-
--keepclasseswithmembernames class * {
- public <init>(android.content.Context, android.util.AttributeSet);
-}
-
--keepclasseswithmembernames class * {
- public <init>(android.content.Context, android.util.AttributeSet, int);
-}
-
--keepclassmembers enum * {
- public static **[] values();
- public static ** valueOf(java.lang.String);
-}
-
--keep class * implements android.os.Parcelable {
- public static final android.os.Parcelable$Creator *;
-}
+++ /dev/null
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="vertical"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- >
- <TextView android:layout_height="wrap_content" android:layout_width="wrap_content" android:id="@+id/textView1" android:text="@string/CommandLineTitle"></TextView>
- <EditText android:layout_height="wrap_content" android:text="EditText" android:layout_width="match_parent" android:id="@+id/CommandLineEdit"></EditText>
- <Button android:layout_height="wrap_content" android:id="@+id/OkButton" android:layout_width="wrap_content" android:text="@string/OkButton"></Button>
-</LinearLayout>
+++ /dev/null
-<?xml version="1.0" encoding="utf-8"?>
-<resources>
- <string name="hello">Hello World, mp4box!</string>
- <string name="app_name">mp4box</string>
- <string name="CommandLineTitle">Command Line :</string>
- <string name="OkButton">Ok</string>
-</resources>
+++ /dev/null
-package com.enst.mp4box;
-
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-
-import com.enst.mp4box.R;
-
-import android.app.Activity;
-import android.os.Bundle;
-import android.widget.Button;
-import android.widget.EditText;
-import android.util.Log;
-import android.view.View;
-
-
-
-public class mp4box extends Activity {
- private mp4terminal myTerminal;
-
- /** Called when the activity is first created. */
- @Override
-
-
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- myTerminal = new mp4terminal();
- errors = loadAllLibraries();
- System.out.println( "hello world java" );
- final Button button = (Button) findViewById(R.id.OkButton);
-
- button.setOnClickListener(new View.OnClickListener() {
- public void onClick(View v) {
- EditText oCommandLine = (EditText) findViewById(R.id.CommandLineEdit );
- CharSequence sCommandLine = oCommandLine.getText();
- myTerminal.run( sCommandLine.toString() );
- //showKeyboard( true );
- }
- });
-
- }
-
-
-
-
- private static Map<String, Throwable> errors = null;
-
- synchronized static Map<String, Throwable> loadAllLibraries()
- {
- if( errors != null)
- return errors;
- StringBuilder sb = new StringBuilder();
- final String[] toLoad = { "GLESv1_CM", "dl", "log",//$NON-NLS-3$ //$NON-NLS-2$ //$NON-NLS-1$
- "jpeg", "javaenv", //$NON-NLS-1$ //$NON-NLS-2$
- "mad", "editline", "ft2", //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
- "js_osmo", "openjpeg", "png", "z", //$NON-NLS-1$ //$NON-NLS-2$//$NON-NLS-3$ //$NON-NLS-4$
- "ffmpeg", "faad", "gpac", //$NON-NLS-1$//$NON-NLS-2$ //$NON-NLS-3$
- "stdc++", "mp4box" }; // //$NON-NLS-1$ //$NON-NLS-2$
- HashMap<String, Throwable> exceptions = new HashMap<String, Throwable>();
- for (String s : toLoad) {
- try {
- String msg = "Loading library " + s + "...";//$NON-NLS-1$//$NON-NLS-2$
- sb.append(msg);
- //Log.i(LOG_LIB, msg);
- System.loadLibrary(s);
- } catch (UnsatisfiedLinkError e) {
- sb.append("Failed to load " + s + ", error=" + e.getLocalizedMessage() + " :: " //$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$
- + e.getClass().getSimpleName() + "\n"); //$NON-NLS-1$
- exceptions.put(s, e);
- //Log.e(LOG_LIB, "Failed to load library : " + s + " due to link error " + e.getLocalizedMessage(), e); //$NON-NLS-1$ //$NON-NLS-2$
- } catch (SecurityException e) {
- exceptions.put(s, e);
- //Log.e(LOG_LIB, "Failed to load library : " + s + " due to security error " + e.getLocalizedMessage(), e); //$NON-NLS-1$ //$NON-NLS-2$
- } catch (Throwable e) {
- exceptions.put(s, e);
- //Log.e(LOG_LIB, "Failed to load library : " + s + " due to Runtime error " + e.getLocalizedMessage(), e); //$NON-NLS-1$ //$NON-NLS-2$
- }
- }
-
- /*if (!exceptions.isEmpty()) {
- try {
- PrintStream out = new PrintStream(config.getGpacConfigDirectory() + "debug_libs.txt", "UTF-8"); //$NON-NLS-1$//$NON-NLS-2$
- out.println("$Revision: 2972 $"); //$NON-NLS-1$
- out.println(new Date());
- out.println("\n*** Configuration\n"); //$NON-NLS-1$
- out.println(config.getConfigAsText());
- sb.append("*** Libs listing: "); //$NON-NLS-1$
- sb.append(config.getGpacLibsDirectory());
- sb.append('\n');
- listing(sb, new File(config.getGpacLibsDirectory()), 2);
- sb.append("*** Modules listing: "); //$NON-NLS-1$
- sb.append(config.getGpacModulesDirectory());
- sb.append('\n');
- listing(sb, new File(config.getGpacModulesDirectory()), 2);
- sb.append("*** Fonts listing: \n"); //$NON-NLS-1$
- sb.append(config.getGpacFontDirectory());
- sb.append('\n');
- listing(sb, new File(config.getGpacFontDirectory()), 2);
- sb.append("*** Exceptions:\n"); //$NON-NLS-1$
- for (Map.Entry<String, Throwable> ex : exceptions.entrySet()) {
- sb.append(ex.getKey()).append(": ") //$NON-NLS-1$
- .append(ex.getValue().getLocalizedMessage())
- .append('(')
- .append(ex.getValue().getClass())
- .append(")\n"); //$NON-NLS-1$
- }
- out.println(sb.toString());
- out.flush();
- out.close();
- } catch (Exception e) {
- Log.e(LOG_LIB, "Failed to output debug info to debug file", e); //$NON-NLS-1$
- }
- }*/
- errors = Collections.unmodifiableMap(exceptions);
- return errors;
-}
- /*public void showKeyboard(boolean showKeyboard) {
- if (keyboardIsVisible == showKeyboard == true)
- return;
- InputMethodManager mgr = ((InputMethodManager) getSystemService(INPUT_METHOD_SERVICE));
- this.keyboardIsVisible = showKeyboard;
- if (showKeyboard)
- mgr.showSoftInput(findViewById(R.id.CommandLineEdit ), 0);
- else
- mgr.hideSoftInputFromInputMethod(findViewById(R.id.CommandLineEdit ).getWindowToken(), 0);
-
- }*/
-}
\ No newline at end of file
+++ /dev/null
-package com.enst.mp4box;
-
-
-public class mp4terminal {
-
- public native void run( String sCommandLine);
-}
+++ /dev/null
-/*
- * GPAC - Multimedia Framework C SDK
- *
- * Copyright (c) Jean Le Feuvre 2000-2005
- * Copyright (c) 2005-200X ENST
- * All rights reserved
- *
- * This file is part of GPAC / command-line client
- *
- * GPAC is gf_free software; you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation; either version 2, or (at your option)
- * any later version.
- *
- * GPAC is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; see the file COPYING. If not, write to
- * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
- *
- */
-
-#include "libgpac_symbols.h"
-
-#ifdef WIN32
-#include <windows.h>
-#else
-typedef struct tagBITMAPFILEHEADER
-{
- u16 bfType;
- u32 bfSize;
- u16 bfReserved1;
- u16 bfReserved2;
- u32 bfOffBits;
-} BITMAPFILEHEADER;
-
-typedef struct tagBITMAPINFOHEADER{
- u32 biSize;
- s32 biWidth;
- s32 biHeight;
- u16 biPlanes;
- u16 biBitCount;
- u32 biCompression;
- u32 biSizeImage;
- s32 biXPelsPerMeter;
- s32 biYPelsPerMeter;
- u32 biClrUsed;
- u32 biClrImportant;
-} BITMAPINFOHEADER;
-
-#define BI_RGB 0L
-
-#endif
-
-
-#include <gpac/internal/avilib.h>
-#include <gpac/internal/terminal_dev.h>
-#include <gpac/internal/compositor_dev.h>
-
-extern Bool is_connected;
-extern GF_Terminal *term;
-extern u32 Duration;
-extern GF_Err last_error;
-
-static GFINLINE u8 colmask(s32 a, s32 n)
-{
- s32 mask = (1 << n) - 1;
- return (u8) (a & (0xff & ~mask)) | ((-((a >> n) & 1)) & mask);
-}
-
-static u32 put_pixel(FILE *fout, u32 type, u32 pf, char *ptr)
-{
- u16 col;
- switch (pf) {
- case GF_PIXEL_RGB_32:
- case GF_PIXEL_ARGB:
- fputc(ptr[0], fout);
- fputc(ptr[1], fout);
- fputc(ptr[2], fout);
- return 4;
-
- case GF_PIXEL_BGR_32:
- case GF_PIXEL_RGBA:
- //probably due to tinygl bug - verify
-#ifndef GPAC_USE_TINYGL
- fputc(ptr[3], fout);
- fputc(ptr[2], fout);
- fputc(ptr[1], fout);
-#else
- fputc(ptr[2], fout);
- fputc(ptr[1], fout);
- fputc(ptr[0], fout);
-#endif
- return 4;
-
- case GF_PIXEL_RGB_24:
- fputc(ptr[2], fout);
- fputc(ptr[1], fout);
- fputc(ptr[0], fout);
- return 3;
-
- case GF_PIXEL_BGR_24:
- fputc(ptr[2], fout);
- fputc(ptr[1], fout);
- fputc(ptr[0], fout);
- return 3;
- case GF_PIXEL_RGB_565:
- col = * (u16 *)ptr;
- fputc(colmask(col << 3, 3), fout);
- fputc(colmask(col >> (5 - 2), 2), fout);
- fputc(colmask(col >> (11 - 3), 3), fout);
- return 2;
-
- case GF_PIXEL_RGB_555:
- col = * (u16 *)ptr;
- fputc(colmask(col << 3, 3), fout);
- fputc(colmask(col >> (5 - 3), 3), fout);
- fputc(colmask(col >> (10 - 3), 3), fout);
- return 2;
- /* this is used to write the byte depthbuffer in greyscale when dumping depth*/
- case GF_PIXEL_GREYSCALE:
- /* bmp always needs 3 pixels */
- fputc(ptr[0], fout);
- fputc(ptr[0], fout);
- fputc(ptr[0], fout);
- /* if printing the characters corresponding to the float depth buffer: */
- /*
- {
- u32 i=0;
- while (ptr[i]!='\0') {
- fputc(ptr[i], fout);
- i++;
- }
- fputc('\b', fout);
- }
- */
- return 1;
-
-
- case 0:
- fputc(ptr[0], fout);
- return 1;
- }
- return 0;
-}
-
-void write_bmp(GF_VideoSurface *fb, char *rad_name, u32 img_num)
-{
- char str[GF_MAX_PATH];
- BITMAPFILEHEADER fh;
- BITMAPINFOHEADER fi;
- FILE *fout;
- u32 j, i;
- char *ptr, *prev;
-
- prev = strrchr(rad_name, '.');
- //if (prev) prev[0] = '\0';
-
- if (fb->pixel_format==GF_PIXEL_GREYSCALE) sprintf(str, "%s_%d_depth.bmp", rad_name, img_num);
- else sprintf(str, "%s_%d.bmp", rad_name, img_num);
-
- fout = gf_f64_open(str, "wb");
- if (!fout) return;
-
- memset(&fh, 0, sizeof(fh));
- fh.bfType = 19778;
- fh.bfOffBits = 14 + 40;
-
- memset(&fi, 0, sizeof(char)*40);
- fi.biSize = sizeof(char)*40;
- fi.biWidth = fb->width;
- fi.biHeight = fb->height;
- fi.biPlanes = 1;
- if (fb->pixel_format==GF_PIXEL_GREYSCALE) fi.biBitCount = 24;
- else fi.biBitCount = 24;
- fi.biCompression = BI_RGB;
- fi.biSizeImage = fb->pitch_y * fb->height;
-
- /*NOT ALIGNED!!*/
- gf_fwrite(&fh.bfType, 2, 1, fout);
- gf_fwrite(&fh.bfSize, 4, 1, fout);
- gf_fwrite(&fh.bfReserved1, 2, 1, fout);
- gf_fwrite(&fh.bfReserved2, 2, 1, fout);
- gf_fwrite(&fh.bfOffBits, 4, 1, fout);
-
- gf_fwrite(&fi, 1, 40, fout);
-//#ifndef GPAC_USE_TINYGL
- for (j=fb->height; j>0; j--) {
- ptr = fb->video_buffer + (j-1)*fb->pitch_y;
- for (i=0;i<fb->width; i++) {
- u32 res = put_pixel(fout, 0, fb->pixel_format, ptr);
- assert(res);
- ptr += res;
- }
- }
-//#else
-#if 0
- for (j=0; j<fb->height; j++) {
- ptr = fb->video_buffer + j*fb->pitch;
- for (i=0;i<fb->width; i++) {
- u32 res = put_pixel(fout, 0, fb->pixel_format, ptr);
- assert(res);
- ptr += res;
- }
- }
-#endif
-
- fclose(fout);
-}
-
-/*writes onto a file the content of the framebuffer in *fb interpreted as the byte depthbuffer */
-/*it's also possible to write a float depthbuffer by passing the floats to strings and writing chars in putpixel - see comments*/
-void write_depthfile(GF_VideoSurface *fb, char *rad_name, u32 img_num)
-{
- FILE *fout;
- u32 i, j;
- char val;
- unsigned char *depth;
-
- depth = (unsigned char *) fb->video_buffer;
-
- fout = gf_f64_open("dump_depth", "wb");
- if (!fout) return;
- for (j=0; j<fb->height; j++) {
- for (i=0;i<fb->width; i++) {
-
-#ifdef GPAC_USE_TINYGL
- val = fputc(depth[2*i+j*fb->width*sizeof(unsigned short)], fout);
- val = fputc(depth[2*i+j*fb->width*sizeof(unsigned short) + 1], fout);
-#else
- val = fputc(depth[i+j*fb->width], fout);
-#endif
- }
- }
- fclose(fout);
-}
-
-void write_texture_file(GF_VideoSurface *fb, char *rad_name, u32 img_num, u32 dump_mode)
-{
-
- FILE *fout;
- u32 i, j;
- char val;
- unsigned char *buf;
-
- buf = (unsigned char *) fb->video_buffer;
-
- if (dump_mode==6) fout = gf_f64_open("dump_rgbds", "wb");
- else if (dump_mode==9) fout = gf_f64_open("dump_rgbd", "wb");
- else return;
-
- if (!fout) return;
- for (j=0; j<fb->height; j++) {
- for (i=0;i<fb->width*4; i++) {
- val = fputc(buf[i+j*fb->pitch_y], fout);
- }
- }
- fclose(fout);
-}
-
-
-void write_raw(GF_VideoSurface *fb, char *rad_name, u32 img_num)
-{
- u32 j, i;
- char *ptr, *prev;
- char str[GF_MAX_PATH];
- FILE *fout;
- prev = strrchr(rad_name, '.');
- if (prev) prev[0] = '\0';
- if (img_num<10) {
- sprintf(str, "%s_00%d.raw", rad_name, img_num);
- } else if (img_num<100) {
- sprintf(str, "%s_0%d.raw", rad_name, img_num);
- } else {
- sprintf(str, "%s_%d.raw", rad_name, img_num);
- }
-
- fout = gf_f64_open(str, "wb");
- if (!fout) return;
-
-
- for (j=0;j<fb->height; j++) {
- ptr = fb->video_buffer + j*fb->pitch_y;
- for (i=0;i<fb->width; i++) {
- u32 res = put_pixel(fout, 0, fb->pixel_format, ptr);
- assert(res);
- ptr += res;
- }
- }
- fclose(fout);
-}
-
-
-/* creates a .bmp format greyscale image of the byte depthbuffer and a binary with only the content of the depthbuffer */
-void dump_depth (GF_Terminal *term, char *rad_name, u32 dump_type, u32 frameNum, char *conv_buf, void *avi_out)
-{
- GF_Err e;
- u32 i, k;
- GF_VideoSurface fb;
-
- /*lock it*/
- e = gf_sc_get_screen_buffer(term->compositor, &fb, 1);
- if (e) fprintf(stdout, "Error grabbing depth buffer: %s\n", gf_error_to_string(e));
- else fprintf(stdout, "OK\n");
- /*export frame*/
- switch (dump_type) {
- case 1:
- case 8:
- /*reverse frame*/
- for (k=0; k<fb.height; k++) {
- char *dst, *src;
- u16 src_16;
- dst = conv_buf + k*fb.width*3;
- src = fb.video_buffer + (fb.height-k-1) * fb.pitch_y;
-
- for (i=0;i<fb.width; i++) {
- switch (fb.pixel_format) {
- case GF_PIXEL_RGB_32:
- case GF_PIXEL_ARGB:
- dst[0] = src[0];
- dst[1] = src[1];
- dst[2] = src[2];
- src+=4;
- break;
-
- case GF_PIXEL_BGR_32:
- case GF_PIXEL_RGBA:
- dst[0] = src[3];
- dst[1] = src[2];
- dst[2] = src[1];
- src+=4;
- break;
- case GF_PIXEL_RGB_24:
- dst[0] = src[2];
- dst[1] = src[1];
- dst[2] = src[0];
- src+=3;
- break;
- case GF_PIXEL_BGR_24:
- dst[0] = src[2];
- dst[1] = src[1];
- dst[2] = src[0];
- src+=3;
- break;
- case GF_PIXEL_RGB_565:
- src_16 = * ( (u16 *)src );
- dst[2] = colmask(src_16 >> 8/*(11 - 3)*/, 3);
- dst[1] = colmask(src_16 >> 3/*(5 - 2)*/, 2);
- dst[0] = colmask(src_16 << 3, 3);
- src+=2;
- break;
- case GF_PIXEL_RGB_555:
- src_16 = * (u16 *)src;
- dst[2] = colmask(src_16 >> 7/*(10 - 3)*/, 3);
- dst[1] = colmask(src_16 >> 2/*(5 - 3)*/, 3);
- dst[0] = colmask(src_16 << 3, 3);
- src+=2;
- break;
- /*for depth .avi*/
- case GF_PIXEL_GREYSCALE:
- dst[0] = src[0];
- dst[1] = src[0];
- dst[2] = src[0];
- src+=1;
- break;
- }
- dst += 3;
- }
- }
-#ifndef GPAC_DISABLE_AVILIB
- if (AVI_write_frame(avi_out, conv_buf, fb.height*fb.width*3, 1) <0)
- printf("Error writing frame\n");
-#endif
- break;
- case 2:
- write_bmp(&fb, rad_name, frameNum);
- break;
- case 3:
- write_raw(&fb, rad_name, frameNum);
- break;
- case 4:
- write_depthfile(&fb, rad_name, frameNum);
- break;
- case 7:
- write_bmp(&fb, rad_name, frameNum);
- break;
-
- }
- /*unlock it*/
- /*in -depth -avi mode, do not release it yet*/
- if (dump_type!=8) gf_sc_release_screen_buffer(term->compositor, &fb);
-}
-
-void dump_frame(GF_Terminal *term, char *rad_name, u32 dump_type, u32 frameNum, char *conv_buf, void *avi_out)
-{
- GF_Err e = GF_OK;
- u32 i, k, out_size;
- GF_VideoSurface fb;
-
- /*lock it*/
- if (dump_type==5 || dump_type==6) e = gf_sc_get_screen_buffer(term->compositor, &fb, 2);
- else if (dump_type== 9 || dump_type==10) e = gf_sc_get_screen_buffer(term->compositor, &fb, 3);
- else e = gf_sc_get_screen_buffer(term->compositor, &fb, 0);
- if (e) fprintf(stdout, "Error grabbing frame buffer: %s\n", gf_error_to_string(e));
-
- if (dump_type!=5 && dump_type!= 10) {
- out_size = fb.height*fb.width*3;
- } else {
- out_size = fb.height*fb.width*4;
- }
- /*export frame*/
- switch (dump_type) {
- case 1:
- case 5:
- case 10:
- case 8:
- /*reverse frame*/
- for (k=0; k<fb.height; k++) {
- char *dst, *src;
- u16 src_16;
- if (dump_type==5 || dump_type==10) dst = conv_buf + k*fb.width*4;
- else dst = conv_buf + k*fb.width*3;
- src = fb.video_buffer + (fb.height-k-1) * fb.pitch_y;
-
- switch (fb.pixel_format) {
- case GF_PIXEL_RGB_32:
- case GF_PIXEL_ARGB:
- for (i=0;i<fb.width; i++) {
- dst[0] = src[0];
- dst[1] = src[1];
- dst[2] = src[2];
- src+=4;
- dst += 3;
- }
- break;
- case GF_PIXEL_RGBDS:
- for (i=0;i<fb.width; i++) {
- dst[0] = src[2];
- dst[1] = src[1];
- dst[2] = src[0];
- dst[3] = src[3];
- dst +=4;
- src+=4;
- }
- break;
- case GF_PIXEL_RGBD:
- for (i=0;i<fb.width; i++) {
- dst[0] = src[2];
- dst[1] = src[1];
- dst[2] = src[0];
- dst[3] = src[3];
- dst += 4;
- src+=4;
- }
- break;
- case GF_PIXEL_BGR_32:
- case GF_PIXEL_RGBA:
- for (i=0;i<fb.width; i++) {
- dst[0] = src[3];
- dst[1] = src[2];
- dst[2] = src[1];
- src+=4;
- dst+=3;
- }
- break;
- case GF_PIXEL_RGB_24:
- for (i=0;i<fb.width; i++) {
- dst[0] = src[2];
- dst[1] = src[1];
- dst[2] = src[0];
- src+=3;
- dst+=3;
- }
- break;
- case GF_PIXEL_BGR_24:
- for (i=0;i<fb.width; i++) {
- dst[0] = src[2];
- dst[1] = src[1];
- dst[2] = src[0];
- src+=3;
- dst+=3;
- }
- break;
- case GF_PIXEL_RGB_565:
- for (i=0;i<fb.width; i++) {
- src_16 = * ( (u16 *)src );
- dst[2] = colmask(src_16 >> 8/*(11 - 3)*/, 3);
- dst[1] = colmask(src_16 >> 3/*(5 - 2)*/, 2);
- dst[0] = colmask(src_16 << 3, 3);
- src+=2;
- dst+=3;
- }
- break;
- case GF_PIXEL_RGB_555:
- for (i=0;i<fb.width; i++) {
- src_16 = * (u16 *)src;
- dst[2] = colmask(src_16 >> 7/*(10 - 3)*/, 3);
- dst[1] = colmask(src_16 >> 2/*(5 - 3)*/, 3);
- dst[0] = colmask(src_16 << 3, 3);
- src+=2;
- dst +=3;
- }
- break;
- }
- }
-#ifndef GPAC_DISABLE_AVILIB
- if (dump_type!=5 && dump_type!= 10) {
- if (AVI_write_frame(avi_out, conv_buf, out_size, 1) <0)
- printf("Error writing frame\n");
- } else {
- if (AVI_write_frame(avi_out, conv_buf, out_size, 1) <0)
- printf("Error writing frame\n");
- }
-#endif
- break;
- case 2:
- write_bmp(&fb, rad_name, frameNum);
- break;
- case 6:
- case 9:
- write_texture_file(&fb, rad_name, frameNum, dump_type);
- break;
-
- case 3:
- write_raw(&fb, rad_name, frameNum);
- break;
- }
- /*unlock it*/
- gf_sc_release_screen_buffer(term->compositor, &fb);
-}
-
-Bool dump_file(char *url, u32 dump_mode, Double fps, u32 width, u32 height, Float scale, u32 *times, u32 nb_times)
-{
- GF_Err e;
- u32 i = 0;
- GF_VideoSurface fb;
- char szPath[GF_MAX_PATH];
- char *prev=NULL;
-
- prev = strstr(url, "://");
- if (prev) {
- prev = strrchr(url, '/');
- if (prev) prev++;
- }
-
- if (!prev) prev = url;
- strcpy(szPath, prev);
- prev = strrchr(szPath, '.');
- if (prev) prev[0] = 0;
-
- fprintf(stdout, "Opening URL %s\n", url);
- /*connect in pause mode*/
- gf_term_connect_from_time(term, url, 0, 1);
-
- while (!term->compositor->scene
- || term->compositor->msg_type
- || (gf_term_get_option(term, GF_OPT_PLAY_STATE) == GF_STATE_STEP_PAUSE)
- ) {
- if (last_error) return 1;
- gf_term_process_flush(term);
- gf_sleep(10);
- }
-
- if (width && height) {
- gf_term_set_size(term, width, height);
- gf_term_process_flush(term);
- }
-#ifndef GPAC_USE_TINYGL
- printf("not tinygl\n");
- e = gf_sc_get_screen_buffer(term->compositor, &fb, 0);
-#else
- printf("tinygl\n");
- e = gf_sc_get_screen_buffer(term->compositor, &fb, 1);
-#endif
- if (e != GF_OK) {
- fprintf(stdout, "Error grabbing screen buffer: %s\n", gf_error_to_string(e));
- return 0;
- }
- width = fb.width;
- height = fb.height;
- gf_sc_release_screen_buffer(term->compositor, &fb);
-
- if (scale != 1) {
- width = (u32)(width * scale);
- height = (u32)(height * scale);
- gf_term_set_size(term, width, height);
- gf_term_process_flush(term);
- }
-
- /*we work in RGB24, and we must make sure the pitch is %4*/
- if ((width*3)%4) {
- fprintf(stdout, "Adjusting width (%d) to have a stride multiple of 4\n", width);
- while ((width*3)%4) width--;
-
- gf_term_set_size(term, width, height);
- gf_term_process_flush(term);
-
- gf_sc_get_screen_buffer(term->compositor, &fb, 0);
- width = fb.width;
- height = fb.height;
- gf_sc_release_screen_buffer(term->compositor, &fb);
- }
-
- if (dump_mode==1 || dump_mode==5 || dump_mode==8 || dump_mode==10) {
-#ifdef GPAC_DISABLE_AVILIB
- fprintf(stdout, "AVILib is disabled in this build of GPAC\n");
- return 0;
-#else
- u32 time, prev_time, nb_frames, dump_dur;
- char *conv_buf;
- avi_t *avi_out = NULL;
- avi_t *depth_avi_out = NULL;
- char szPath_depth[GF_MAX_PATH];
- char comp[5];
- strcpy(szPath_depth, szPath);
- strcat(szPath, ".avi");
- avi_out = AVI_open_output_file(szPath);
- if (!avi_out) {
- fprintf(stdout, "Error creating AVI file %s\n", szPath);
- return 1;
- }
- if (dump_mode==8) {
- strcat(szPath_depth, "_depth.avi");
- depth_avi_out = AVI_open_output_file(szPath_depth);
- if (!depth_avi_out) {
- fprintf(stdout, "Error creating AVI file %s\n", szPath);
- return 1;
- }
- }
-
- if (!fps) fps = 25.0;
- time = prev_time = 0;
- nb_frames = 0;
-
- if (nb_times==2) {
- prev_time = times[0];
- dump_dur = times[1] - times[0];
- } else {
- dump_dur = times[0] ? times[0] : Duration;
- }
- if (!dump_dur) {
- fprintf(stdout, "Warning: file has no duration, defaulting to 1 sec\n");
- dump_dur = 1000;
- }
-
- comp[0] = comp[1] = comp[2] = comp[3] = comp[4] = 0;
- AVI_set_video(avi_out, width, height, fps, comp);
- if (dump_mode==8) AVI_set_video(depth_avi_out, width, height, fps, comp);
- if (dump_mode != 5 && dump_mode!=10) conv_buf = gf_malloc(sizeof(char) * width * height * 3);
- else conv_buf = gf_malloc(sizeof(char) * width * height * 4);
- /*step to first frame*/
- if (prev_time) gf_term_step_clocks(term, prev_time);
-
- while (time < dump_dur) {
- while ((gf_term_get_option(term, GF_OPT_PLAY_STATE) == GF_STATE_STEP_PAUSE)) {
- gf_term_process_flush(term);
- }
- fprintf(stdout, "Dumping %02d/100\r", (u32) ((100.0*prev_time)/dump_dur) );
-
- if (dump_mode==8) {
- /*we'll dump both buffers at once*/
- gf_mx_p(term->compositor->mx);
- dump_depth(term, szPath_depth, dump_mode, i+1, conv_buf, depth_avi_out);
- dump_frame(term, szPath, dump_mode, i+1, conv_buf, avi_out);
- gf_mx_v(term->compositor->mx);
-
- }
- else dump_frame(term, szPath, dump_mode, i+1, conv_buf, avi_out);
-
- nb_frames++;
- time = (u32) (nb_frames*1000/fps);
- gf_term_step_clocks(term, time - prev_time);
- prev_time = time;
- }
- AVI_close(avi_out);
- if (dump_mode==8) AVI_close(depth_avi_out);
- gf_free(conv_buf);
- fprintf(stdout, "AVI Extraction 100/100\n");
-#endif /*GPAC_DISABLE_AVILIB*/
- } else {
- if (times[0]) gf_term_step_clocks(term, times[0]);
-
- for (i=0; i<nb_times; i++) {
- while ((gf_term_get_option(term, GF_OPT_PLAY_STATE) == GF_STATE_STEP_PAUSE)) {
- gf_term_process_flush(term);
- }
-
- if (dump_mode==4 || dump_mode==7) {
- dump_depth(term, szPath, dump_mode, i+1, NULL, NULL);
- } else {
- dump_frame(term, url, dump_mode, i+1, NULL, NULL);
- }
-
- if (i+1<nb_times) gf_term_step_clocks(term, times[i+1] - times[i]);
- }
- }
- return 0;
-}
-
+++ /dev/null
-/*
- * GPAC - Multimedia Framework C SDK
- *
- * Copyright (c) Jean Le Feuvre 2000-2005
- * All rights reserved
- *
- * This file is part of GPAC / command-line client
- *
- * GPAC is free software; you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation; either version 2, or (at your option)
- * any later version.
- *
- * GPAC is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; see the file COPYING. If not, write to
- * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
- *
- */
-
-
-#include "libgpac_symbols.h"
-
-void (*gf_log_lt)(u32 ll, u32 lt);
-int (*AVI_close)(avi_t *AVI);
-GF_Err (*gf_term_del)(GF_Terminal *term);
-void (*gf_sleep)(u32 ms);
-GF_Err (*gf_sc_release_screen_buffer)(GF_Compositor *sr, GF_VideoSurface *framebuffer);
-char (*gf_prompt_get_char)();
-void (*gf_set_progress)(char *title, u32 done, u32 total);
-GF_Terminal *(*gf_term_new)(GF_User *user);
-GF_Err (*gf_term_process_step)(GF_Terminal *term);
-GF_Err (*gf_sc_get_screen_buffer)(GF_Compositor *sr, GF_VideoSurface *framebuffer, Bool depth_buffer);
-void (*gf_iphone_set_sdl_audio_module)(void* (*SDL_Module) (void));
-GF_Err (*gf_term_step_clocks)(GF_Terminal * term, u32 ms_diff);
-void (*gf_prompt_set_echo_off)(Bool echo_off);
-u32 (*gf_log_tool_level_on)();
-GF_Err (*gf_cfg_set_key)(GF_Config *cfgFile, const char *secName, const char *keyName, const char *keyValue);
-u32 (*gf_cfg_get_section_count)(GF_Config *cfgFile);
-GF_Err (*gf_term_get_service_info)(GF_Terminal *term, GF_ObjectManager *odm, NetInfoCommand *netcom);
-GF_Err (*gf_term_set_size)(GF_Terminal *term, u32 NewWidth, u32 NewHeight);
-Bool (*gf_sys_get_rti)(u32 refresh_time_ms, GF_SystemRTInfo *rti, u32 flags);
-u32 (*gf_term_play_from_time)(GF_Terminal *term, u64 from_time, u32 pause_at_first_frame);
-void *(*gf_malloc)(size_t size);
-void (*gf_log_set_tools_levels)(const char *);
-void (*gf_log_set_tool_level)(u32, u32);
-void (*gf_log_modify_tools_level)(const char *);
-void (*gf_iphone_set_sdl_video_module)(void* (*SDL_Module) (void));
-u32 (*gf_term_get_option)(GF_Terminal *term, u32 opt_type);
-Bool (*gf_term_user_event)(GF_Terminal *term, GF_Event *event);
-const char *(*gf_modules_get_file_name)(GF_ModuleManager *pm, u32 index);
-GF_Mutex *(*gf_mx_new)(const char *name);
-u32 (*gf_list_count)(GF_List *ptr);
-void (*gf_free)(void *ptr);
-const char *(*gf_term_get_world_info)(GF_Terminal *term, GF_ObjectManager *scene_od, GF_List *descriptions);
-const char *(*gf_cfg_get_section_name)(GF_Config *cfgFile, u32 secIndex);
-void (*gf_term_navigate_to)(GF_Terminal *term, const char *toURL);
-void (*gf_modules_del)(GF_ModuleManager *pm);
-GF_ModuleManager *(*gf_modules_new)(const char *directory, GF_Config *cfgFile);
-void (*gf_sys_init)(Bool enable_memory_tracker);
-void (*gf_log)(const char *fmt, ...);
-GF_Err (*gf_term_get_object_info)(GF_Terminal *term, GF_ObjectManager *odm, GF_MediaInfo *info);
-u32 (*gf_mx_p)(GF_Mutex *mx);
-u32 (*gf_mx_v)(GF_Mutex *mx);
-void (*gf_mx_del)(GF_Mutex *mx);
-GF_Err (*gf_term_process_flush)(GF_Terminal *term);
-const char *(*gf_cfg_get_key_name)(GF_Config *cfgFile, const char *secName, u32 keyIndex);
-int (*AVI_write_frame)(avi_t *AVI, char *data, long bytes, int keyframe);
-void (*gf_cfg_del)(GF_Config *iniFile);
-Bool (*gf_term_get_channel_net_info)(GF_Terminal *term, GF_ObjectManager *odm, u32 *d_enum, u32 *chid, NetStatCommand *netcom, GF_Err *ret_code);
-void (*gf_term_process_shortcut)(GF_Terminal *term, GF_Event *ev);
-GF_Config *(*gf_cfg_init)(const char *fileName, Bool *is_new);
-Bool (*gf_term_get_download_info)(GF_Terminal *term, GF_ObjectManager *odm, u32 *d_enum, const char **server, const char **path, u32 *bytes_done, u32 *total_bytes, u32 *bytes_per_sec);
-u32 (*gf_sys_clock)();
-GF_ObjectManager *(*gf_term_get_object)(GF_Terminal *term, GF_ObjectManager *scene_od, u32 index);
-GF_Err (*gf_term_set_option)(GF_Terminal *term, u32 opt_type, u32 opt_value);
-void (*gf_sys_close)();
-void (*gf_term_connect_from_time)(GF_Terminal *term, const char *URL, u64 time_in_ms, Bool pause_at_first_frame);
-avi_t* (*AVI_open_output_file)(char * filename);
-const char *(*gf_cfg_get_key)(GF_Config *cfgFile, const char *secName, const char *keyName);
-void (*AVI_set_video)(avi_t *AVI, int width, int height, double fps, char *compressor);
-void (*gf_term_set_speed)(GF_Terminal *term, Fixed speed);
-u32 (*gf_cfg_get_key_count)(GF_Config *cfgFile, const char *secName);
-u32 (*gf_term_object_subscene_type)(GF_Terminal *term, GF_ObjectManager *odm);
-Double (*gf_term_get_framerate)(GF_Terminal *term, Bool absoluteFPS);
-const char *(*gf_error_to_string)(GF_Err e);
-GF_Err (*gf_stretch_bits)(GF_VideoSurface *dst, GF_VideoSurface *src, GF_Window *dst_wnd, GF_Window *src_wnd, u8 alpha, Bool flip, GF_ColorKey *colorKey, GF_ColorMatrix * cmat);
-void (*gf_list_del)(GF_List *ptr);
-void *(*gf_list_get)(GF_List *ptr, u32 itemNumber);
-void (*gf_term_disconnect)(GF_Terminal *term);
-Bool (*gf_term_is_supported_url)(GF_Terminal *term, const char *fileName, Bool use_parent_url, Bool no_mime_check);
-GF_List *(*gf_list_new)(void);
-const char *(*gf_modules_get_option)(GF_BaseInterface *interface_obj, const char *secName, const char *keyName);
-GF_Err (*gf_term_dump_scene)(GF_Terminal *term, char *rad_name, char **filename, Bool xml_dump, Bool skip_proto, GF_ObjectManager *odm);
-Bool (*gf_prompt_has_input)();
-GF_Err (*gf_term_scene_update)(GF_Terminal *term, char *type, char *com);
-void (*gf_term_connect)(GF_Terminal *term, const char *URL);
-u32 (*gf_term_get_object_count)(GF_Terminal *term, GF_ObjectManager *scene_od);
-u32 (*gf_modules_get_count)(GF_ModuleManager *pm);
-GF_ObjectManager *(*gf_term_get_root_object)(GF_Terminal *term);
-u32 (*gf_term_get_time_in_ms)(GF_Terminal *term);
-void (*gf_term_connect_with_path)(GF_Terminal *term, const char *URL, const char *parent_URL);
-gf_log_cbk (*gf_log_set_callback)(void *usr_cbk, gf_log_cbk cbk);
-GF_Err (*gf_log_modify_tools_levels)(const char *val);
-void (*gf_term_switch_quality)(GF_Terminal *term, Bool up);
-GF_Err (*gf_term_release_screen_buffer)(GF_Terminal *term, GF_VideoSurface *framebuffer);
-GF_Err (*gf_term_get_screen_buffer)(GF_Terminal *term, GF_VideoSurface *framebuffer);
-FILE *(*gf_f64_open)(const char *file_name, const char *mode);
-size_t (*gf_fwrite)(const void *ptr, size_t size, size_t nmemb, FILE *stream);
-GF_Err (*gf_img_png_enc)(char *data, u32 width, u32 height, s32 stride, u32 pixel_format, char *dst, u32 *dst_size);
-u32 (*utf8_to_ucs4)(u32 *ucs4_buf, u32 utf8_len, unsigned char *utf8_buf);
-
-#ifndef WIN32
-#include <pwd.h>
-#include <unistd.h>
-
-#else
-#include <windows.h> /*for GetModuleFileName*/
-#include <direct.h> /*for _mkdir*/
-#include <shlobj.h> /*for getting user-dir*/
-#ifndef SHGFP_TYPE_CURRENT
-#define SHGFP_TYPE_CURRENT 0 /*needed for MinGW*/
-#endif
-
-#ifdef _MSC_VER
-/*get rid of console*/
-#if 0
-#pragma comment(linker,"/SUBSYSTEM:WINDOWS")
-#pragma comment(linker,"/ENTRY:main")
-#else
-#pragma comment(linker,"/SUBSYSTEM:CONSOLE")
-#endif
-
-#endif // _MSC_VER
-
-#endif //WIN32
-
-
-/*local prototypes*/
-void PrintWorldInfo(GF_Terminal *term);
-void ViewOD(GF_Terminal *term, u32 OD_ID, u32 number);
-void PrintODList(GF_Terminal *term, GF_ObjectManager *root_odm, u32 num, u32 indent, char *root_name);
-
-void ViewODs(GF_Terminal *term, Bool show_timing);
-void PrintGPACConfig();
-
-static Bool restart = 0;
-#if defined(__DARWIN__) || defined(__APPLE__)
-static Bool not_threaded = 1;
-#else
-static Bool not_threaded = 0;
-#endif
-static Bool no_audio = 0;
-static Bool no_regulation = 0;
-static Bool bench_mode = 0;
-Bool is_connected = 0;
-Bool startup_file = 0;
-GF_User user;
-GF_Terminal *term;
-u64 Duration;
-GF_Err last_error = GF_OK;
-
-static Fixed bench_speed = FLT2FIX(20);
-
-static Bool request_next_playlist_item = 0;
-
-static GF_Config *cfg_file;
-static Bool display_rti = 0;
-static Bool Run;
-static Bool CanSeek = 0;
-static u32 Volume=100;
-static char the_url[GF_MAX_PATH];
-static char pl_path[GF_MAX_PATH];
-static Bool no_mime_check = 1;
-static Bool be_quiet = 0;
-static u32 log_time_start = 0;
-
-static u32 forced_width=0;
-static u32 forced_height=0;
-
-/*windowless options*/
-u32 align_mode = 0;
-u32 init_w = 0;
-u32 init_h = 0;
-u32 last_x, last_y;
-Bool right_down = 0;
-
-void dump_frame(GF_Terminal *term, char *rad_path, u32 dump_type, u32 frameNum);
-Bool dump_file(char *the_url, u32 dump_mode, Double fps, u32 width, u32 height, Float scale, u32 *times, u32 nb_times);
-
-void PrintUsage()
-{
- fprintf(stdout, "Usage Osmo4iOS [options] [filename]\n"
- "\t-c fileName: user-defined configuration file\n"
- "\t-rti fileName: logs run-time info (FPS, CPU, Mem usage) to file\n"
- "\t-rtix fileName: same as -rti but driven by GPAC logs\n"
- "\t-quiet: removes script message, buffering and downloading status\n"
- "\t-opt option: Overrides an option in the configuration file. String format is section:key=value\n"
- "\t-log-file file: sets output log file.\n"
- "\t-log-level lev: sets log level. Possible values are:\n"
- "\t \"error\" : logs only error messages\n"
- "\t \"warning\" : logs error+warning messages\n"
- "\t \"info\" : logs error+warning+info messages\n"
- "\t \"debug\" : logs all messages\n"
- "\n"
- "\t-log-tools lt: sets tool(s) to log. List of \':\'-separated values:\n"
- "\t \"core\" : libgpac core\n"
- "\t \"coding\" : bitstream formats (audio, video, scene)\n"
- "\t \"container\" : container formats (ISO File, MPEG-2 TS, AVI, ...)\n"
- "\t \"network\" : network data exept RTP trafic\n"
- "\t \"rtp\" : rtp trafic\n"
- "\t \"author\" : authoring tools (hint, import, export)\n"
- "\t \"sync\" : terminal sync layer\n"
- "\t \"codec\" : terminal codec messages\n"
- "\t \"parser\" : scene parsers (svg, xmt, bt) and other\n"
- "\t \"media\" : terminal media object management\n"
- "\t \"scene\" : scene graph and scene manager\n"
- "\t \"script\" : scripting engine messages\n"
- "\t \"interact\" : interaction engine (events, scripts, etc)\n"
- "\t \"compose\" : composition engine (2D, 3D, etc)\n"
- "\t \"service\" : network service management\n"
- "\t \"mmio\" : Audio/Video HW I/O management\n"
- "\t \"none\" : no tool logged\n"
- "\t \"all\" : all tools logged\n"
- "\n"
- "\t-size WxH: specifies visual size (default: scene size)\n"
- "\t-scale s: scales the visual size (default: 1)\n"
-#if defined(__DARWIN__) || defined(__APPLE__)
- "\t-thread: enables thread usage for terminal and compositor \n"
-#else
- "\t-no-thread: disables thread usage (except for audio)\n"
-#endif
- "\t-no-audio: disables audio \n"
- "\t-no-wnd: uses windowless mode (Win32 only)\n"
- "\t-align vh: specifies v and h alignment for windowless mode\n"
- " possible v values: t(op), m(iddle), b(ottom)\n"
- " possible h values: l(eft), m(iddle), r(ight)\n"
- " default alignment is top-left\n"
- " default alignment is top-left\n"
- "\t-pause: pauses at first frame\n"
- "\n"
- "Dumper Options:\n"
- "\t-bmp [times]: dumps given frames to bmp\n"
- "\t-raw [times]: dumps given frames to bmp\n"
- "\t-avi [times]: dumps given file to raw avi\n"
- "\t-rgbds: dumps the RGBDS pixel format texture\n"
- " with -avi [times]: dumps an rgbds-format .avi\n"
- "\t-rgbd: dumps the RGBD pixel format texture\n"
- " with -avi [times]: dumps an rgbd-format .avi\n"
- "\t-depth: dumps depthmap (z-buffer) frames\n"
- " with -avi [times]: dumps depthmap in grayscale .avi\n"
- " with -bmp: dumps depthmap in grayscale .bmp\n"
- "\t-fps FPS: specifies frame rate for AVI dumping (default: 25.0)\n"
- "\t-2d: uses 2D compositor\n"
- "\t-3d: uses 3D compositor\n"
- "\t-fill: uses fill aspect ratio for dumping (default: none)\n"
- "\t-show: show window while dumping (default: no)\n"
- "MP4Client - GPAC command line player and dumper - version %s\n"
- "GPAC Written by Jean Le Feuvre (c) 2001-2005 - ENST (c) 2005-200X\n",
-
- GPAC_FULL_VERSION
- );
-}
-
-void PrintHelp()
-{
- fprintf(stdout, "MP4Client command keys:\n"
- "\to: connect to the specified URL\n"
- "\tO: connect to the specified URL in playlist mode\n"
- "\tN: switch to the next URL in the playlist (works with return key as well)\n"
- "\tr: restart current presentation\n"
- "\tp: play/pause the presentation\n"
- "\ts: step one frame ahead\n"
- "\tz: seek into presentation\n"
- "\tt: print current timing\n"
- "\n"
- "\tw: view world info\n"
- "\tv: view Object Descriptor list\n"
- "\ti: view Object Descriptor info (by ID)\n"
- "\tj: view Object Descriptor info (by number)\n"
- "\tb: view media objects timing and buffering info\n"
- "\tm: view media objects buffering and memory info\n"
- "\td: dumps scene graph\n"
- "\n"
- "\tC: Enable Streaming Cache\n"
- "\tS: Stops Streaming Cache and save to file\n"
- "\tA: Aborts Streaming Cache\n"
- "\n"
- "\tk: turns stress mode on/off\n"
- "\tn: changes navigation mode\n"
- "\tx: reset to last active viewpoint\n"
- "\n"
- "\t2: restart using 2D compositor\n"
- "\t3: restart using 3D compositor\n"
- "\n"
- "\t4: forces 4/3 Aspect Ratio\n"
- "\t5: forces 16/9 Aspect Ratio\n"
- "\t6: forces no Aspect Ratio (always fill screen)\n"
- "\t7: forces original Aspect Ratio (default)\n"
- "\n"
- "\tL: changes to new log level. CF MP4Client usage for possible values\n"
- "\tT: select new tools to log. CF MP4Client usage for possible values\n"
- "\n"
- "\tl: list available modules\n"
- "\tc: prints some GPAC configuration info\n"
- "\tR: toggles run-time info display on/off\n"
- "\tq: exit the application\n"
- "\th: print this message\n"
- "\n"
- "MP4Client - GPAC command line player - version %s\n"
- "GPAC Written by Jean Le Feuvre (c) 2001-2005 - ENST (c) 2005-200X\n",
-
- GPAC_FULL_VERSION
- );
-}
-
-
-static void PrintTime(u64 time)
-{
- u32 ms, h, m, s;
- h = (u32) (time / 1000 / 3600);
- m = (u32) (time / 1000 / 60 - h*60);
- s = (u32) (time / 1000 - h*3600 - m*60);
- ms = (u32) (time - (h*3600 + m*60 + s) * 1000);
- fprintf(stdout, "%02d:%02d:%02d.%02d", h, m, s, ms);
-}
-
-
-static u32 rti_update_time_ms = 200;
-static FILE *rti_logs = NULL;
-static u64 memory_at_gpac_startup = 0;
-
-static void UpdateRTInfo(const char *legend)
-{
- GF_SystemRTInfo rti;
-
- /*refresh every second*/
- if (!display_rti && !rti_logs) return;
- if (!gf_sys_get_rti(rti_update_time_ms, &rti, 0) && !legend)
- return;
-
- if (display_rti) {
- if (!rti.process_memory) rti.process_memory = (u32) (memory_at_gpac_startup-rti.physical_memory_avail);
- if (!rti.gpac_memory) rti.gpac_memory = (u32) (memory_at_gpac_startup-rti.physical_memory_avail);
-
- if (display_rti==2) {
- fprintf(stdout, "FPS %02.2f - CPU %02d (%02d) - Mem %d kB\r",
- gf_term_get_framerate(term, 0), rti.total_cpu_usage, rti.process_cpu_usage, (u32) (rti.gpac_memory / 1024) );
- } else {
- char szMsg[1024];
- GF_Event evt;
-
- sprintf(szMsg, "FPS %02.2f - CPU %02d (%02d) - Mem %d kB",
- gf_term_get_framerate(term, 0), rti.total_cpu_usage, rti.process_cpu_usage, (u32) (rti.gpac_memory / 1024) );
- evt.type = GF_EVENT_SET_CAPTION;
- evt.caption.caption = szMsg;
- gf_term_user_event(term, &evt);
- }
- }
- if (rti_logs) {
- fprintf(rti_logs, "% 8d\t% 8d\t% 8d\t% 4d\t% 8d\t%s",
- gf_sys_clock(),
- gf_term_get_time_in_ms(term),
- rti.total_cpu_usage,
- (u32) gf_term_get_framerate(term, 0),
- (u32) (rti.gpac_memory / 1024),
- legend ? legend : ""
- );
- if (!legend) fprintf(rti_logs, "\n");
- }
-}
-
-static void ResetCaption()
-{
- GF_Event event;
- if (display_rti) return;
- event.type = GF_EVENT_SET_CAPTION;
- if (is_connected) {
- char szName[1024];
- NetInfoCommand com;
-
- event.caption.caption = NULL;
- /*get any service info*/
- if (!startup_file && gf_term_get_service_info(term, gf_term_get_root_object(term), &com) == GF_OK) {
- strcpy(szName, "");
- if (com.track_info) {
- char szBuf[10];
- sprintf(szBuf, "%02d ", (u32) (com.track_info>>16) );
- strcat(szName, szBuf);
- }
- if (com.artist) { strcat(szName, com.artist); strcat(szName, " "); }
- if (com.name) { strcat(szName, com.name); strcat(szName, " "); }
- if (com.album) { strcat(szName, "("); strcat(szName, com.album); strcat(szName, ")"); }
-
- if (strlen(szName)) event.caption.caption = szName;
- }
- if (!event.caption.caption) {
- char *str = strrchr(the_url, '\\');
- if (!str) str = strrchr(the_url, '/');
- event.caption.caption = str ? str+1 : the_url;
- }
- } else {
- event.caption.caption = "GPAC MP4Client " GPAC_FULL_VERSION;
- }
- gf_term_user_event(term, &event);
-}
-
-#ifdef WIN32
-u32 get_sys_col(int idx)
-{
- u32 res;
- DWORD val = GetSysColor(idx);
- res = (val)&0xFF; res<<=8;
- res |= (val>>8)&0xFF; res<<=8;
- res |= (val>>16)&0xFF;
- return res;
-}
-#endif
-
-void switch_bench()
-{
- if (is_connected) {
- bench_mode = !bench_mode;
- display_rti = !display_rti;
- ResetCaption();
- gf_term_set_speed(term, bench_mode ? bench_speed : FIX_ONE);
- }
-}
-
-Bool GPAC_EventProc(void *ptr, GF_Event *evt)
-{
- if (!term) return 0;
-
- switch (evt->type) {
- case GF_EVENT_DURATION:
- Duration = 1000;
- Duration = (u64) (((s64) Duration) * evt->duration.duration);
- CanSeek = evt->duration.can_seek;
- break;
- case GF_EVENT_MESSAGE:
- {
- const char *servName;
- if (!evt->message.service || !strcmp(evt->message.service, the_url)) {
- servName = "main service";
- } else if (!strnicmp(evt->message.service, "data:", 5)) {
- servName = "";
- } else {
- servName = evt->message.service;
- }
- if (!evt->message.message) return 0;
- if (evt->message.error) {
- if (!is_connected) last_error = evt->message.error;
- fprintf(stderr, "%s (%s): %s\n", evt->message.message, servName, gf_error_to_string(evt->message.error));
- } else if (!be_quiet)
- fprintf(stderr, "(%s) %s\r", servName, evt->message.message);
- }
- break;
- case GF_EVENT_PROGRESS:
- {
- char *szTitle = "";
- if (evt->progress.progress_type==0) szTitle = "Buffer ";
- else if (evt->progress.progress_type==1) szTitle = "Download ";
- else if (evt->progress.progress_type==2) szTitle = "Import ";
- gf_set_progress(szTitle, evt->progress.done, evt->progress.total);
- }
- break;
-
-
- case GF_EVENT_DBLCLICK:
- gf_term_set_option(term, GF_OPT_FULLSCREEN, !gf_term_get_option(term, GF_OPT_FULLSCREEN));
- return 0;
-
- case GF_EVENT_MOUSEDOWN:
- if (evt->mouse.button==GF_MOUSE_RIGHT) {
- right_down = 1;
- last_x = evt->mouse.x;
- last_y = evt->mouse.y;
- }
- return 0;
- case GF_EVENT_MOUSEUP:
- if (evt->mouse.button==GF_MOUSE_RIGHT) {
- right_down = 0;
- last_x = evt->mouse.x;
- last_y = evt->mouse.y;
- }
- return 0;
- case GF_EVENT_MOUSEMOVE:
- if (right_down && (user.init_flags & GF_TERM_WINDOWLESS) ) {
- GF_Event move;
- move.move.x = evt->mouse.x - last_x;
- move.move.y = last_y-evt->mouse.y;
- move.type = GF_EVENT_MOVE;
- move.move.relative = 1;
- gf_term_user_event(term, &move);
- }
- return 0;
-
- case GF_EVENT_KEYUP:
- switch (evt->key.key_code) {
- case GF_KEY_SPACE:
- if (evt->key.flags & GF_KEY_MOD_CTRL) switch_bench();
- break;
- }
- break;
- case GF_EVENT_KEYDOWN:
- gf_term_process_shortcut(term, evt);
- switch (evt->key.key_code) {
- case GF_KEY_SPACE:
- if (evt->key.flags & GF_KEY_MOD_CTRL) {
- /*ignore key repeat*/
- if (!bench_mode) switch_bench();
- }
- break;
- case GF_KEY_PAGEDOWN:
- case GF_KEY_MEDIANEXTTRACK:
- request_next_playlist_item = 1;
- break;
- case GF_KEY_MEDIAPREVIOUSTRACK:
- break;
- case GF_KEY_ESCAPE:
- gf_term_set_option(term, GF_OPT_FULLSCREEN, !gf_term_get_option(term, GF_OPT_FULLSCREEN));
- break;
- case GF_KEY_F:
- if (evt->key.flags & GF_KEY_MOD_CTRL) fprintf(stderr, "Rendering rate: %f FPS\n", gf_term_get_framerate(term, 0));
- break;
- case GF_KEY_T:
- if (evt->key.flags & GF_KEY_MOD_CTRL) fprintf(stderr, "Scene Time: %f \n", gf_term_get_time_in_ms(term)/1000.0);
- break;
- case GF_KEY_D:
- if (evt->key.flags & GF_KEY_MOD_CTRL) gf_term_set_option(term, GF_OPT_DRAW_MODE, (gf_term_get_option(term, GF_OPT_DRAW_MODE)==GF_DRAW_MODE_DEFER) ? GF_DRAW_MODE_IMMEDIATE : GF_DRAW_MODE_DEFER );
- break;
- case GF_KEY_4:
- if (evt->key.flags & GF_KEY_MOD_CTRL)
- gf_term_set_option(term, GF_OPT_ASPECT_RATIO, GF_ASPECT_RATIO_4_3);
- break;
- case GF_KEY_5:
- if (evt->key.flags & GF_KEY_MOD_CTRL)
- gf_term_set_option(term, GF_OPT_ASPECT_RATIO, GF_ASPECT_RATIO_16_9);
- break;
- case GF_KEY_6:
- if (evt->key.flags & GF_KEY_MOD_CTRL)
- gf_term_set_option(term, GF_OPT_ASPECT_RATIO, GF_ASPECT_RATIO_FILL_SCREEN);
- break;
- case GF_KEY_7:
- if (evt->key.flags & GF_KEY_MOD_CTRL)
- gf_term_set_option(term, GF_OPT_ASPECT_RATIO, GF_ASPECT_RATIO_KEEP);
- break;
- case GF_KEY_P:
- if (evt->key.flags & GF_KEY_MOD_CTRL && is_connected) {
- Bool is_pause = gf_term_get_option(term, GF_OPT_PLAY_STATE);
- fprintf(stderr, "[Status: %s]\n", is_pause ? "Playing" : "Paused");
- gf_term_set_option(term, GF_OPT_PLAY_STATE, (gf_term_get_option(term, GF_OPT_PLAY_STATE)==GF_STATE_PAUSED) ? GF_STATE_PLAYING : GF_STATE_PAUSED);
- }
- break;
- case GF_KEY_S:
- if ((evt->key.flags & GF_KEY_MOD_CTRL) && is_connected) {
- gf_term_set_option(term, GF_OPT_PLAY_STATE, GF_STATE_STEP_PAUSE);
- fprintf(stderr, "Step time: ");
- PrintTime(gf_term_get_time_in_ms(term));
- fprintf(stderr, "\n");
- }
- break;
- case GF_KEY_B:
- if ((evt->key.flags & GF_KEY_MOD_CTRL) && is_connected)
- ViewODs(term, 1);
- break;
- case GF_KEY_M:
- if ((evt->key.flags & GF_KEY_MOD_CTRL) && is_connected)
- ViewODs(term, 0);
- break;
- case GF_KEY_H:
- if ((evt->key.flags & GF_KEY_MOD_CTRL) && is_connected)
- gf_term_switch_quality(term, 1);
- break;
- case GF_KEY_L:
- if ((evt->key.flags & GF_KEY_MOD_CTRL) && is_connected)
- gf_term_switch_quality(term, 0);
- break;
- }
- break;
-
- case GF_EVENT_CONNECT:
- if (evt->connect.is_connected) {
- is_connected = 1;
- fprintf(stderr, "Service Connected\n");
- } else if (is_connected) {
- fprintf(stderr, "Service %s\n", is_connected ? "Disconnected" : "Connection Failed");
- is_connected = 0;
- Duration = 0;
- }
- if (init_w && init_h) {
- gf_term_set_size(term, init_w, init_h);
- }
- ResetCaption();
- break;
- case GF_EVENT_EOS:
- restart = 1;
- break;
- case GF_EVENT_SIZE:
- if (user.init_flags & GF_TERM_WINDOWLESS) {
- GF_Event move;
- move.type = GF_EVENT_MOVE;
- move.move.align_x = align_mode & 0xFF;
- move.move.align_y = (align_mode>>8) & 0xFF;
- move.move.relative = 2;
- gf_term_user_event(term, &move);
- }
- break;
- case GF_EVENT_SCENE_SIZE:
- if (forced_width && forced_height) {
- GF_Event size;
- size.type = GF_EVENT_SIZE;
- size.size.width = forced_width;
- size.size.height = forced_height;
- gf_term_user_event(term, &size);
- }
- break;
-
- case GF_EVENT_METADATA:
- ResetCaption();
- break;
-
- case GF_EVENT_QUIT:
- Run = 0;
- break;
- case GF_EVENT_DISCONNECT:
- gf_term_disconnect(term);
- break;
- case GF_EVENT_MIGRATE:
- {
- }
- break;
- case GF_EVENT_NAVIGATE_INFO:
- if (evt->navigate.to_url) fprintf(stderr, "Go to URL: \"%s\"\r", evt->navigate.to_url);
- break;
- case GF_EVENT_NAVIGATE:
- if (gf_term_is_supported_url(term, evt->navigate.to_url, 1, no_mime_check)) {
- strcpy(the_url, evt->navigate.to_url);
- fprintf(stderr, "Navigating to URL %s\n", the_url);
- gf_term_navigate_to(term, evt->navigate.to_url);
- return 1;
- } else {
- fprintf(stderr, "Navigation destination not supported\nGo to URL: %s\n", evt->navigate.to_url);
- }
- break;
- case GF_EVENT_SET_CAPTION:
- gf_term_user_event(term, evt);
- break;
- case GF_EVENT_AUTHORIZATION:
- if (!strlen(evt->auth.user)) {
- fprintf(stderr, "Authorization required for site %s\n", evt->auth.site_url);
- fprintf(stderr, "login: ");
- scanf("%s", evt->auth.user);
- } else {
- fprintf(stderr, "Authorization required for %s@%s\n", evt->auth.user, evt->auth.site_url);
- }
- fprintf(stderr, "password: ");
- gf_prompt_set_echo_off(1);
- scanf("%s", evt->auth.password);
- gf_prompt_set_echo_off(0);
- return 1;
- case GF_EVENT_SYS_COLORS:
-#ifdef WIN32
- evt->sys_cols.sys_colors[0] = get_sys_col(COLOR_ACTIVEBORDER);
- evt->sys_cols.sys_colors[1] = get_sys_col(COLOR_ACTIVECAPTION);
- evt->sys_cols.sys_colors[2] = get_sys_col(COLOR_APPWORKSPACE);
- evt->sys_cols.sys_colors[3] = get_sys_col(COLOR_BACKGROUND);
- evt->sys_cols.sys_colors[4] = get_sys_col(COLOR_BTNFACE);
- evt->sys_cols.sys_colors[5] = get_sys_col(COLOR_BTNHIGHLIGHT);
- evt->sys_cols.sys_colors[6] = get_sys_col(COLOR_BTNSHADOW);
- evt->sys_cols.sys_colors[7] = get_sys_col(COLOR_BTNTEXT);
- evt->sys_cols.sys_colors[8] = get_sys_col(COLOR_CAPTIONTEXT);
- evt->sys_cols.sys_colors[9] = get_sys_col(COLOR_GRAYTEXT);
- evt->sys_cols.sys_colors[10] = get_sys_col(COLOR_HIGHLIGHT);
- evt->sys_cols.sys_colors[11] = get_sys_col(COLOR_HIGHLIGHTTEXT);
- evt->sys_cols.sys_colors[12] = get_sys_col(COLOR_INACTIVEBORDER);
- evt->sys_cols.sys_colors[13] = get_sys_col(COLOR_INACTIVECAPTION);
- evt->sys_cols.sys_colors[14] = get_sys_col(COLOR_INACTIVECAPTIONTEXT);
- evt->sys_cols.sys_colors[15] = get_sys_col(COLOR_INFOBK);
- evt->sys_cols.sys_colors[16] = get_sys_col(COLOR_INFOTEXT);
- evt->sys_cols.sys_colors[17] = get_sys_col(COLOR_MENU);
- evt->sys_cols.sys_colors[18] = get_sys_col(COLOR_MENUTEXT);
- evt->sys_cols.sys_colors[19] = get_sys_col(COLOR_SCROLLBAR);
- evt->sys_cols.sys_colors[20] = get_sys_col(COLOR_3DDKSHADOW);
- evt->sys_cols.sys_colors[21] = get_sys_col(COLOR_3DFACE);
- evt->sys_cols.sys_colors[22] = get_sys_col(COLOR_3DHIGHLIGHT);
- evt->sys_cols.sys_colors[23] = get_sys_col(COLOR_3DLIGHT);
- evt->sys_cols.sys_colors[24] = get_sys_col(COLOR_3DSHADOW);
- evt->sys_cols.sys_colors[25] = get_sys_col(COLOR_WINDOW);
- evt->sys_cols.sys_colors[26] = get_sys_col(COLOR_WINDOWFRAME);
- evt->sys_cols.sys_colors[27] = get_sys_col(COLOR_WINDOWTEXT);
- return 1;
-#else
- memset(evt->sys_cols.sys_colors, 0, sizeof(u32)*28);
- return 1;
-#endif
- break;
- }
- return 0;
-}
-
-
-void list_modules(GF_ModuleManager *modules)
-{
- u32 i;
- fprintf(stderr, "\rAvailable modules:\n");
- for (i=0; i<gf_modules_get_count(modules); i++) {
- char *str = (char *) gf_modules_get_file_name(modules, i);
- if (str) fprintf(stderr, "\t%s\n", str);
- }
- fprintf(stderr, "\n");
-}
-
-
-void set_navigation()
-{
- GF_Err e;
- char navstr[20], nav;
- u32 type = gf_term_get_option(term, GF_OPT_NAVIGATION_TYPE);
- e = GF_OK;
- if (!type) {
- fprintf(stdout, "Content/compositor doesn't allow user-selectable navigation\n");
- } else if (type==1) {
- fprintf(stdout, "Select Navigation (\'N\'one, \'E\'xamine, \'S\'lide): ");
- scanf("%s", navstr);
- nav = navstr[0];
- if (nav=='N') e = gf_term_set_option(term, GF_OPT_NAVIGATION, GF_NAVIGATE_NONE);
- else if (nav=='E') e = gf_term_set_option(term, GF_OPT_NAVIGATION, GF_NAVIGATE_EXAMINE);
- else if (nav=='S') e = gf_term_set_option(term, GF_OPT_NAVIGATION, GF_NAVIGATE_SLIDE);
- else fprintf(stdout, "Unknown selector \'%c\' - only \'N\',\'E\',\'S\' allowed\n", nav);
- } else if (type==2) {
- fprintf(stdout, "Select Navigation (\'N\'one, \'W\'alk, \'F\'ly, \'E\'xamine, \'P\'an, \'S\'lide, \'G\'ame, \'V\'R, \'O\'rbit): ");
- scanf("%s", navstr);
- nav = navstr[0];
- if (nav=='N') e = gf_term_set_option(term, GF_OPT_NAVIGATION, GF_NAVIGATE_NONE);
- else if (nav=='W') e = gf_term_set_option(term, GF_OPT_NAVIGATION, GF_NAVIGATE_WALK);
- else if (nav=='F') e = gf_term_set_option(term, GF_OPT_NAVIGATION, GF_NAVIGATE_FLY);
- else if (nav=='E') e = gf_term_set_option(term, GF_OPT_NAVIGATION, GF_NAVIGATE_EXAMINE);
- else if (nav=='P') e = gf_term_set_option(term, GF_OPT_NAVIGATION, GF_NAVIGATE_PAN);
- else if (nav=='S') e = gf_term_set_option(term, GF_OPT_NAVIGATION, GF_NAVIGATE_SLIDE);
- else if (nav=='G') e = gf_term_set_option(term, GF_OPT_NAVIGATION, GF_NAVIGATE_GAME);
- else if (nav=='O') e = gf_term_set_option(term, GF_OPT_NAVIGATION, GF_NAVIGATE_ORBIT);
- else if (nav=='V') e = gf_term_set_option(term, GF_OPT_NAVIGATION, GF_NAVIGATE_VR);
- else fprintf(stdout, "Unknown selector %c - only \'N\',\'W\',\'F\',\'E\',\'P\',\'S\',\'G\', \'V\', \'O\' allowed\n", nav);
- }
- if (e) fprintf(stdout, "Error setting mode: %s\n", gf_error_to_string(e));
-}
-
-
-static Bool get_time_list(char *arg, u32 *times, u32 *nb_times)
-{
- char *str;
- Float var;
- Double sec;
- u32 h, m, s, ms, f, fps;
- if (!arg || (arg[0]=='-') || !isdigit(arg[0])) return 0;
-
- /*SMPTE time code*/
- if (strchr(arg, ':') && strchr(arg, ';') && strchr(arg, '/')) {
- if (sscanf(arg, "%02d:%02d:%02d;%02d/%02d", &h, &m, &s, &f, &fps)==5) {
- sec = 0;
- if (fps) sec = ((Double)f) / fps;
- sec += 3600*h + 60*m + s;
- times[*nb_times] = (u32) (1000*sec);
- (*nb_times) ++;
- return 1;
- }
- }
- while (arg) {
- str = strchr(arg, '-');
- if (str) str[0] = 0;
- /*HH:MM:SS:MS time code*/
- if (strchr(arg, ':') && (sscanf(arg, "%02d:%02d:%02d:%02d", &h, &m, &s, &ms)==4)) {
- sec = ms;
- sec /= 1000;
- sec += 3600*h + 60*m + s;
- times[*nb_times] = (u32) (1000*sec);
- (*nb_times) ++;
- } else if (sscanf(arg, "%f", &var)==1) {
- sec = atof(arg);
- times[*nb_times] = (u32) (1000*sec);
- (*nb_times) ++;
- }
- if (!str) break;
- str[0] = '-';
- arg = str+1;
- }
- return 1;
-}
-
-static void on_gpac_log(void *cbk, u32 ll, u32 lm, const char *fmt, va_list list)
-{
- FILE *logs = cbk;
-
- if (rti_logs && (lm & GF_LOG_RTI)) {
- char szMsg[2048];
- vsprintf(szMsg, fmt, list);
- UpdateRTInfo(szMsg + 6 /*"[RTI] "*/);
- } else {
- if (log_time_start) fprintf(logs, "[At %d]", gf_sys_clock() - log_time_start);
- vfprintf(logs, fmt, list);
- fflush(logs);
- }
-}
-
-static void init_rti_logs(char *rti_file, char *url, Bool use_rtix)
-{
- if (rti_logs) fclose(rti_logs);
- rti_logs = gf_f64_open(rti_file, "wt");
- if (rti_logs) {
- fprintf(rti_logs, "!! GPAC RunTime Info ");
- if (url) fprintf(rti_logs, "for file %s", url);
- fprintf(rti_logs, " !!\n");
- fprintf(rti_logs, "SysTime(ms)\tSceneTime(ms)\tCPU\tFPS\tMemory(kB)\tObservation\n");
-
- /*turn on RTI loging*/
- if (use_rtix) {
- gf_log_set_callback(NULL, on_gpac_log);
- gf_log_set_tool_level(GF_LOG_ALL, GF_LOG_ERROR);
- gf_log_set_tool_level(GF_LOG_RTI, GF_LOG_DEBUG);
-
- GF_LOG(GF_LOG_DEBUG, GF_LOG_RTI, ("[RTI] System state when enabling log\n"));
- } else if (log_time_start) {
- log_time_start = gf_sys_clock();
- }
- }
-}
-
-#ifdef GPAC_IPHONE
-int SDL_main (int argc, char *argv[])
-#else
-int main (int argc, char *argv[])
-#endif
-{
- char c;
- const char *str;
- u32 i, times[100], nb_times, dump_mode;
- u32 simulation_time = 0;
- Bool auto_exit = 0;
- Bool start_fs = 0;
- Bool use_rtix = 0;
- Bool rgbds_dump = 0;
- Bool rgbd_dump = 0;
- Bool depth_dump = 0;
- Bool pause_at_first = 0;
- Bool enable_mem_tracker = 0;
- Double fps = 25.0;
- Bool ret, fill_ar, visible;
- char *url_arg, *the_cfg, *rti_file;
- GF_SystemRTInfo rti;
- FILE *playlist = NULL;
- FILE *logfile = NULL;
- Float scale = 1;
- int *libgpac_so = NULL;
-
- libgpac_so = dlopen("/Applications/osmo4ios.app/libgpac_dynamic.dylib", RTLD_LAZY);
- fprintf(stderr, "dlopen libgpac_so: %p\n", libgpac_so);
- fprintf(stderr, "dlsym: %p gf_log_lt\n", gf_log_lt = dlsym(libgpac_so, "gf_log_lt"));
- fprintf(stderr, "dlsym: %p AVI_close\n", AVI_close = dlsym(libgpac_so, "AVI_close"));
- fprintf(stderr, "dlsym: %p gf_sleep\n", gf_sleep = dlsym(libgpac_so, "gf_sleep"));
- fprintf(stderr, "dlsym: %p gf_term_del\n", gf_term_del = dlsym(libgpac_so, "gf_term_del"));
- fprintf(stderr, "dlsym: %p gf_sc_release_screen_buffer\n", gf_sc_release_screen_buffer = dlsym(libgpac_so, "gf_sc_release_screen_buffer"));
- fprintf(stderr, "dlsym: %p gf_prompt_get_char\n", gf_prompt_get_char = dlsym(libgpac_so, "gf_prompt_get_char"));
- fprintf(stderr, "dlsym: %p gf_set_progress\n", gf_set_progress = dlsym(libgpac_so, "gf_set_progress"));
- fprintf(stderr, "dlsym: %p gf_term_new\n", gf_term_new = dlsym(libgpac_so, "gf_term_new"));
- fprintf(stderr, "dlsym: %p gf_term_process_step\n", gf_term_process_step = dlsym(libgpac_so, "gf_term_process_step"));
- fprintf(stderr, "dlsym: %p gf_sc_get_screen_buffer\n", gf_sc_get_screen_buffer = dlsym(libgpac_so, "gf_sc_get_screen_buffer"));
- fprintf(stderr, "dlsym: %p gf_iphone_set_sdl_audio_module\n", gf_iphone_set_sdl_audio_module = dlsym(libgpac_so, "gf_iphone_set_sdl_audio_module"));
- fprintf(stderr, "dlsym: %p gf_term_step_clocks\n", gf_term_step_clocks = dlsym(libgpac_so, "gf_term_step_clocks"));
- fprintf(stderr, "dlsym: %p gf_prompt_set_echo_off\n", gf_prompt_set_echo_off = dlsym(libgpac_so, "gf_prompt_set_echo_off"));
- fprintf(stderr, "dlsym: %p gf_log_tool_level_on\n", gf_log_tool_level_on = dlsym(libgpac_so, "gf_log_tool_level_on"));
- fprintf(stderr, "dlsym: %p gf_cfg_set_key\n", gf_cfg_set_key = dlsym(libgpac_so, "gf_cfg_set_key"));
- fprintf(stderr, "dlsym: %p gf_cfg_get_section_count\n", gf_cfg_get_section_count = dlsym(libgpac_so, "gf_cfg_get_section_count"));
- fprintf(stderr, "dlsym: %p gf_term_get_service_info\n", gf_term_get_service_info = dlsym(libgpac_so, "gf_term_get_service_info"));
- fprintf(stderr, "dlsym: %p gf_term_set_size\n", gf_term_set_size = dlsym(libgpac_so, "gf_term_set_size"));
- fprintf(stderr, "dlsym: %p gf_sys_get_rti\n", gf_sys_get_rti = dlsym(libgpac_so, "gf_sys_get_rti"));
- fprintf(stderr, "dlsym: %p gf_term_play_from_time\n", gf_term_play_from_time = dlsym(libgpac_so, "gf_term_play_from_time"));
- fprintf(stderr, "dlsym: %p gf_malloc\n", gf_malloc = dlsym(libgpac_so, "gf_malloc"));
- fprintf(stderr, "dlsym: %p gf_log_set_tool_level\n", gf_log_set_tool_level = dlsym(libgpac_so, "gf_log_set_tool_level"));
- fprintf(stderr, "dlsym: %p gf_log_set_tools_levels\n", gf_log_set_tools_levels = dlsym(libgpac_so, "gf_log_set_tools_levels"));
- fprintf(stderr, "dlsym: %p gf_log_modify_tools_levels\n", gf_log_modify_tools_levels = dlsym(libgpac_so, "gf_log_modify_tools_levels"));
- fprintf(stderr, "dlsym: %p gf_iphone_set_sdl_video_module\n", gf_iphone_set_sdl_video_module = dlsym(libgpac_so, "gf_iphone_set_sdl_video_module"));
- fprintf(stderr, "dlsym: %p gf_term_get_option\n", gf_term_get_option = dlsym(libgpac_so, "gf_term_get_option"));
- fprintf(stderr, "dlsym: %p gf_term_user_event\n", gf_term_user_event = dlsym(libgpac_so, "gf_term_user_event"));
- fprintf(stderr, "dlsym: %p gf_modules_get_file_name\n", gf_modules_get_file_name = dlsym(libgpac_so, "gf_modules_get_file_name"));
- fprintf(stderr, "dlsym: %p gf_mx_new\n", gf_mx_new = dlsym(libgpac_so, "gf_mx_new"));
- fprintf(stderr, "dlsym: %p gf_list_count\n", gf_list_count = dlsym(libgpac_so, "gf_list_count"));
- fprintf(stderr, "dlsym: %p gf_free\n", gf_free = dlsym(libgpac_so, "gf_free"));
- fprintf(stderr, "dlsym: %p gf_term_get_world_info\n", gf_term_get_world_info = dlsym(libgpac_so, "gf_term_get_world_info"));
- fprintf(stderr, "dlsym: %p gf_cfg_get_section_name\n", gf_cfg_get_section_name = dlsym(libgpac_so, "gf_cfg_get_section_name"));
- fprintf(stderr, "dlsym: %p gf_term_navigate_to\n", gf_term_navigate_to = dlsym(libgpac_so, "gf_term_navigate_to"));
- fprintf(stderr, "dlsym: %p gf_modules_del\n", gf_modules_del = dlsym(libgpac_so, "gf_modules_del"));
- fprintf(stderr, "dlsym: %p gf_modules_new\n", gf_modules_new = dlsym(libgpac_so, "gf_modules_new"));
- fprintf(stderr, "dlsym: %p gf_sys_init\n", gf_sys_init = dlsym(libgpac_so, "gf_sys_init"));
- fprintf(stderr, "dlsym: %p gf_log\n", gf_log = dlsym(libgpac_so, "gf_log"));
- fprintf(stderr, "dlsym: %p gf_term_get_object_info\n", gf_term_get_object_info = dlsym(libgpac_so, "gf_term_get_object_info"));
- fprintf(stderr, "dlsym: %p gf_mx_p\n", gf_mx_p = dlsym(libgpac_so, "gf_mx_p"));
- fprintf(stderr, "dlsym: %p gf_mx_v\n", gf_mx_v = dlsym(libgpac_so, "gf_mx_v"));
- fprintf(stderr, "dlsym: %p gf_mx_del\n", gf_mx_del = dlsym(libgpac_so, "gf_mx_del"));
- fprintf(stderr, "dlsym: %p gf_term_process_flush\n", gf_term_process_flush = dlsym(libgpac_so, "gf_term_process_flush"));
- fprintf(stderr, "dlsym: %p gf_cfg_get_key_name\n", gf_cfg_get_key_name = dlsym(libgpac_so, "gf_cfg_get_key_name"));
- fprintf(stderr, "dlsym: %p AVI_write_frame\n", AVI_write_frame = dlsym(libgpac_so, "AVI_write_frame"));
- fprintf(stderr, "dlsym: %p gf_cfg_del\n", gf_cfg_del = dlsym(libgpac_so, "gf_cfg_del"));
- fprintf(stderr, "dlsym: %p gf_term_get_channel_net_info\n", gf_term_get_channel_net_info = dlsym(libgpac_so, "gf_term_get_channel_net_info"));
- fprintf(stderr, "dlsym: %p gf_term_process_shortcut\n", gf_term_process_shortcut = dlsym(libgpac_so, "gf_term_process_shortcut"));
- fprintf(stderr, "dlsym: %p gf_cfg_init\n", gf_cfg_init = dlsym(libgpac_so, "gf_cfg_init"));
- fprintf(stderr, "dlsym: %p gf_term_get_download_info\n", gf_term_get_download_info = dlsym(libgpac_so, "gf_term_get_download_info"));
- fprintf(stderr, "dlsym: %p gf_sys_clock\n", gf_sys_clock = dlsym(libgpac_so, "gf_sys_clock"));
- fprintf(stderr, "dlsym: %p gf_term_get_object\n", gf_term_get_object = dlsym(libgpac_so, "gf_term_get_object"));
- fprintf(stderr, "dlsym: %p gf_term_set_option\n", gf_term_set_option = dlsym(libgpac_so, "gf_term_set_option"));
- fprintf(stderr, "dlsym: %p gf_sys_close\n", gf_sys_close = dlsym(libgpac_so, "gf_sys_close"));
- fprintf(stderr, "dlsym: %p gf_term_connect_from_time\n", gf_term_connect_from_time = dlsym(libgpac_so, "gf_term_connect_from_time"));
- fprintf(stderr, "dlsym: %p AVI_open_output_file\n", AVI_open_output_file = dlsym(libgpac_so, "AVI_open_output_file"));
- fprintf(stderr, "dlsym: %p gf_cfg_get_key\n", gf_cfg_get_key = dlsym(libgpac_so, "gf_cfg_get_key"));
- fprintf(stderr, "dlsym: %p AVI_set_video\n", AVI_set_video = dlsym(libgpac_so, "AVI_set_video"));
- fprintf(stderr, "dlsym: %p gf_term_set_speed\n", gf_term_set_speed = dlsym(libgpac_so, "gf_term_set_speed"));
- fprintf(stderr, "dlsym: %p gf_cfg_get_key_count\n", gf_cfg_get_key_count = dlsym(libgpac_so, "gf_cfg_get_key_count"));
- fprintf(stderr, "dlsym: %p gf_term_object_subscene_type\n", gf_term_object_subscene_type = dlsym(libgpac_so, "gf_term_object_subscene_type"));
- fprintf(stderr, "dlsym: %p gf_term_get_framerate\n", gf_term_get_framerate = dlsym(libgpac_so, "gf_term_get_framerate"));
- fprintf(stderr, "dlsym: %p gf_error_to_string\n", gf_error_to_string = dlsym(libgpac_so, "gf_error_to_string"));
- fprintf(stderr, "dlsym: %p gf_stretch_bits\n", gf_stretch_bits = dlsym(libgpac_so, "gf_stretch_bits"));
- fprintf(stderr, "dlsym: %p gf_list_del\n", gf_list_del = dlsym(libgpac_so, "gf_list_del"));
- fprintf(stderr, "dlsym: %p gf_list_get\n", gf_list_get = dlsym(libgpac_so, "gf_list_get"));
- fprintf(stderr, "dlsym: %p gf_term_disconnect\n", gf_term_disconnect = dlsym(libgpac_so, "gf_term_disconnect"));
- fprintf(stderr, "dlsym: %p gf_term_is_supported_url\n", gf_term_is_supported_url = dlsym(libgpac_so, "gf_term_is_supported_url"));
- fprintf(stderr, "dlsym: %p gf_list_new\n", gf_list_new = dlsym(libgpac_so, "gf_list_new"));
- fprintf(stderr, "dlsym: %p gf_modules_get_option\n", gf_modules_get_option = dlsym(libgpac_so, "gf_modules_get_option"));
- fprintf(stderr, "dlsym: %p gf_term_dump_scene\n", gf_term_dump_scene = dlsym(libgpac_so, "gf_term_dump_scene"));
- fprintf(stderr, "dlsym: %p gf_prompt_has_input\n", gf_prompt_has_input = dlsym(libgpac_so, "gf_prompt_has_input"));
- fprintf(stderr, "dlsym: %p gf_term_scene_update\n", gf_term_scene_update = dlsym(libgpac_so, "gf_term_scene_update"));
- fprintf(stderr, "dlsym: %p gf_term_connect\n", gf_term_connect = dlsym(libgpac_so, "gf_term_connect"));
- fprintf(stderr, "dlsym: %p gf_term_get_object_count\n", gf_term_get_object_count = dlsym(libgpac_so, "gf_term_get_object_count"));
- fprintf(stderr, "dlsym: %p gf_modules_get_count\n", gf_modules_get_count = dlsym(libgpac_so, "gf_modules_get_count"));
- fprintf(stderr, "dlsym: %p gf_term_get_root_object\n", gf_term_get_root_object = dlsym(libgpac_so, "gf_term_get_root_object"));
- fprintf(stderr, "dlsym: %p gf_term_get_time_in_ms\n", gf_term_get_time_in_ms = dlsym(libgpac_so, "gf_term_get_time_in_ms"));
- fprintf(stderr, "dlsym: %p gf_term_connect_with_path\n", gf_term_connect_with_path = dlsym(libgpac_so, "gf_term_connect_with_path"));
- fprintf(stderr, "dlsym: %p gf_log_set_callback\n", gf_log_set_callback = dlsym(libgpac_so, "gf_log_set_callback"));
- fprintf(stderr, "dlsym: %p gf_term_switch_quality\n", gf_term_switch_quality = dlsym(libgpac_so, "gf_term_switch_quality"));
- fprintf(stderr, "dlsym: %p gf_term_release_screen_buffer\n", gf_term_release_screen_buffer = dlsym(libgpac_so, "gf_term_release_screen_buffer"));
- fprintf(stderr, "dlsym: %p gf_term_get_screen_buffer\n", gf_term_get_screen_buffer = dlsym(libgpac_so, "gf_term_get_screen_buffer"));
- fprintf(stderr, "dlsym: %p gf_f64_open\n", gf_f64_open = dlsym(libgpac_so, "gf_f64_open"));
- fprintf(stderr, "dlsym: %p gf_fwrite\n", gf_fwrite = dlsym(libgpac_so, "gf_fwrite"));
- fprintf(stderr, "dlsym: %p gf_img_png_enc\n", gf_img_png_enc = dlsym(libgpac_so, "gf_img_png_enc"));
- fprintf(stderr, "dlsym: %p utf8_to_ucs4\n", utf8_to_ucs4 = dlsym(libgpac_so, "utf8_to_ucs4"));
-
- /*by default use current dir*/
- strcpy(the_url, ".");
-
- memset(&user, 0, sizeof(GF_User));
-
- dump_mode = 0;
- fill_ar = visible = 0;
- url_arg = the_cfg = rti_file = NULL;
- nb_times = 0;
- times[0] = 0;
-
- /*first locate config file if specified*/
- for (i=1; i<(u32) argc; i++) {
- char *arg = argv[i];
- if (!strcmp(arg, "-c") || !strcmp(arg, "-cfg")) {
- the_cfg = argv[i+1];
- i++;
- }
- else if (!strcmp(arg, "-mem-track")) enable_mem_tracker = 1;
- }
-
- gf_sys_init(enable_mem_tracker);
- gf_iphone_set_sdl_video_module(SDL_NewVideo);
- gf_iphone_set_sdl_audio_module(SDL_NewAudio);
-
- cfg_file = gf_cfg_init(the_cfg, NULL);
- if (!cfg_file) {
- fprintf(stdout, "Error: Configuration File \"GPAC.cfg\" not found\n");
- if (logfile) fclose(logfile);
- return 1;
- }
-
- gf_log_set_tools_levels( gf_cfg_get_key(cfg_file, "General", "Logs") );
-
- for (i=1; i<(u32) argc; i++) {
- char *arg = argv[i];
-// if (isalnum(arg[0]) || (arg[0]=='/') || (arg[0]=='.') || (arg[0]=='\\') ) {
- if (arg[0] != '-') {
- url_arg = arg;
- } else if (!strcmp(arg, "-c") || !strcmp(arg, "-cfg")) {
- the_cfg = argv[i+1];
- i++;
- } else if (!strcmp(arg, "-rti")) {
- rti_file = argv[i+1];
- i++;
- } else if (!strcmp(arg, "-rtix")) {
- rti_file = argv[i+1];
- i++;
- use_rtix = 1;
- } else if (!strcmp(arg, "-fill")) {
- fill_ar = 1;
- } else if (!strcmp(arg, "-show")) {
- visible = 1;
- } else if (!strcmp(arg, "-avi")) {
- if (rgbds_dump) dump_mode = 5;
- else if (depth_dump) dump_mode = 8;
- else if (rgbd_dump) dump_mode = 10;
- else dump_mode=1;
- if ((url_arg || (i+2<(u32)argc)) && get_time_list(argv[i+1], times, &nb_times)) i++;
- } else if (!strcmp(arg, "-rgbds")) { /*get dump in rgbds pixel format*/
- rgbds_dump = 1;
- dump_mode=6; /* rgbds texture directly*/
- if (dump_mode==1) dump_mode = 5; /* .avi rgbds dump*/
- } else if (!strcmp(arg, "-rgbd")) { /*get dump in rgbd pixel format*/
- rgbd_dump = 1;
- dump_mode=9; /* rgbd texture directly*/
- if (dump_mode==1) dump_mode = 10; /* .avi rgbds dump*/
- } else if (!strcmp(arg, "-depth")) {
- depth_dump = 1;
- if (dump_mode==2) dump_mode=7; /* grayscale .bmp depth dump*/
- else if (dump_mode==1) dump_mode=8; /* .avi depth dump*/
- else dump_mode=4; /*depth dump*/
- } else if (!strcmp(arg, "-bmp")) {
- if(depth_dump) dump_mode=7; /*grayscale depth .bmp dump*/
- else dump_mode=2;
- if ((url_arg || (i+2<(u32)argc)) && get_time_list(argv[i+1], times, &nb_times)) i++;
- } else if (!strcmp(arg, "-raw")) {
- dump_mode = 3;
- if ((url_arg || (i+2<(u32)argc)) && get_time_list(argv[i+1], times, &nb_times)) i++;
-
- } else if (!stricmp(arg, "-size")) {
- if (sscanf(argv[i+1], "%dx%d", &forced_width, &forced_height) != 2) {
- forced_width = forced_height = 0;
- }
- i++;
- } else if (!stricmp(arg, "-scale")) {
- sscanf(argv[i+1], "%f", &scale);
- i++;
- } else if (!stricmp(arg, "-fps")) {
- fps = atof(argv[i+1]);
- i++;
- } else if (!strcmp(arg, "-quiet")) {
- be_quiet = 1;
- } else if (!strcmp(arg, "-log-file") || !strcmp(arg, "-lf")) {
- logfile = gf_f64_open(argv[i+1], "wt");
- gf_log_set_callback(logfile, on_gpac_log);
- i++;
- } else if (!strcmp(arg, "-logs")) {
- gf_log_set_tools_levels( argv[i+1] );
- i++;
- } else if (!strcmp(arg, "-log-clock") || !strcmp(arg, "-lc")) {
- log_time_start = 1;
- } else if (!strcmp(arg, "-align")) {
- if (argv[i+1][0]=='m') align_mode = 1;
- else if (argv[i+1][0]=='b') align_mode = 2;
- align_mode <<= 8;
- if (argv[i+1][1]=='m') align_mode |= 1;
- else if (argv[i+1][1]=='r') align_mode |= 2;
- i++;
- }
- else if (!strcmp(arg, "-no-wnd")) user.init_flags |= GF_TERM_WINDOWLESS;
-#if defined(__DARWIN__) || defined(__APPLE__)
- else if (!strcmp(arg, "-thread")) not_threaded = 0;
-#else
- else if (!strcmp(arg, "-no-thread")) not_threaded = 1;
-#endif
- else if (!strcmp(arg, "-no-audio")) no_audio = 1;
- else if (!strcmp(arg, "-no-regulation")) no_regulation = 1;
- else if (!strcmp(arg, "-fs")) start_fs = 1;
- else if (!strcmp(arg, "-pause")) pause_at_first = 1;
- else if (!strcmp(arg, "-exit")) auto_exit = 1;
- else if (!strcmp(arg, "-mem-track")) enable_mem_tracker = 1;
- else if (!strcmp(arg, "-opt")) {
- char *sep, *sep2, szSec[1024], szKey[1024], szVal[1024];
- sep = strchr(argv[i+1], ':');
- if (sep) {
- sep[0] = 0;
- strcpy(szSec, argv[i+1]);
- sep[0] = ':'; sep ++;
- sep2 = strchr(sep, '=');
- if (sep2) {
- sep2[0] = 0;
- strcpy(szKey, sep);
- strcpy(szVal, sep2+1);
- sep2[0] = '=';
- if (!stricmp(szVal, "null")) szVal[0]=0;
- gf_cfg_set_key(cfg_file, szSec, szKey, szVal[0] ? szVal : NULL);
- }
- }
- i++;
- }
- else if (!strncmp(arg, "-run-for=", 9)) simulation_time = atoi(arg+9);
- else {
- PrintUsage();
- return 1;
- }
- }
- if (dump_mode && !url_arg) {
- fprintf(stdout, "Missing argument for dump\n");
- PrintUsage();
- if (logfile) fclose(logfile);
- return 1;
- }
- if (dump_mode) rti_file = NULL;
-
- gf_sys_get_rti(500, &rti, GF_RTI_SYSTEM_MEMORY_ONLY);
- memory_at_gpac_startup = rti.physical_memory_avail;
- if (rti_file) init_rti_logs(rti_file, url_arg, use_rtix);
-
- /*setup dumping options*/
- if (dump_mode) {
- user.init_flags |= GF_TERM_NO_AUDIO | GF_TERM_NO_COMPOSITOR_THREAD | GF_TERM_NO_REGULATION /*| GF_TERM_INIT_HIDE*/;
- if (visible || dump_mode==8) user.init_flags |= GF_TERM_INIT_HIDE;
- } else {
- init_w = forced_width;
- init_h = forced_height;
- }
-
- fprintf(stderr, "Loading modules\n");
- str = gf_cfg_get_key(cfg_file, "General", "ModulesDirectory");
-
- user.modules = gf_modules_new((const unsigned char *) str, cfg_file);
- if (user.modules) i = gf_modules_get_count(user.modules);
- if (!i || !user.modules) {
- fprintf(stdout, "Error: no modules found in %s - exiting\n", str);
- if (user.modules) gf_modules_del(user.modules);
- gf_cfg_del(cfg_file);
- gf_sys_close();
- if (logfile) fclose(logfile);
- return 1;
- }
- fprintf(stderr, "Modules Loaded (%d found in %s)\n", i, str);
-
- user.config = cfg_file;
- user.EventProc = GPAC_EventProc;
- /*dummy in this case (global vars) but MUST be non-NULL*/
- user.opaque = user.modules;
- if (not_threaded) user.init_flags |= GF_TERM_NO_COMPOSITOR_THREAD;
- if (no_audio) user.init_flags |= GF_TERM_NO_AUDIO;
- if (no_regulation) user.init_flags |= GF_TERM_NO_REGULATION;
-
- fprintf(stderr, "Loading GPAC Terminal\n");
- term = gf_term_new(&user);
- if (!term) {
- fprintf(stderr, "\nInit error - check you have at least one video out and one rasterizer...\nFound modules:\n");
- list_modules(user.modules);
- gf_modules_del(user.modules);
- gf_cfg_del(cfg_file);
- gf_sys_close();
- if (logfile) fclose(logfile);
- return 1;
- }
- fprintf(stderr, "Terminal Loaded\n");
-
-
- if (dump_mode) {
-// gf_term_set_option(term, GF_OPT_VISIBLE, 0);
- if (fill_ar) gf_term_set_option(term, GF_OPT_ASPECT_RATIO, GF_ASPECT_RATIO_FILL_SCREEN);
- } else {
- /*check video output*/
- str = gf_cfg_get_key(cfg_file, "Video", "DriverName");
- if (!strcmp(str, "Raw Video Output")) fprintf(stdout, "WARNING: using raw output video (memory only) - no display used\n");
- /*check audio output*/
- str = gf_cfg_get_key(cfg_file, "Audio", "DriverName");
- if (!str || !strcmp(str, "No Audio Output Available")) fprintf(stdout, "WARNING: no audio output availble - make sure no other program is locking the sound card\n");
-
- str = gf_cfg_get_key(cfg_file, "General", "NoMIMETypeFetch");
- no_mime_check = (str && !stricmp(str, "yes")) ? 1 : 0;
- }
-
- str = gf_cfg_get_key(cfg_file, "HTTPProxy", "Enabled");
- if (str && !strcmp(str, "yes")) {
- str = gf_cfg_get_key(cfg_file, "HTTPProxy", "Name");
- if (str) fprintf(stdout, "HTTP Proxy %s enabled\n", str);
- }
-
- if (rti_file) {
- str = gf_cfg_get_key(cfg_file, "General", "RTIRefreshPeriod");
- if (str) {
- rti_update_time_ms = atoi(str);
- } else {
- gf_cfg_set_key(cfg_file, "General", "RTIRefreshPeriod", "200");
- }
- UpdateRTInfo("At GPAC load time\n");
- }
-
- Run = 1;
- ret = 1;
-
- if (dump_mode) {
- if (!nb_times) {
- times[0] = 0;
- nb_times++;
- }
- ret = dump_file(url_arg, dump_mode, fps, forced_width, forced_height, scale, times, nb_times);
- Run = 0;
- } else
-
- /*connect if requested*/
- if (url_arg) {
- char *ext;
- strcpy(the_url, url_arg);
- ext = strrchr(the_url, '.');
- if (ext && (!stricmp(ext, ".m3u") || !stricmp(ext, ".pls"))) {
- fprintf(stdout, "Opening Playlist %s\n", the_url);
- playlist = gf_f64_open(the_url, "rt");
- if (playlist) {
- strcpy(pl_path, the_url);
- fscanf(playlist, "%s", the_url);
- fprintf(stdout, "Opening URL %s\n", the_url);
- gf_term_connect_with_path(term, the_url, pl_path);
- } else {
- fprintf(stdout, "Hit 'h' for help\n\n");
- }
- } else {
- fprintf(stdout, "Opening URL %s\n", the_url);
- if (pause_at_first) fprintf(stdout, "[Status: Paused]\n");
- gf_term_connect_from_time(term, the_url, 0, pause_at_first);
- }
- } else {
- fprintf(stdout, "Hit 'h' for help\n\n");
- str = gf_cfg_get_key(cfg_file, "General", "StartupFile");
- if (str) {
- strcpy(the_url, "MP4Client "GPAC_FULL_VERSION);
- gf_term_connect(term, str);
- startup_file = 1;
- }
- }
- /*force fullscreen*/
- if (start_fs)
- gf_term_set_option(term, GF_OPT_FULLSCREEN, 1);
-
- while (Run) {
- /*we don't want getchar to block*/
- if (1 || !gf_prompt_has_input()) {
- if (restart) {
- restart = 0;
- gf_term_play_from_time(term, 0, 0);
- }
- if (request_next_playlist_item) {
- c = '\n';
- request_next_playlist_item = 0;
- goto force_input;
- }
- if (!use_rtix || display_rti) UpdateRTInfo(NULL);
- if (not_threaded) {
- //printf("gf_term_process_step from run loop\n");
- gf_term_process_step(term);
- if (auto_exit && gf_term_get_option(term, GF_OPT_IS_OVER)) {
- Run = 0;
- }
- } else {
- gf_sleep(rti_update_time_ms);
- }
- /*sim time*/
- if (simulation_time && (gf_term_get_time_in_ms(term)>simulation_time)) {
- Run = 0;
- }
- continue;
- }
- c = gf_prompt_get_char();
-
-force_input:
- switch (c) {
- case 'q':
- Run = 0;
- break;
- case 'X':
- exit(0);
- break;
- case 'Q':
- break;
- case 'o':
- startup_file = 0;
- gf_term_disconnect(term);
- fprintf(stdout, "Enter the absolute URL\n");
- scanf("%s", the_url);
- if (rti_file) init_rti_logs(rti_file, the_url, use_rtix);
- gf_term_connect(term, the_url);
- break;
- case 'O':
- gf_term_disconnect(term);
- fprintf(stdout, "Enter the absolute URL to the playlist\n");
- scanf("%s", the_url);
- playlist = gf_f64_open(the_url, "rt");
- if (playlist) {
- fscanf(playlist, "%s", the_url);
- fprintf(stdout, "Opening URL %s\n", the_url);
- gf_term_connect(term, the_url);
- }
- break;
- case '\n':
- case 'N':
- if (playlist) {
- gf_term_disconnect(term);
-
- if (fscanf(playlist, "%s", the_url) == EOF) {
- fprintf(stdout, "No more items - exiting\n");
- Run = 0;
- } else {
- fprintf(stdout, "Opening URL %s\n", the_url);
- gf_term_connect_with_path(term, the_url, pl_path);
- }
- }
- break;
- case 'P':
- if (playlist) {
- u32 count;
- gf_term_disconnect(term);
- scanf("%d", &count);
- while (count) {
- fscanf(playlist, "%s", the_url);
- count--;
- }
- fprintf(stdout, "Opening URL %s\n", the_url);
- gf_term_connect(term, the_url);
- }
- break;
- case 'r':
- if (is_connected) {
- gf_term_disconnect(term);
- gf_term_connect(term, startup_file ? gf_cfg_get_key(cfg_file, "General", "StartupFile") : the_url);
- }
- break;
-
- case 'D':
- if (is_connected) gf_term_disconnect(term);
- break;
-
- case 'p':
- if (is_connected) {
- Bool is_pause = gf_term_get_option(term, GF_OPT_PLAY_STATE);
- fprintf(stdout, "[Status: %s]\n", is_pause ? "Playing" : "Paused");
- gf_term_set_option(term, GF_OPT_PLAY_STATE, is_pause ? GF_STATE_PLAYING : GF_STATE_PAUSED);
- }
- break;
- case 's':
- if (is_connected) {
- gf_term_set_option(term, GF_OPT_PLAY_STATE, GF_STATE_STEP_PAUSE);
- fprintf(stdout, "Step time: ");
- PrintTime(gf_term_get_time_in_ms(term));
- fprintf(stdout, "\n");
- }
- break;
-
- case 'z':
- if (!CanSeek || (Duration<=2000)) {
- fprintf(stdout, "scene not seekable\n");
- } else {
- Double res;
- s32 seekTo;
- fprintf(stdout, "Duration: ");
- PrintTime(Duration);
- res = gf_term_get_time_in_ms(term);
- res *= 100; res /= (s64)Duration;
- fprintf(stdout, " (current %.2f %%)\nEnter Seek percentage:\n", res);
- if (scanf("%d", &seekTo) == 1) {
- if (seekTo > 100) seekTo = 100;
- res = (Double)(s64)Duration; res /= 100; res *= seekTo;
- gf_term_play_from_time(term, (u64) (s64) res, 0);
- }
- }
- break;
-
- case 't':
- {
- if (is_connected) {
- fprintf(stdout, "Current Time: ");
- PrintTime(gf_term_get_time_in_ms(term));
- fprintf(stdout, " - Duration: ");
- PrintTime(Duration);
- fprintf(stdout, "\n");
- }
- }
- break;
- case 'w':
- if (is_connected) PrintWorldInfo(term);
- break;
- case 'v':
- if (is_connected) PrintODList(term, NULL, 0, 0, "Root");
- break;
- case 'i':
- if (is_connected) {
- u32 ID;
- fprintf(stdout, "Enter OD ID (0 for main OD): ");
- fflush(stdout);
- scanf("%d", &ID);
- ViewOD(term, ID, (u32)-1);
- }
- break;
- case 'j':
- if (is_connected) {
- u32 num;
- fprintf(stdout, "Enter OD number (0 for main OD): ");
- fflush(stdout);
- scanf("%d", &num);
- ViewOD(term, (u32)-1, num);
- }
- break;
- case 'b':
- if (is_connected) ViewODs(term, 1);
- break;
-
- case 'm':
- if (is_connected) ViewODs(term, 0);
- break;
-
- case 'l':
- list_modules(user.modules);
- break;
-
- case 'n':
- if (is_connected) set_navigation();
- break;
- case 'x':
- if (is_connected) gf_term_set_option(term, GF_OPT_NAVIGATION_TYPE, 0);
- break;
-
- case 'd':
- if (is_connected) {
- GF_ObjectManager *odm = NULL;
- char radname[GF_MAX_PATH], *sExt;
- GF_Err e;
- u32 i, count, odid;
- Bool xml_dump, std_out;
- fprintf(stdout, "Enter Inline OD ID if any or 0");
- fflush(stdout);
- radname[0] = 0;
- scanf("%d", &odid);
- if (odid) {
- GF_ObjectManager *root_odm = gf_term_get_root_object(term);
- if (!root_odm) break;
- count = gf_term_get_object_count(term, root_odm);
- for (i=0; i<count; i++) {
- GF_MediaInfo info;
- odm = gf_term_get_object(term, root_odm, i);
- if (gf_term_get_object_info(term, odm, &info) == GF_OK) {
- if (info.od->objectDescriptorID==odid) break;
- }
- odm = NULL;
- }
- }
- fprintf(stdout, "Enter file radical name (+\'.x\' for XML dumping) - \"std\" for stdout: ");
- fflush(stdout);
- scanf("%s", radname);
- sExt = strrchr(radname, '.');
- xml_dump = 0;
- if (sExt) {
- if (!stricmp(sExt, ".x")) xml_dump = 1;
- sExt[0] = 0;
- }
- std_out = strnicmp(radname, "std", 3) ? 0 : 1;
- e = gf_term_dump_scene(term, std_out ? NULL : radname, NULL, xml_dump, 0, odm);
- fprintf(stdout, "Dump done (%s)\n", gf_error_to_string(e));
- }
- break;
-
- case 'c':
- PrintGPACConfig();
- break;
- case '3':
- {
- Bool use_3d = !gf_term_get_option(term, GF_OPT_USE_OPENGL);
- if (gf_term_set_option(term, GF_OPT_USE_OPENGL, use_3d)==GF_OK) {
- fprintf(stdout, "Using %s for 2D drawing\n", use_3d ? "OpenGL" : "2D rasterizer");
- }
- }
- break;
- case 'k':
- {
- Bool opt = gf_term_get_option(term, GF_OPT_STRESS_MODE);
- opt = !opt;
- fprintf(stdout, "Turning stress mode %s\n", opt ? "on" : "off");
- gf_term_set_option(term, GF_OPT_STRESS_MODE, opt);
- }
- break;
- case '4': gf_term_set_option(term, GF_OPT_ASPECT_RATIO, GF_ASPECT_RATIO_4_3); break;
- case '5': gf_term_set_option(term, GF_OPT_ASPECT_RATIO, GF_ASPECT_RATIO_16_9); break;
- case '6': gf_term_set_option(term, GF_OPT_ASPECT_RATIO, GF_ASPECT_RATIO_FILL_SCREEN); break;
- case '7': gf_term_set_option(term, GF_OPT_ASPECT_RATIO, GF_ASPECT_RATIO_KEEP); break;
-
- case 'C':
- switch (gf_term_get_option(term, GF_OPT_MEDIA_CACHE)) {
- case GF_MEDIA_CACHE_DISABLED: gf_term_set_option(term, GF_OPT_MEDIA_CACHE, GF_MEDIA_CACHE_ENABLED); break;
- case GF_MEDIA_CACHE_ENABLED: gf_term_set_option(term, GF_OPT_MEDIA_CACHE, GF_MEDIA_CACHE_DISABLED); break;
- case GF_MEDIA_CACHE_RUNNING: fprintf(stdout, "Streaming Cache is running - please stop it first\n"); continue;
- }
- switch (gf_term_get_option(term, GF_OPT_MEDIA_CACHE)) {
- case GF_MEDIA_CACHE_ENABLED: fprintf(stdout, "Streaming Cache Enabled\n"); break;
- case GF_MEDIA_CACHE_DISABLED: fprintf(stdout, "Streaming Cache Disabled\n"); break;
- case GF_MEDIA_CACHE_RUNNING: fprintf(stdout, "Streaming Cache Running\n"); break;
- }
- break;
- case 'S':
- case 'A':
- if (gf_term_get_option(term, GF_OPT_MEDIA_CACHE)==GF_MEDIA_CACHE_RUNNING) {
- gf_term_set_option(term, GF_OPT_MEDIA_CACHE, (c=='S') ? GF_MEDIA_CACHE_DISABLED : GF_MEDIA_CACHE_DISCARD);
- fprintf(stdout, "Streaming Cache stopped\n");
- } else {
- fprintf(stdout, "Streaming Cache not running\n");
- }
- break;
- case 'R':
- display_rti = !display_rti;
- ResetCaption();
- break;
- case 'F':
- if (display_rti) display_rti = 0;
- else display_rti = 2;
- ResetCaption();
- break;
-
- case 'u':
- {
- GF_Err e;
- char szCom[8192];
- fprintf(stdout, "Enter command to send:\n");
- fflush(stdin);
- szCom[0] = 0;
- scanf("%[^\t\n]", szCom);
- e = gf_term_scene_update(term, NULL, szCom);
- if (e) fprintf(stdout, "Processing command failed: %s\n", gf_error_to_string(e));
- }
- break;
-
- case 'L':
- {
- char szLog[1024];
- fprintf(stdout, "Enter new log level:\n");
- scanf("%s", szLog);
- gf_log_modify_tools_levels( szLog );
- }
- break;
- case 'g':
- {
- GF_SystemRTInfo rti;
- gf_sys_get_rti(rti_update_time_ms, &rti, 0);
- fprintf(stdout, "GPAC allocated memory "LLD"\n", rti.gpac_memory);
- }
- break;
- case 'M':
- {
- u32 size;
- fprintf(stdout, "Enter new video cache memory in kBytes (current %d):\n", gf_term_get_option(term, GF_OPT_VIDEO_CACHE_SIZE));
- scanf("%d", &size);
- gf_term_set_option(term, GF_OPT_VIDEO_CACHE_SIZE, size);
- }
- break;
-
- case 'E':
- gf_term_set_option(term, GF_OPT_RELOAD_CONFIG, 1);
- break;
-
- case 'B':
- switch_bench();
- break;
-
- /*extract to PNG*/
- case 'Z':
- {
- GF_VideoSurface fb;
- GF_Err e;
- e = gf_term_get_screen_buffer(term, &fb);
- if (e) {
- fprintf(stdout, "Error dumping screen buffer %s\n", gf_error_to_string(e) );
- } else {
- u32 dst_size = fb.width*fb.height*3;
- char *dst=malloc(sizeof(char)*dst_size);
-
- e = gf_img_png_enc(fb.video_buffer, fb.width, fb.height, fb.pitch_y, fb.pixel_format, dst, &dst_size);
- if (e) {
- fprintf(stdout, "Error encoding PNG %s\n", gf_error_to_string(e) );
- } else {
- FILE *png = gf_f64_open("dump.png", "wb");
- if (!png) {
- fprintf(stdout, "Error writing file dump.png\n");
- } else {
- gf_fwrite(dst, dst_size, 1, png);
- fclose(png);
- fprintf(stdout, "Writing file dump.png\n");
- }
- }
- if (dst) free(dst);
- gf_term_release_screen_buffer(term, &fb);
- }
- }
- break;
-
- case 'h':
- PrintHelp();
- break;
- default:
- break;
- }
- }
-
- gf_term_disconnect(term);
- if (rti_file) UpdateRTInfo("Disconnected\n");
-
- fprintf(stdout, "Deleting terminal... ");
- if (playlist) fclose(playlist);
- gf_term_del(term);
- fprintf(stdout, "OK\n");
-
- fprintf(stdout, "GPAC cleanup ...\n");
- gf_modules_del(user.modules);
- gf_cfg_del(cfg_file);
-
-#ifdef GPAC_MEMORY_TRACKING
- if (enable_mem_tracker) {
- gf_memory_print();
- fprintf(stdout, "print any key\n");
- while (!gf_prompt_has_input()) {
- gf_sleep(100);
- }
- }
-#endif
-
- gf_sys_close();
- if (rti_logs) fclose(rti_logs);
- if (logfile) fclose(logfile);
- fprintf(stdout, "Bye\n");
- return 0;
-}
-
-void PrintWorldInfo(GF_Terminal *term)
-{
- u32 i;
- const char *title;
- GF_List *descs;
- descs = gf_list_new();
- title = gf_term_get_world_info(term, NULL, descs);
- if (!title && !gf_list_count(descs)) {
- fprintf(stdout, "No World Info available\n");
- } else {
- fprintf(stdout, "\t%s\n", title ? title : "No title available");
- for (i=0; i<gf_list_count(descs); i++) {
- char *str = gf_list_get(descs, i);
- fprintf(stdout, "%s\n", str);
- }
- }
- gf_list_del(descs);
-}
-
-void PrintODList(GF_Terminal *term, GF_ObjectManager *root_odm, u32 num, u32 indent, char *root_name)
-{
- GF_MediaInfo odi;
- u32 i, count;
- char szIndent[50];
- GF_ObjectManager *odm;
-
- if (!root_odm) {
- fprintf(stdout, "Currently loaded objects:\n");
- root_odm = gf_term_get_root_object(term);
- }
- if (!root_odm) return;
- if (gf_term_get_object_info(term, root_odm, &odi) != GF_OK) return;
- if (!odi.od) {
- fprintf(stdout, "Service not attached\n");
- return;
- }
-
- for (i=0;i<indent;i++) szIndent[i]=' ';
- szIndent[indent]=0;
-
- fprintf(stdout, "%s", szIndent);
- fprintf(stdout, "#%d %s - ", num, root_name);
- if (odi.media_url) {
- fprintf(stdout, "%s\n", odi.media_url);
- } else {
- fprintf(stdout, "OD ID %d\n", odi.od->objectDescriptorID);
- }
-
- szIndent[indent]=' ';
- szIndent[indent+1]=0;
- indent++;
-
- count = gf_term_get_object_count(term, root_odm);
- for (i=0; i<count; i++) {
- odm = gf_term_get_object(term, root_odm, i);
- if (!odm) break;
- num++;
- if (gf_term_get_object_info(term, odm, &odi) == GF_OK) {
- switch (gf_term_object_subscene_type(term, odm)) {
- case 1:
- PrintODList(term, odm, num, indent, "Root");
- break;
- case 2:
- PrintODList(term, odm, num, indent, "Inline Scene");
- break;
- case 3:
- PrintODList(term, odm, num, indent, "EXTERNPROTO Library");
- break;
- default:
- fprintf(stdout, "%s", szIndent);
- fprintf(stdout, "#%d - ", num);
- if (odi.media_url) {
- fprintf(stdout, "%s", odi.media_url);
- } else {
- fprintf(stdout, "ID %d", odi.od->objectDescriptorID);
- }
- fprintf(stdout, " - %s\n", (odi.od_type==GF_STREAM_VISUAL) ? "Video" : (odi.od_type==GF_STREAM_AUDIO) ? "Audio" : "Systems");
- break;
- }
- }
- }
-}
-
-void ViewOD(GF_Terminal *term, u32 OD_ID, u32 number)
-{
- GF_MediaInfo odi;
- u32 i, j, count, d_enum,id;
- GF_Err e;
- char code[5];
- NetStatCommand com;
- GF_ObjectManager *odm, *root_odm = gf_term_get_root_object(term);
- if (!root_odm) return;
-
- odm = NULL;
- if ((!OD_ID && (number == (u32)(-1))) ||
- ((OD_ID == (u32)(-1)) && !number)) {
- odm = root_odm;
- if ((gf_term_get_object_info(term, odm, &odi) != GF_OK)) odm=NULL;
- } else {
- count = gf_term_get_object_count(term, root_odm);
- for (i=0; i<count; i++) {
- odm = gf_term_get_object(term, root_odm, i);
- if (!odm) break;
- if (gf_term_get_object_info(term, odm, &odi) == GF_OK) {
- if ((number == (u32)(-1)) && (odi.od->objectDescriptorID == OD_ID)) break;
- else if (i == (u32)(number-1)) break;
- }
- odm = NULL;
- }
- }
- if (!odm) {
- if (number == (u32)-1) fprintf(stdout, "cannot find OD with ID %d\n", OD_ID);
- else fprintf(stdout, "cannot find OD with number %d\n", number);
- return;
- }
- if (!odi.od) {
- if (number == (u32)-1) fprintf(stdout, "Object %d not attached yet\n", OD_ID);
- else fprintf(stdout, "Object #%d not attached yet\n", number);
- return;
- }
-
- if (!odi.od) {
- fprintf(stdout, "Service not attached\n");
- return;
- }
-
- if (odi.od->tag==GF_ODF_IOD_TAG) {
- fprintf(stdout, "InitialObjectDescriptor %d\n", odi.od->objectDescriptorID);
- fprintf(stdout, "Profiles and Levels: Scene %x - Graphics %x - Visual %x - Audio %x - OD %x\n",
- odi.scene_pl, odi.graphics_pl, odi.visual_pl, odi.audio_pl, odi.OD_pl);
- fprintf(stdout, "Inline Profile Flag %d\n", odi.inline_pl);
- } else {
- fprintf(stdout, "ObjectDescriptor %d\n", odi.od->objectDescriptorID);
- }
-
- fprintf(stdout, "Object Duration: ");
- if (odi.duration) {
- PrintTime((u32) (odi.duration*1000));
- } else {
- fprintf(stdout, "unknown");
- }
- fprintf(stdout, "\n");
-
- if (odi.owns_service) {
- fprintf(stdout, "Service Handler: %s\n", odi.service_handler);
- fprintf(stdout, "Service URL: %s\n", odi.service_url);
- }
- if (odi.codec_name) {
- Float avg_dec_time;
- switch (odi.od_type) {
- case GF_STREAM_VISUAL:
- fprintf(stdout, "Video Object: Width %d - Height %d\r\n", odi.width, odi.height);
- fprintf(stdout, "Media Codec: %s\n", odi.codec_name);
- if (odi.par) fprintf(stdout, "Pixel Aspect Ratio: %d:%d\n", (odi.par>>16)&0xFF, (odi.par)&0xFF);
- break;
- case GF_STREAM_AUDIO:
- fprintf(stdout, "Audio Object: Sample Rate %d - %d channels\r\n", odi.sample_rate, odi.num_channels);
- fprintf(stdout, "Media Codec: %s\n", odi.codec_name);
- break;
- case GF_STREAM_SCENE:
- case GF_STREAM_PRIVATE_SCENE:
- if (odi.width && odi.height) {
- fprintf(stdout, "Scene Description - Width %d - Height %d\n", odi.width, odi.height);
- } else {
- fprintf(stdout, "Scene Description - no size specified\n");
- }
- fprintf(stdout, "Scene Codec: %s\n", odi.codec_name);
- break;
- case GF_STREAM_TEXT:
- if (odi.width && odi.height) {
- fprintf(stdout, "Text Object: Width %d - Height %d\n", odi.width, odi.height);
- } else {
- fprintf(stdout, "Text Object: No size specified\n");
- }
- fprintf(stdout, "Text Codec %s\n", odi.codec_name);
- break;
- }
-
- avg_dec_time = 0;
- if (odi.nb_dec_frames) {
- avg_dec_time = (Float) odi.total_dec_time;
- avg_dec_time /= odi.nb_dec_frames;
- }
- fprintf(stdout, "\tBitrate over last second: %d kbps\n\tMax bitrate over one second: %d kbps\n\tAverage Decoding Time %.2f ms (%d max)\n\tTotal decoded frames %d\n",
- (u32) odi.avg_bitrate/1024, odi.max_bitrate/1024, avg_dec_time, odi.max_dec_time, odi.nb_dec_frames);
- }
- if (odi.protection) fprintf(stdout, "Encrypted Media%s\n", (odi.protection==2) ? " NOT UNLOCKED" : "");
-
- count = gf_list_count(odi.od->ESDescriptors);
- fprintf(stdout, "%d streams in OD\n", count);
- for (i=0; i<count; i++) {
- GF_ESD *esd = (GF_ESD *) gf_list_get(odi.od->ESDescriptors, i);
-
- fprintf(stdout, "\nStream ID %d - Clock ID %d\n", esd->ESID, esd->OCRESID);
- if (esd->dependsOnESID) fprintf(stdout, "\tDepends on Stream ID %d for decoding\n", esd->dependsOnESID);
-
- switch (esd->decoderConfig->streamType) {
- case GF_STREAM_OD: fprintf(stdout, "\tOD Stream - version %d\n", esd->decoderConfig->objectTypeIndication); break;
- case GF_STREAM_OCR: fprintf(stdout, "\tOCR Stream\n"); break;
- case GF_STREAM_SCENE: fprintf(stdout, "\tScene Description Stream - version %d\n", esd->decoderConfig->objectTypeIndication); break;
- case GF_STREAM_VISUAL:
- fprintf(stdout, "\tVisual Stream - media type: ");
- switch (esd->decoderConfig->objectTypeIndication) {
- case GPAC_OTI_VIDEO_MPEG4_PART2: fprintf(stdout, "MPEG-4\n"); break;
- case GPAC_OTI_VIDEO_MPEG2_SIMPLE: fprintf(stdout, "MPEG-2 Simple Profile\n"); break;
- case GPAC_OTI_VIDEO_MPEG2_MAIN: fprintf(stdout, "MPEG-2 Main Profile\n"); break;
- case GPAC_OTI_VIDEO_MPEG2_SNR: fprintf(stdout, "MPEG-2 SNR Profile\n"); break;
- case GPAC_OTI_VIDEO_MPEG2_SPATIAL: fprintf(stdout, "MPEG-2 Spatial Profile\n"); break;
- case GPAC_OTI_VIDEO_MPEG2_HIGH: fprintf(stdout, "MPEG-2 High Profile\n"); break;
- case GPAC_OTI_VIDEO_MPEG2_422: fprintf(stdout, "MPEG-2 422 Profile\n"); break;
- case GPAC_OTI_VIDEO_MPEG1: fprintf(stdout, "MPEG-1\n"); break;
- case GPAC_OTI_IMAGE_JPEG: fprintf(stdout, "JPEG\n"); break;
- case GPAC_OTI_IMAGE_PNG: fprintf(stdout, "PNG\n"); break;
- case GPAC_OTI_IMAGE_JPEG_2000: fprintf(stdout, "JPEG2000\n"); break;
-
- case GPAC_OTI_MEDIA_GENERIC:
- memcpy(code, esd->decoderConfig->decoderSpecificInfo->data, 4);
- code[4] = 0;
- fprintf(stdout, "GPAC Intern (%s)\n", code);
- break;
- default:
- fprintf(stdout, "Private Type (0x%x)\n", esd->decoderConfig->objectTypeIndication);
- break;
- }
- break;
-
- case GF_STREAM_AUDIO:
- fprintf(stdout, "\tAudio Stream - media type: ");
- switch (esd->decoderConfig->objectTypeIndication) {
- case GPAC_OTI_AUDIO_AAC_MPEG4: fprintf(stdout, "MPEG-4\n"); break;
- case GPAC_OTI_AUDIO_AAC_MPEG2_MP: fprintf(stdout, "MPEG-2 AAC Main Profile\n"); break;
- case GPAC_OTI_AUDIO_AAC_MPEG2_LCP: fprintf(stdout, "MPEG-2 AAC LowComplexity Profile\n"); break;
- case GPAC_OTI_AUDIO_AAC_MPEG2_SSRP: fprintf(stdout, "MPEG-2 AAC Scalable Sampling Rate Profile\n"); break;
- case GPAC_OTI_AUDIO_MPEG2_PART3: fprintf(stdout, "MPEG-2 Audio\n"); break;
- case GPAC_OTI_AUDIO_MPEG1: fprintf(stdout, "MPEG-1 Audio\n"); break;
- case GPAC_OTI_AUDIO_EVRC_VOICE: fprintf(stdout, "EVRC Audio\n"); break;
- case GPAC_OTI_AUDIO_SMV_VOICE: fprintf(stdout, "SMV Audio\n"); break;
- case GPAC_OTI_AUDIO_13K_VOICE: fprintf(stdout, "QCELP Audio\n"); break;
- case GPAC_OTI_MEDIA_GENERIC:
- memcpy(code, esd->decoderConfig->decoderSpecificInfo->data, 4);
- code[4] = 0;
- fprintf(stdout, "GPAC Intern (%s)\n", code);
- break;
- default:
- fprintf(stdout, "Private Type (0x%x)\n", esd->decoderConfig->objectTypeIndication);
- break;
- }
- break;
- case GF_STREAM_MPEG7: fprintf(stdout, "\tMPEG-7 Stream - version %d\n", esd->decoderConfig->objectTypeIndication); break;
- case GF_STREAM_IPMP: fprintf(stdout, "\tIPMP Stream - version %d\n", esd->decoderConfig->objectTypeIndication); break;
- case GF_STREAM_OCI: fprintf(stdout, "\tOCI Stream - version %d\n", esd->decoderConfig->objectTypeIndication); break;
- case GF_STREAM_MPEGJ: fprintf(stdout, "\tMPEGJ Stream - version %d\n", esd->decoderConfig->objectTypeIndication); break;
- case GF_STREAM_INTERACT: fprintf(stdout, "\tUser Interaction Stream - version %d\n", esd->decoderConfig->objectTypeIndication); break;
- case GF_STREAM_TEXT: fprintf(stdout, "\tStreaming Text Stream - version %d\n", esd->decoderConfig->objectTypeIndication); break;
- default: fprintf(stdout, "Unknown Stream\r\n"); break;
- }
-
- fprintf(stdout, "\tBuffer Size %d\n\tAverage Bitrate %d bps\n\tMaximum Bitrate %d bps\n", esd->decoderConfig->bufferSizeDB, esd->decoderConfig->avgBitrate, esd->decoderConfig->maxBitrate);
- if (esd->slConfig->predefined==SLPredef_SkipSL) {
- fprintf(stdout, "\tNot using MPEG-4 Synchronization Layer\n");
- } else {
- fprintf(stdout, "\tStream Clock Resolution %d\n", esd->slConfig->timestampResolution);
- }
- if (esd->URLString) fprintf(stdout, "\tStream Location: %s\n", esd->URLString);
-
- /*check language*/
- if (esd->langDesc) {
- u32 i=0;
- char lan[4], *szLang;
- lan[0] = esd->langDesc->langCode>>16;
- lan[1] = (esd->langDesc->langCode>>8)&0xFF;
- lan[2] = (esd->langDesc->langCode)&0xFF;
- lan[3] = 0;
-
- if ((lan[0]=='u') && (lan[1]=='n') && (lan[2]=='d')) szLang = "Undetermined";
- else {
- szLang = lan;
- while (GF_ISO639_Lang[i]) {
- if (GF_ISO639_Lang[i+2][0] && strstr(GF_ISO639_Lang[i+1], lan)) {
- szLang = (char*) GF_ISO639_Lang[i];
- break;
- }
- i+=3;
- }
- }
- fprintf(stdout, "\tStream Language: %s\n", szLang);
- }
- }
- fprintf(stdout, "\n");
- /*check OCI (not everything interests us) - FIXME: support for unicode*/
- count = gf_list_count(odi.od->OCIDescriptors);
- if (count) {
- fprintf(stdout, "%d Object Content Information descriptors in OD\n", count);
- for (i=0; i<count; i++) {
- GF_Descriptor *desc = (GF_Descriptor *) gf_list_get(odi.od->OCIDescriptors, i);
- switch (desc->tag) {
- case GF_ODF_SEGMENT_TAG:
- {
- GF_Segment *sd = (GF_Segment *) desc;
- fprintf(stdout, "Segment Descriptor: Name: %s - start time %g sec - duration %g sec\n", sd->SegmentName, sd->startTime, sd->Duration);
- }
- break;
- case GF_ODF_CC_NAME_TAG:
- {
- GF_CC_Name *ccn = (GF_CC_Name *)desc;
- fprintf(stdout, "Content Creators:\n");
- for (j=0; j<gf_list_count(ccn->ContentCreators); j++) {
- GF_ContentCreatorInfo *ci = (GF_ContentCreatorInfo *) gf_list_get(ccn->ContentCreators, j);
- if (!ci->isUTF8) continue;
- fprintf(stdout, "\t%s\n", ci->contentCreatorName);
- }
- }
- break;
-
- case GF_ODF_SHORT_TEXT_TAG:
- {
- GF_ShortTextual *std = (GF_ShortTextual *)desc;
- fprintf(stdout, "Description:\n\tEvent: %s\n\t%s\n", std->eventName, std->eventText);
- }
- break;
- default:
- break;
- }
- }
- fprintf(stdout, "\n");
- }
-
- switch (odi.status) {
- case 0: fprintf(stdout, "Stopped - "); break;
- case 1: fprintf(stdout, "Playing - "); break;
- case 2: fprintf(stdout, "Paused - "); break;
- case 3: fprintf(stdout, "Not setup yet\n"); return;
- default: fprintf(stdout, "Setup Failed\n"); return;
- }
- if (odi.buffer>=0) fprintf(stdout, "Buffer: %d ms - ", odi.buffer);
- else fprintf(stdout, "Not buffering - ");
- fprintf(stdout, "Clock drift: %d ms\n", odi.clock_drift);
- if (odi.db_unit_count) fprintf(stdout, "%d AU in DB\n", odi.db_unit_count);
- if (odi.cb_max_count) fprintf(stdout, "Composition Buffer: %d CU (%d max)\n", odi.cb_unit_count, odi.cb_max_count);
- fprintf(stdout, "\n");
-
- if (odi.owns_service) {
- const char *url;
- u32 done, total, bps;
- d_enum = 0;
- while (gf_term_get_download_info(term, odm, &d_enum, &url, NULL, &done, &total, &bps)) {
- if (d_enum==1) fprintf(stdout, "Current Downloads in service:\n");
- if (done && total) {
- fprintf(stdout, "%s: %d / %d bytes (%.2f %%) - %.2f kBps\n", url, done, total, (100.0f*done)/total, ((Float)bps)/1024.0f);
- } else {
- fprintf(stdout, "%s: %.2f kbps\n", url, ((Float)8*bps)/1024.0f);
- }
- }
- if (!d_enum) fprintf(stdout, "No Downloads in service\n");
- fprintf(stdout, "\n");
- }
- d_enum = 0;
- while (gf_term_get_channel_net_info(term, odm, &d_enum, &id, &com, &e)) {
- if (e) continue;
- if (!com.bw_down && !com.bw_up) continue;
-
- fprintf(stdout, "Stream ID %d statistics:\n", id);
- if (com.multiplex_port) {
- fprintf(stdout, "\tMultiplex Port %d - multiplex ID %d\n", com.multiplex_port, com.port);
- } else {
- fprintf(stdout, "\tPort %d\n", com.port);
- }
- fprintf(stdout, "\tPacket Loss Percentage: %.4f\n", com.pck_loss_percentage);
- fprintf(stdout, "\tDown Bandwidth: %d bps\n", com.bw_down);
- if (com.bw_up) fprintf(stdout, "\tUp Bandwidth: %d bps\n", com.bw_up);
- if (com.ctrl_port) {
- if (com.multiplex_port) {
- fprintf(stdout, "\tControl Multiplex Port: %d - Control Multiplex ID %d\n", com.multiplex_port, com.ctrl_port);
- } else {
- fprintf(stdout, "\tControl Port: %d\n", com.ctrl_port);
- }
- fprintf(stdout, "\tDown Bandwidth: %d bps\n", com.ctrl_bw_down);
- fprintf(stdout, "\tUp Bandwidth: %d bps\n", com.ctrl_bw_up);
- }
- fprintf(stdout, "\n");
- }
-}
-
-void PrintODTiming(GF_Terminal *term, GF_ObjectManager *odm)
-{
- GF_MediaInfo odi;
- if (!odm) return;
-
- if (gf_term_get_object_info(term, odm, &odi) != GF_OK) return;
- if (!odi.od) {
- fprintf(stdout, "Service not attached\n");
- return;
- }
-
- fprintf(stdout, "OD %d: ", odi.od->objectDescriptorID);
- switch (odi.status) {
- case 1: fprintf(stdout, "Playing - "); break;
- case 2: fprintf(stdout, "Paused - "); break;
- default: fprintf(stdout, "Stopped - "); break;
- }
- if (odi.buffer>=0) fprintf(stdout, "Buffer: %d ms - ", odi.buffer);
- else fprintf(stdout, "Not buffering - ");
- fprintf(stdout, "Clock drift: %d ms", odi.clock_drift);
- fprintf(stdout, " - time: ");
- PrintTime((u32) (odi.current_time*1000));
- fprintf(stdout, "\n");
-}
-
-void PrintODBuffer(GF_Terminal *term, GF_ObjectManager *odm)
-{
- Float avg_dec_time;
- GF_MediaInfo odi;
- if (!odm) return;
-
- if (gf_term_get_object_info(term, odm, &odi) != GF_OK) return;
- if (!odi.od) {
- fprintf(stdout, "Service not attached\n");
- return;
- }
-
- fprintf(stdout, "OD %d: ", odi.od->objectDescriptorID);
- switch (odi.status) {
- case 1: fprintf(stdout, "Playing"); break;
- case 2: fprintf(stdout, "Paused"); break;
- default: fprintf(stdout, "Stopped"); break;
- }
- if (odi.buffer>=0) fprintf(stdout, " - Buffer: %d ms", odi.buffer);
- if (odi.db_unit_count) fprintf(stdout, " - DB: %d AU", odi.db_unit_count);
- if (odi.cb_max_count) fprintf(stdout, " - CB: %d/%d CUs", odi.cb_unit_count, odi.cb_max_count);
-
- fprintf(stdout, "\n * %d decoded frames - %d dropped frames\n", odi.nb_dec_frames, odi.nb_droped);
- avg_dec_time = 0;
- if (odi.nb_dec_frames) { avg_dec_time = (Float) odi.total_dec_time; avg_dec_time /= odi.nb_dec_frames; }
- fprintf(stdout, " * Avg Bitrate %d kbps (%d max) - Avg Decoding Time %.2f ms (%d max)\n",
- (u32) odi.avg_bitrate/1024, odi.max_bitrate/1024, avg_dec_time, odi.max_dec_time);
-}
-
-void ViewODs(GF_Terminal *term, Bool show_timing)
-{
- u32 i, count;
- GF_ObjectManager *odm, *root_odm = gf_term_get_root_object(term);
- if (!root_odm) return;
-
- if (show_timing) {
- PrintODTiming(term, root_odm);
- } else {
- PrintODBuffer(term, root_odm);
- }
- count = gf_term_get_object_count(term, root_odm);
- for (i=0; i<count; i++) {
- odm = gf_term_get_object(term, root_odm, i);
- if (show_timing) {
- PrintODTiming(term, odm);
- } else {
- PrintODBuffer(term, odm);
- }
- }
- fprintf(stdout, "\n");
-}
-
-
-void PrintGPACConfig()
-{
- u32 i, j, cfg_count, key_count;
- char szName[200];
- char *secName = NULL;
-
- fprintf(stdout, "Enter section name (\"*\" for complete dump):\n");
- scanf("%s", szName);
- if (strcmp(szName, "*")) secName = szName;
-
- fprintf(stdout, "\n\n*** GPAC Configuration ***\n\n");
-
- cfg_count = gf_cfg_get_section_count(cfg_file);
- for (i=0; i<cfg_count; i++) {
- const char *sec = gf_cfg_get_section_name(cfg_file, i);
- if (secName) {
- if (stricmp(sec, secName)) continue;
- } else {
- if (!stricmp(sec, "General")) continue;
- if (!stricmp(sec, "MimeTypes")) continue;
- if (!stricmp(sec, "RecentFiles")) continue;
- }
- fprintf(stdout, "[%s]\n", sec);
- key_count = gf_cfg_get_key_count(cfg_file, sec);
- for (j=0; j<key_count; j++) {
- const char *key = gf_cfg_get_key_name(cfg_file, sec, j);
- const char *val = gf_cfg_get_key(cfg_file, sec, key);
- fprintf(stdout, "%s=%s\n", key, val);
- }
- fprintf(stdout, "\n");
- }
-}
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
- <key>CFBundleDevelopmentRegion</key>
- <string>English</string>
- <key>CFBundleExecutable</key>
- <string>${EXECUTABLE_NAME}</string>
- <key>CFBundleIdentifier</key>
- <string>com.gpac.${PRODUCT_NAME:identifier}</string>
- <key>CFBundleInfoDictionaryVersion</key>
- <string>6.0</string>
- <key>CFBundleName</key>
- <string>Osmo4</string>
- <key>CFBundlePackageType</key>
- <string>APPL</string>
- <key>CFBundleShortVersionString</key>
- <string>9.9.9</string><!-- VERSION_REV_REPLACE -->
- <key>CFBundleSignature</key>
- <string>gpac</string>
- <key>CFBundleVersion</key>
- <string>9999</string><!-- BUILD_REV_REPLACE -->
-</dict>
-</plist>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
-<plist version="1.0">
-<dict>
- <key>CFBundleDevelopmentRegion</key>
- <string>English</string>
- <key>CFBundleExecutable</key>
- <string>Osmo4</string>
- <key>CFBundleGetInfoString</key>
- <string>Osmo4 0.4.2</string>
- <key>CFBundleIconFile</key>
- <string>Osmo</string>
- <key>CFBundleIdentifier</key>
- <string>org.gpac.Osmo4</string>
- <key>CFBundleInfoDictionaryVersion</key>
- <string>0.4.2</string>
- <key>CFBundlePackageType</key>
- <string>APPL</string>
- <key>CFBundleShortVersionString</key>
- <string>0.4.2</string>
- <key>CFBundleSignature</key>
- <string>Omo4</string>
- <key>CFBundleVersion</key>
- <string>0.4.2</string>
- <key>NSHumanReadableCopyright</key>
- <string>Copyright (c) 2003-2005 gpac</string>
- <key>NSMainNibFile</key>
- <string>NSMainNibFile</string>
- <key>NSPrincipalClass</key>
- <string>NSApplication</string>
-</dict>
-</plist>
+++ /dev/null
-include ../../config.mak
-
-vpath %.cpp $(SRC_PATH)/applications/osmo4_wx
-
-CFLAGS= $(CPPFLAGS) -I"$(SRC_PATH)/include"
-
-ifeq ($(DEBUGBUILD), yes)
-CFLAGS+=-g
-LDFLAGS+=-g
-endif
-
-ifeq ($(GPROFBUILD), yes)
-CFLAGS+=-pg
-LDFLAGS+=-pg
-endif
-
-ifeq ($(GPACREADONLY), yes)
-CFLAGS+=-DGPAC_READ_ONLY
-endif
-
-#common obj
-OBJS= wxOsmo4.o wxGPACControl.o fileprops.o Playlist.o menubtn.o
-
-ifeq ($(CONFIG_WIN32),yes)
-EXE=.exe
-PROG=Osmo4$(EXE)
-else
-EXT=
-PROG=Osmo4
-endif
-
-#3 - spidermonkey support
-ifeq ($(CONFIG_JS),no)
-else
-SCENEGRAPH_CFLAGS+=$(JS_FLAGS)
-ifeq ($(CONFIG_JS),local)
-NEED_LOCAL_LIB="yes"
-endif
-LINKFLAGS+=$(JS_LIBS)
-endif
-
-
-SRCS := $(OBJS:.o=.cpp)
-
-all: $(PROG)
-
-Osmo4$(EXE): $(OBJS)
- $(CC) $(LDFLAGS) -o ../../bin/gcc/$@ $(OBJS) -L../../bin/gcc -lgpac $(WX_LFLAGS) $(LINKFLAGS)
-
-%.o: %.cpp
- $(CXX) $(CFLAGS) $(WX_CFLAGS) -c -o $@ $<
-
-clean:
- rm -f $(OBJS) ../../bin/gcc/$(PROG)
-
-install:
-ifeq ($(CONFIG_DARWIN),yes)
- mkdir -p $(DESTDIR)$(mac_apps)/Osmo4.app/Contents/MacOS
- mkdir -p $(DESTDIR)$(mac_apps)/Osmo4.app/Contents/Resources/English.lproj
- cp ./Darwin.Info.plist \
- $(DESTDIR)$(mac_apps)/Osmo4.app/Contents/Info.plist
- cp ./Darwin.InfoPlist.strings \
- $(DESTDIR)$(mac_apps)/Osmo4.app/Contents/Resources/English.lproj/InfoPlist.strings
- cp ./Darwin.Osmo.icns \
- $(DESTDIR)$(mac_apps)/Osmo4.app/Contents/Resources/Osmo.icns
- install -m 755 $(INSTFLAGS) ../../bin/gcc/Osmo4 \
- $(DESTDIR)$(mac_apps)/Osmo4.app/Contents/MacOS
- echo -n 'APPLOsm4' > $(DESTDIR)$(mac_apps)/Osmo4.app/Contents/PkgInfo
-else
- rm -f wxOsmo4.o
- mkdir -p $(DESTDIR)$(prefix)/bin
- install -m 755 $(INSTFLAGS) ../../bin/gcc/Osmo4 "$(DESTDIR)$(prefix)/bin"
-endif
-
-uninstall:
- rm -rf $(DESTDIR)$(prefix)/bin/Osmo4
-
-dep:
-
-depend:
- rm -f .depend
- $(CC) -MM $(CFLAGS) $(SRCS) 1>.depend
-
-distclean: clean
- rm -f Makefile.bak .depend
-
-
-
-# include dependency files if they exist
-#
-ifneq ($(wildcard .depend),)
-include .depend
-endif
-
+++ /dev/null
-/*
- * GPAC - Multimedia Framework C SDK
- *
- * Copyright (c) Jean Le Feuvre 2000-2005
- * All rights reserved
- *
- * This file is part of GPAC / Osmo4 wxWidgets GUI
- *
- * GPAC is gf_free software; you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation; either version 2, or (at your option)
- * any later version.
- *
- * GPAC is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; see the file COPYING. If not, write to
- * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
- *
- *
- */
-
-#include "wxOsmo4.h"
-#include "Playlist.h"
-
-
-#include "playlist.xpm"
-
-PLEntry::PLEntry(wxString url)
-{
- m_url = gf_strdup(url.mb_str(wxConvUTF8));
- Bool is_remote = 0;;
- wxCharBuffer the_url = (const char *) url.mb_str(wxConvUTF8);
- const char *_url = strstr(the_url, "://");
- if (_url) {_url += 3; is_remote = 1; }
- else _url = (const char *) the_url;
-
- char *str = (char*)strrchr(_url, '\\');
- if (!str) str = (char*)strrchr(_url, '/');
- if (str && strlen(str+1)) {
- m_disp_name = gf_strdup(str+1);
- str = strrchr(m_disp_name, '.');
- if (str) str[0] = 0;
- } else {
- m_disp_name = gf_strdup(_url);
- if (!is_remote) {
- str = strrchr(m_disp_name, '.');
- if (str) str[0] = 0;
- }
- }
- m_duration = 0;
- m_bIsDead = 0;
- m_bIsPlaying = 0;
- m_bIsSelected = 0;
-}
-
-PLEntry::~PLEntry()
-{
- if (m_url) gf_free(m_url);
- if (m_disp_name) gf_free(m_disp_name);
-
-}
-
-wxPlaylist::wxPlaylist(wxWindow *parent)
- : wxFrame(parent, -1, wxString(_T("Osmo4 Playlist")), wxDefaultPosition, wxDefaultSize,
- wxCLOSE_BOX | wxSYSTEM_MENU | wxCAPTION | wxRESIZE_BORDER)
-{
-
- m_pApp = (wxOsmo4Frame *)parent;
-
- m_pOpen = new wxBitmap(pl_open);
- m_pSave = new wxBitmap(pl_save);
- m_pAdd = new wxBitmap(pl_add);
- m_pRem = new wxBitmap(pl_rem);
- m_pUp = new wxBitmap(pl_up);
- m_pDown = new wxBitmap(pl_down);
- m_pSort = new wxBitmap(pl_sort);
-
- m_pToolBar = CreateToolBar(wxTB_HORIZONTAL);
- m_pAddBut = new wxMenuButton(m_pToolBar, ID_PL_ADD_FILE, *m_pAdd);
- wxMenu *menu = new wxMenu();
- menu->Append(ID_PL_ADD_URL, wxT("&Url"));
- menu->Append(ID_PL_ADD_DIR, wxT("&Directory"));
- menu->Append(ID_PL_ADD_DIR_REC, wxT("&Directory and subfolders"));
- m_pAddBut->AssignMenu(menu);
- m_pAddBut->SetToolTip(wxString(wxT("Add Files")));
-
- m_pRemBut = new wxMenuButton(m_pToolBar, ID_PL_REM_FILE, *m_pRem);
- menu = new wxMenu();
- menu->Append(ID_PL_REM_ALL, wxT("&Clear"));
- menu->Append(ID_PL_REM_DEAD, wxT("&Remove dead entries"));
- m_pRemBut->AssignMenu(menu);
- m_pRemBut->SetToolTip(wxString(wxT("Remove Selected Files")));
-
- m_pSortBut = new wxMenuButton(m_pToolBar, ID_PL_SORT_FILE, *m_pSort);
- menu = new wxMenu();
- menu->Append(ID_PL_SORT_TITLE, wxT("&Sort by Title"));
- menu->Append(ID_PL_SORT_FILE, wxT("&Sort by file name"));
- menu->Append(ID_PL_SORT_DUR, wxT("&Sort by Duration"));
- menu->AppendSeparator();
- menu->Append(ID_PL_REVERSE, wxT("&Reverse"));
- menu->Append(ID_PL_RANDOMIZE, wxT("&Randomize"));
- m_pSortBut->AssignMenu(menu);
- m_pSortBut->SetToolTip(wxString(wxT("Sort Playlist by filename")));
-
- m_pToolBar->AddTool(ID_PL_OPEN, wxT(""), *m_pOpen, wxT("Open Playlist"));
- m_pToolBar->AddTool(ID_PL_SAVE, wxT(""), *m_pSave, wxT("Save Playlist"));
- m_pToolBar->AddSeparator();
- m_pToolBar->AddControl(m_pAddBut);
- m_pToolBar->AddControl(m_pRemBut);
- m_pToolBar->AddSeparator();
- m_pToolBar->AddTool(ID_PL_UP, wxT(""), *m_pUp, wxT("Moves Selected Files Up"));
- m_pToolBar->AddTool(ID_PL_DOWN, wxT(""), *m_pDown, wxT("Moves Selected Files Down"));
- m_pToolBar->AddSeparator();
- m_pToolBar->AddControl(m_pSortBut);
- m_pToolBar->Realize();
-
- m_FileList = new wxListCtrl(this, ID_FILE_LIST, wxDefaultPosition, wxDefaultSize, wxLC_REPORT);
-
- m_FileList->InsertColumn(0, wxT(""), wxLIST_FORMAT_LEFT, 1);
- m_FileList->InsertColumn(1, wxT("Title"), wxLIST_FORMAT_LEFT, 1);
- m_FileList->InsertColumn(2, wxT("Duration"), wxLIST_FORMAT_LEFT, 1);
-
- m_entries = gf_list_new();
- m_cur_entry = -1;
- m_all_dead_entries = -1;
-
- SetSize(220, 380);
- Centre();
-}
-
-wxPlaylist::~wxPlaylist()
-{
- Clear();
- gf_list_del(m_entries);
- delete m_pAddBut;
- delete m_pRemBut;
- delete m_pSortBut;
- delete m_pOpen;
- delete m_pSave;
- delete m_pAdd;
- delete m_pRem;
- delete m_pUp;
- delete m_pDown;
- delete m_pSort;
-}
-
-
-BEGIN_EVENT_TABLE(wxPlaylist, wxWindow)
- EVT_CLOSE(wxPlaylist::OnClose)
- EVT_SIZE(wxPlaylist::OnSize)
- EVT_TOOL(ID_PL_ADD_FILE, wxPlaylist::OnAddFile)
- EVT_TOOL(ID_PL_ADD_URL, wxPlaylist::OnAddURL)
- EVT_TOOL(ID_PL_ADD_DIR, wxPlaylist::OnAddDir)
- EVT_TOOL(ID_PL_ADD_DIR_REC, wxPlaylist::OnAddDirRec)
- EVT_TOOL(ID_PL_REM_FILE, wxPlaylist::OnRemFile)
- EVT_TOOL(ID_PL_REM_ALL, wxPlaylist::OnRemAll)
- EVT_TOOL(ID_PL_REM_DEAD, wxPlaylist::OnRemDead)
- EVT_TOOL(ID_PL_UP, wxPlaylist::OnSelUp)
- EVT_TOOL(ID_PL_DOWN, wxPlaylist::OnSelDown)
- EVT_TOOL(ID_PL_SAVE, wxPlaylist::OnSave)
- EVT_TOOL(ID_PL_OPEN, wxPlaylist::OnOpen)
- EVT_MENU(ID_PL_PLAY, wxPlaylist::OnPlay)
- EVT_MENU(ID_PL_RANDOMIZE, wxPlaylist::OnRandomize)
- EVT_MENU(ID_PL_REVERSE, wxPlaylist::OnReverseList)
- EVT_MENU(ID_PL_SEL_REV, wxPlaylist::OnReverseSelection)
- EVT_MENU(ID_PL_SORT_TITLE, wxPlaylist::OnSortTitle)
- EVT_MENU(ID_PL_SORT_FILE, wxPlaylist::OnSortFile)
- EVT_MENU(ID_PL_SORT_DUR, wxPlaylist::OnSortDuration)
- EVT_LIST_ITEM_ACTIVATED(ID_FILE_LIST, wxPlaylist::OnItemActivate)
- EVT_LIST_ITEM_RIGHT_CLICK(ID_FILE_LIST, wxPlaylist::OnRightClick)
-END_EVENT_TABLE()
-
-void wxPlaylist::OnClose(wxCloseEvent &event)
-{
- if (event.CanVeto()) {
- event.Veto();
- Hide();
- }
-}
-
-void wxPlaylist::OnSize(wxSizeEvent &event)
-{
- wxSize s = event.GetSize();
- m_FileList->SetSize(0, 0, s.GetWidth()-2, s.GetHeight());
- m_FileList->SetColumnWidth(0, 30);
- m_FileList->SetColumnWidth(2, 60);
- m_FileList->SetColumnWidth(1, s.GetWidth()-96);
-}
-
-void wxPlaylist::Clear()
-{
- m_FileList->DeleteAllItems();
- while (gf_list_count(m_entries)) {
- PLEntry *ple = (PLEntry *) gf_list_get(m_entries, 0);
- gf_list_rem(m_entries, 0);
- delete ple;
- }
- m_cur_entry = -1;
-}
-
-void wxPlaylist::ClearButPlaying()
-{
- PLEntry *p = NULL;
- if (m_cur_entry >= 0) {
- p = (PLEntry *) gf_list_get(m_entries, m_cur_entry);
- gf_list_rem(m_entries, m_cur_entry);
- }
- Clear();
- if (p) {
- gf_list_add(m_entries, p);
- m_cur_entry = 0;
- }
- RefreshList();
-}
-
-void wxPlaylist::UpdateEntry(u32 idx)
-{
- char szText[20];
-
- PLEntry *ple = (PLEntry *) gf_list_get(m_entries, idx);
- if (idx+1<10) sprintf(szText, "00%d", idx+1);
- else if (idx+1<100) sprintf(szText, "0%d", idx+1);
- else sprintf(szText, "%d", idx+1);
- m_FileList->SetItem(idx, 0, wxString(szText, wxConvUTF8));
-
- wxString str;
- if (ple->m_bIsDead) str = wxT("!! ") + wxString(ple->m_disp_name, wxConvUTF8) + wxT(" (DEAD)!!)");
- else if (ple->m_bIsPlaying) str = wxT(">> ") + wxString(ple->m_disp_name, wxConvUTF8) + wxT(" >>");
- else str = wxString(ple->m_disp_name, wxConvUTF8);
- m_FileList->SetItem(idx, 1, str);
-
- if (ple->m_duration) {
- u32 h = (u32) (ple->m_duration / 3600);
- u32 m = (u32) (ple->m_duration / 60) - h*60;
- u32 s = (u32) (ple->m_duration) - h*3600 - m*60;
- m_FileList->SetItem(idx, 2, wxString::Format(wxT("%02d:%02d:%02d"), h, m, s) );
- } else {
- m_FileList->SetItem(idx, 2, wxT("Unknown"));
- }
-}
-
-void wxPlaylist::RefreshList()
-{
- u32 i, top_idx;
- char szPath[GF_MAX_PATH];
- Bool first_sel;
-
- top_idx = m_FileList->GetTopItem();
- m_FileList->DeleteAllItems();
-
- first_sel = 0;
- for (i=0; i<gf_list_count(m_entries); i++) {
- PLEntry *ple = (PLEntry *) gf_list_get(m_entries, i);
- m_FileList->InsertItem(i, wxT(""));
- /*cast for 64-bit compilation*/
- m_FileList->SetItemData(i, (unsigned long) ple);
- UpdateEntry(i);
-
- if (ple->m_bIsPlaying) m_cur_entry = i;
-
- if (ple->m_bIsSelected) {
- m_FileList->SetItemState(i, wxLIST_STATE_SELECTED, wxLIST_STATE_SELECTED | wxLIST_MASK_STATE);
- ple->m_bIsSelected = 0;
- /*ensure first item of selection is visible*/
- if (!first_sel) {
- first_sel = 1;
- top_idx = i;
- }
- }
- }
-
- if (m_cur_entry >= (s32) gf_list_count(m_entries)-1) m_cur_entry = gf_list_count(m_entries)-1;
- else {
- s32 last_idx = top_idx + m_FileList->GetCountPerPage();
- m_FileList->EnsureVisible(top_idx);
- if (gf_list_count(m_entries)<1+ (u32) last_idx) last_idx = gf_list_count(m_entries)-1;
- m_FileList->EnsureVisible(last_idx);
- }
-
- strcpy((char *) szPath, m_pApp->szAppPath);
-#ifdef WIN32
- strcat(szPath, "gpac_pl.m3u");
-#else
- strcat(szPath, ".gpac_pl.m3u");
-#endif
- Save(szPath, 1);
-}
-
-void wxPlaylist::OnAddFile(wxCommandEvent &WXUNUSED(event))
-{
- wxFileDialog dlg(this, wxT("Select file(s)"), wxT(""), wxT(""), m_pApp->GetFileFilter(), wxOPEN | wxCHANGE_DIR | /*wxHIDE_READONLY |*/ wxMULTIPLE);
-
- if (dlg.ShowModal() == wxID_OK) {
- wxArrayString stra;
- dlg.GetPaths(stra);
- for (u32 i=0; i<stra.GetCount(); i++) {
- PLEntry *ple = new PLEntry(stra[i]);
- gf_list_add(m_entries, ple);
- }
- m_all_dead_entries = -1;
- RefreshList();
- }
-}
-
-
-static Bool pl_enum_dir_item(void *cbck, char *item_name, char *item_path)
-{
- wxPlaylist *_this = (wxPlaylist *)cbck;
-
- if (gf_term_is_supported_url(_this->m_pApp->m_term, item_name, 0, 1)) {
- PLEntry *ple = new PLEntry(wxString(item_path, wxConvUTF8) );
- gf_list_add(_this->m_entries, ple);
- }
- return 0;
-}
-
-static Bool pl_enum_dir_dirs(void *cbck, char *item_name, char *item_path)
-{
- gf_enum_directory(item_path, 0, pl_enum_dir_item, cbck, NULL);
- gf_enum_directory(item_path, 1, pl_enum_dir_dirs, cbck, NULL);
- return 0;
-}
-
-
-void wxPlaylist::AddDir(Bool do_recurse)
-{
- wxDirDialog dlg(this);
- dlg.SetPath(wxString(szCacheDir, wxConvUTF8) );
- if (dlg.ShowModal() != wxID_OK) return;
-
- strcpy(szCacheDir, dlg.GetPath().mb_str(wxConvUTF8));
- gf_enum_directory(szCacheDir, 0, pl_enum_dir_item, this, NULL);
- if (do_recurse) gf_enum_directory(szCacheDir, 1, pl_enum_dir_dirs, this, NULL);
- m_all_dead_entries = -1;
- RefreshList();
-}
-void wxPlaylist::OnAddDir(wxCommandEvent &WXUNUSED(event))
-{
- AddDir(0);
-}
-void wxPlaylist::OnAddDirRec(wxCommandEvent &WXUNUSED(event))
-{
- AddDir(1);
-}
-
-void wxPlaylist::OnAddURL(wxCommandEvent &WXUNUSED(event))
-{
- OpenURLDlg dlg(this, m_pApp->m_user.config);
- if (dlg.ShowModal() != wxID_OK) return;
- PLEntry *ple = new PLEntry(dlg.m_urlVal);
- gf_list_add(m_entries, ple);
- m_all_dead_entries = -1;
- RefreshList();
-}
-
-void wxPlaylist::OnRemFile(wxCommandEvent &WXUNUSED(event))
-{
- if (!m_FileList->GetSelectedItemCount()) return;
-
- long item = -1;
- for (;;) {
- item = m_FileList->GetNextItem(item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
- if (item == -1) break;
- PLEntry *ple = (PLEntry *) m_FileList->GetItemData(item);
- gf_list_del_item(m_entries, ple);
- delete ple;
- }
- RefreshList();
-}
-
-void wxPlaylist::OnRemAll(wxCommandEvent &WXUNUSED(event))
-{
- Clear();
- RefreshList();
- m_cur_entry = -1;
- m_all_dead_entries = 1;
-}
-
-void wxPlaylist::OnRemDead(wxCommandEvent &WXUNUSED(event))
-{
- for (u32 i=0; i<gf_list_count(m_entries); i++) {
- PLEntry *ple = (PLEntry *) gf_list_get(m_entries, i);
- if (!ple->m_bIsDead) continue;
- gf_list_rem(m_entries, i);
- i--;
- delete ple;
- }
- m_all_dead_entries = gf_list_count(m_entries) ? 0 : 1;
- RefreshList();
-}
-
-
-void wxPlaylist::OnSelUp(wxCommandEvent &WXUNUSED(event))
-{
- s32 i;
- if (!m_FileList->GetSelectedItemCount()) return;
- long item = -1;
- item = m_FileList->GetNextItem(item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
- if (item <= 0) return;
-
- item = -1;
- for (;;) {
- item = m_FileList->GetNextItem(item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
- if (item == -1) break;
- PLEntry *ple = (PLEntry *) m_FileList->GetItemData(item);
- i = gf_list_del_item(m_entries, ple);
- assert(i>=1);
- gf_list_insert(m_entries, ple, i-1);
- ple->m_bIsSelected = 1;
- }
- RefreshList();
-}
-
-void wxPlaylist::OnSelDown(wxCommandEvent &WXUNUSED(event))
-{
- s32 i;
-
- if (!m_FileList->GetSelectedItemCount()) return;
- long item = -1;
- for (;;) {
- item = m_FileList->GetNextItem(item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
- if (item == -1) break;
- }
- if ((u32) item + 1 == gf_list_count(m_entries)) return;
-
- item = -1;
- for (;;) {
- item = m_FileList->GetNextItem(item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
- if (item == -1) break;
- PLEntry *ple = (PLEntry *) m_FileList->GetItemData(item);
- i = gf_list_del_item(m_entries, ple);
- assert(i>=1);
- gf_list_insert(m_entries, ple, i+1);
- ple->m_bIsSelected = 1;
- }
- RefreshList();
-}
-
-
-
-void wxPlaylist::OnSave(wxCommandEvent & WXUNUSED(event))
-{
- Bool save_m3u;
- char szPath[GF_MAX_PATH];
- if (!gf_list_count(m_entries)) return;
-
- wxFileDialog dlg(this, wxT("Select file(s)"), wxT(""), wxT(""), wxT("M3U Playlists|*.m3u|ShoutCast Playlists|*.pls|"), wxSAVE | wxCHANGE_DIR | wxOVERWRITE_PROMPT);
- if (dlg.ShowModal() != wxID_OK) return;
-
- strcpy(szPath, dlg.GetPath().mb_str(wxConvUTF8));
- strlwr(szPath);
- save_m3u = (dlg.GetFilterIndex()==0) ? 1 : 0;
- if (save_m3u) {
- if (!strstr(szPath, ".m3u")) {
- strcpy(szPath, dlg.GetPath().mb_str(wxConvUTF8));
- strcat(szPath, ".m3u");
- } else {
- strcpy(szPath, dlg.GetPath().mb_str(wxConvUTF8));
- }
- } else {
- if (!strstr(szPath, ".pls")) {
- strcpy(szPath, dlg.GetPath().mb_str(wxConvUTF8));
- strcat(szPath, ".pls");
- } else {
- strcpy(szPath, dlg.GetPath().mb_str(wxConvUTF8));
- }
- }
- Save(szPath, save_m3u);
-}
-
-void wxPlaylist::Save(char *szPath, Bool save_m3u)
-{
- FILE *out = fopen(szPath, "wt");
- if (!save_m3u)
- fprintf(out, "[playlist]\nNumberOfEntries=%d\n", gf_list_count(m_entries));
-
- for (u32 i=0; i<gf_list_count(m_entries); i++) {
- PLEntry *ple = (PLEntry *) gf_list_get(m_entries, i);
- if (save_m3u) {
- fprintf(out, "%s\n", ple->m_url);
- } else {
- fprintf(out, "File%d=%s\n", i+1, ple->m_url);
- fprintf(out, "Title%d=%s\n", i+1, ple->m_disp_name);
- if (ple->m_duration) fprintf(out, "Length%d=%d\n", i+1, ple->m_duration);
- else fprintf(out, "Length%d=-1\n", i+1);
- }
- }
- if (!save_m3u) fprintf(out, "Version=2\n");
-
- fprintf(out, "\n");
- fclose(out);
-}
-
-void wxPlaylist::OnOpen(wxCommandEvent & WXUNUSED(event))
-{
- wxFileDialog dlg(this, wxT("Select file(s)"), wxT(""), wxT(""), wxT("M3U & PLS Playlists|*.m3u;*.pls|M3U Playlists|*.m3u|ShoutCast Playlists|*.pls|"), wxOPEN | wxCHANGE_DIR/* | wxHIDE_READONLY*/);
- if (dlg.ShowModal() != wxID_OK) return;
-
- Clear();
- OpenPlaylist(dlg.GetPath());
- m_cur_entry = 0;
- Play();
-}
-
-void wxPlaylist::OpenPlaylist(wxString filename)
-{
- FILE *pl;
- PLEntry *ple;
- Bool load_m3u, go;
- char szLine[GF_MAX_PATH];
- pl = fopen(filename.mb_str(wxConvUTF8) , "rt");
- if (!pl) return;
-
- ple = NULL;
- load_m3u = 1;
- while (!feof(pl)) {
- fgets(szLine, GF_MAX_PATH, pl);
- go = 1;
- while (go) {
- switch (szLine[strlen(szLine)-1]) {
- case '\n':
- case '\r':
- case ' ':
- szLine[strlen(szLine)-1] = 0;
- break;
- default:
- go = 0;
- break;
- }
- }
- if (!strlen(szLine)) continue;
- if (!stricmp(szLine, "[playlist]")) {
- load_m3u = 0;
- } else if (load_m3u) {
- ple = new PLEntry(wxString(szLine, wxConvUTF8) );
- gf_list_add(m_entries, ple);
- } else if (!strnicmp(szLine, "file", 4)) {
- char *st = strchr(szLine, '=');
- if (!st) ple = NULL;
- else {
- ple = new PLEntry(wxString(st + 1, wxConvUTF8) );
- gf_list_add(m_entries, ple);
- }
- } else if (ple && !strnicmp(szLine, "Length", 6)) {
- char *st = strchr(szLine, '=');
- s32 d = atoi(st + 1);
- if (d>0) ple->m_duration = d;
- } else if (ple && !strnicmp(szLine, "Title", 5)) {
- char *st = strchr(szLine, '=');
- gf_free(ple->m_disp_name);
- ple->m_disp_name = gf_strdup(st + 6);
- }
- }
- fclose(pl);
- m_all_dead_entries = -1;
- m_cur_entry = -1;
- RefreshList();
-}
-
-void wxPlaylist::OnRightClick(wxListEvent & event)
-{
- if (!m_FileList->GetItemCount()) return;
-
- wxMenu *popup = new wxMenu();
-
- if (m_FileList->GetSelectedItemCount()==1) {
- popup->Append(ID_PL_PLAY, wxT("Play"));
- popup->AppendSeparator();
- }
- popup->Append(ID_PL_SEL_REV, wxT("Inverse Selection"));
- if (m_FileList->GetSelectedItemCount()) popup->Append(ID_PL_REM_FILE, wxT("Remove File(s)"));
- if (m_FileList->GetItemCount()>1) {
- popup->AppendSeparator();
- popup->Append(ID_PL_SORT_TITLE, wxT("Sort By Title"));
- popup->Append(ID_PL_SORT_FILE, wxT("Sort By File Name"));
- popup->Append(ID_PL_SORT_DUR, wxT("Sort By Duration"));
- popup->AppendSeparator();
- popup->Append(ID_PL_REVERSE, wxT("Reverse List"));
- popup->Append(ID_PL_RANDOMIZE, wxT("Randomize"));
- }
-
- PopupMenu(popup, event.GetPoint());
- delete popup;
-}
-
-void wxPlaylist::OnReverseSelection(wxCommandEvent &WXUNUSED(event) )
-{
- u32 i;
- long item = -1;
- for (;;) {
- item = m_FileList->GetNextItem(item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
- if (item == -1) break;
- PLEntry *ple = (PLEntry *) m_FileList->GetItemData(item);
- ple->m_bIsSelected = 1;
- }
- for (i=0; i<gf_list_count(m_entries); i++) {
- PLEntry *ple = (PLEntry *) gf_list_get(m_entries, i);
- ple->m_bIsSelected = !ple->m_bIsSelected;
- }
- RefreshList();
-}
-
-void wxPlaylist::OnReverseList(wxCommandEvent &WXUNUSED(event) )
-{
- u32 count = gf_list_count(m_entries);
- u32 hcount = count / 2;
- count--;
- for (u32 i=0; i<hcount; i++) {
- PLEntry *ple1 = (PLEntry *) gf_list_get(m_entries, i);
- PLEntry *ple2 = (PLEntry *) gf_list_get(m_entries, count-i);
- gf_list_rem(m_entries, i);
- gf_list_insert(m_entries, ple2, i);
- gf_list_rem(m_entries, count-i);
- gf_list_insert(m_entries, ple1, count-i);
- }
- RefreshList();
-}
-
-void wxPlaylist::OnRandomize(wxCommandEvent &WXUNUSED(event) )
-{
- GF_List *new_entries = gf_list_new();
-
- gf_rand_init(0);
-
- while (gf_list_count(m_entries)>1) {
- u32 pos = gf_rand() % (gf_list_count(m_entries)-1);
- PLEntry *ple = (PLEntry *)gf_list_get(m_entries, pos);
- gf_list_rem(m_entries, pos);
- gf_list_add(new_entries, ple);
- }
- PLEntry *ple = (PLEntry *)gf_list_get(m_entries, 0);
- gf_list_rem(m_entries, 0);
- gf_list_add(new_entries, ple);
-
- gf_list_del(m_entries);
- m_entries = new_entries;
- m_cur_entry = -1;
- RefreshList();
-}
-
-void wxPlaylist::Sort(u32 type)
-{
- u32 i, j, smallest;
-
- for (i=0; i<gf_list_count(m_entries)-1; i++) {
- smallest = i;
- for (j=i+1; j<gf_list_count(m_entries); j++) {
- PLEntry *ple2 = (PLEntry *) gf_list_get(m_entries, smallest);
- PLEntry *ple1 = (PLEntry *) gf_list_get(m_entries, j);
- s32 test = 0;
- switch (type) {
- case 0:
- test = stricmp(ple1->m_url, ple2->m_url);
- break;
- case 1:
- test = stricmp(ple1->m_disp_name, ple2->m_disp_name);
- break;
- case 2:
- test = ple1->m_duration - ple2->m_duration;
- break;
- }
- if (test<0) smallest = j;
- }
- PLEntry *ple = (PLEntry *)gf_list_get(m_entries, smallest);
- gf_list_rem(m_entries, smallest);
- gf_list_insert(m_entries, ple, i);
- }
- m_cur_entry = -1;
- RefreshList();
-}
-
-void wxPlaylist::OnSortFile(wxCommandEvent &WXUNUSED(event) ) { Sort(0); }
-void wxPlaylist::OnSortTitle(wxCommandEvent &WXUNUSED(event) ) { Sort(1); }
-void wxPlaylist::OnSortDuration(wxCommandEvent &WXUNUSED(event) ) { Sort(2); }
-
-void wxPlaylist::RefreshCurrent()
-{
- PLEntry *ple;
- if (m_cur_entry<0) return;
- ple = (PLEntry *) gf_list_get(m_entries, m_cur_entry);
- if (ple && ple->m_bIsPlaying) {
- ple->m_bIsPlaying = 0;
- UpdateEntry(m_cur_entry);
- }
-}
-
-Bool wxPlaylist::HasValidEntries()
-{
- u32 nb_dead = 0;
- if (m_all_dead_entries==-1) {
- for (u32 i=0; i<gf_list_count(m_entries); i++) {
- PLEntry *ple = (PLEntry *) gf_list_get(m_entries, i);
- ple->m_bIsPlaying = 0;
- if (ple->m_bIsDead) nb_dead ++;
- }
- m_all_dead_entries = (nb_dead==gf_list_count(m_entries)) ? 1 : 0;
- }
- return !m_all_dead_entries;
-}
-
-void wxPlaylist::Play()
-{
- PLEntry *ple;
-
- if (!HasValidEntries()) return;
-
- RefreshCurrent();
-
- if (m_cur_entry >= (s32)gf_list_count(m_entries)) {
- if (!m_pApp->m_loop) return;
- m_cur_entry = 0;
- }
-
- ple = (PLEntry *) gf_list_get(m_entries, m_cur_entry);
- if (!ple || ple->m_bIsDead) {
- m_cur_entry++;
- Play();
- } else {
- char szPLE[20];
- ple->m_bIsPlaying = 1;
- UpdateEntry(m_cur_entry);
- sprintf(szPLE, "%d", m_cur_entry);
- gf_cfg_set_key(m_pApp->m_user.config, "General", "PLEntry", szPLE);
- m_pApp->DoConnect();
- }
-}
-
-void wxPlaylist::OnItemActivate(wxListEvent &WXUNUSED(event) )
-{
- long item = m_FileList->GetNextItem(-1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
- if (item==-1) return;
- RefreshCurrent();
- m_cur_entry = item;
- Play();
-}
-
-
-void wxPlaylist::OnPlay(wxCommandEvent &WXUNUSED(event))
-{
- long item = m_FileList->GetNextItem(-1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
- if (item==-1) return;
-
- RefreshCurrent();
- m_cur_entry = item;
- Play();
-}
-
-void wxPlaylist::Truncate()
-{
- if (m_cur_entry<0) return;
- while ((u32) m_cur_entry+1 < gf_list_count(m_entries)) {
- PLEntry *ple = (PLEntry *) gf_list_get(m_entries, m_cur_entry+1);
- gf_list_rem(m_entries, m_cur_entry+1);
- delete ple;
- }
- RefreshList();
-}
-
-void wxPlaylist::QueueURL(wxString filename)
-{
- char *ext = (char*)strrchr(filename.mb_str(wxConvUTF8), '.');
- if (ext && (!stricmp(ext, ".m3u") || !stricmp(ext, ".pls")) ) {
- OpenPlaylist(filename);
- } else {
- PLEntry *ple = new PLEntry(filename);
- gf_list_add(m_entries, ple);
- }
-}
-
-void wxPlaylist::PlayNext()
-{
- RefreshCurrent();
- if (1+m_cur_entry < (s32)gf_list_count(m_entries)) {
- m_cur_entry++;
- Play();
- }
-}
-
-void wxPlaylist::PlayPrev()
-{
- RefreshCurrent();
- if (m_cur_entry>0) {
- m_cur_entry--;
- Play();
- }
-}
-
-void wxPlaylist::SetDead()
-{
- PLEntry *ple = (PLEntry *) gf_list_get(m_entries, m_cur_entry);
- if (ple) {
- ple->m_bIsDead = 1;
- UpdateEntry(m_cur_entry);
- if (ple->m_bIsPlaying) PlayNext();
- m_all_dead_entries = -1;
- }
-}
-void wxPlaylist::SetDuration(u32 duration)
-{
- PLEntry *ple = (PLEntry *) gf_list_get(m_entries, m_cur_entry);
- if (ple) {
- ple->m_duration = duration;
- UpdateEntry(m_cur_entry);
- }
-}
-
-wxString wxPlaylist::GetDisplayName()
-{
- if (m_cur_entry>=0) {
- PLEntry *ple = (PLEntry *) gf_list_get(m_entries, m_cur_entry);
- if (ple) return wxString(wxString(ple->m_disp_name, wxConvUTF8) );
- }
- return wxT("");
-}
-
-wxString wxPlaylist::GetURL()
-{
- PLEntry *ple = (PLEntry *) gf_list_get(m_entries, m_cur_entry);
- if (ple) return wxString(ple->m_url, wxConvUTF8);
- return wxT("");
-}
-
+++ /dev/null
-/*
- * GPAC - Multimedia Framework C SDK
- *
- * Copyright (c) Jean Le Feuvre 2000-2005
- * All rights reserved
- *
- * This file is part of GPAC / Osmo4 wxWidgets GUI
- *
- * GPAC is free software; you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation; either version 2, or (at your option)
- * any later version.
- *
- * GPAC is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; see the file COPYING. If not, write to
- * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
- *
- *
- */
-
-#ifndef _PLAYLIST_H
-#define _PLAYLIST_H
-
-#include "wx/wxprec.h"
-
-#ifndef WX_PRECOMP
- #include "wx/wx.h"
-#endif
-
-#include "menubtn.h"
-
-enum
-{
- ID_FILE_LIST = 1000,
-};
-
-class wxOsmo4Frame;
-
-class PLEntry
-{
-public:
- PLEntry(wxString url);
- ~PLEntry();
-
- char *m_url;
- char *m_disp_name;
- u32 m_duration;
-
- Bool m_bIsSelected;
- Bool m_bIsDead;
- Bool m_bIsPlaying;
-};
-
-
-class wxPlaylist : public wxFrame
-{
-public:
- wxPlaylist(wxWindow *parent);
- virtual ~wxPlaylist();
-
- void Clear();
- void ClearButPlaying();
- void RefreshList();
-
- void Truncate();
- void QueueURL(wxString filename);
- void Play();
- void PlayNext();
- void PlayPrev();
- void SetDead();
- void SetDuration(u32 duration);
- Bool HasValidEntries();
- void OpenPlaylist(wxString fileName);
-
- /*for current entry played*/
- wxString GetDisplayName();
- wxString GetURL();
-
- s32 m_cur_entry;
- GF_List *m_entries;
-
- wxOsmo4Frame *m_pApp;
-
-private:
- DECLARE_EVENT_TABLE()
-
- void OnClose(wxCloseEvent &event);
- void OnSize(wxSizeEvent &event);
- void OnAddFile(wxCommandEvent &event);
- void OnAddURL(wxCommandEvent &event);
- void OnAddDir(wxCommandEvent &event);
- void OnAddDirRec(wxCommandEvent &event);
- void OnRemFile(wxCommandEvent &event);
- void OnRemAll(wxCommandEvent &event);
- void OnRemDead(wxCommandEvent &event);
- void OnSelUp(wxCommandEvent &event);
- void OnSelDown(wxCommandEvent &event);
- void OnSave(wxCommandEvent &event);
- void OnOpen(wxCommandEvent &event);
- void OnRightClick(wxListEvent & event);
- void OnReverseSelection(wxCommandEvent &event);
- void OnReverseList(wxCommandEvent &event);
- void OnRandomize(wxCommandEvent &event);
- void OnSortFile(wxCommandEvent &event);
- void OnSortTitle(wxCommandEvent &event);
- void OnSortDuration(wxCommandEvent &event);
- void OnItemActivate(wxListEvent &event);
- void OnPlay(wxCommandEvent &event);
-
-
- void Sort(u32 type);
- void UpdateEntry(u32 idx);
- void RefreshCurrent();
- void Save(char *szPath, Bool save_m3u);
-
- wxBitmap *m_pOpen, *m_pSave, *m_pAdd, *m_pRem, *m_pUp, *m_pDown, *m_pSort;
- wxMenuButton *m_pAddBut, *m_pRemBut, *m_pSortBut;
- wxToolBar *m_pToolBar;
- wxListCtrl *m_FileList;
- char szCacheDir[GF_MAX_PATH];
- s32 m_all_dead_entries;
-
- void AddDir(Bool do_recurse);
-};
-
-
-
-#endif
-
+++ /dev/null
-/*
- * GPAC - Multimedia Framework C SDK
- *
- * Copyright (c) Jean Le Feuvre 2000-2005
- * All rights reserved
- *
- * This file is part of GPAC / Osmo4 wxWidgets GUI
- *
- * GPAC is free software; you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation; either version 2, or (at your option)
- * any later version.
- *
- * GPAC is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; see the file COPYING. If not, write to
- * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
- *
- *
- */
-
-#include "fileprops.h"
-#include "wxOsmo4.h"
-#include "Playlist.h"
-#include <wx/filename.h>
-#include <gpac/modules/codec.h>
-#include <gpac/modules/service.h>
-#include <gpac/constants.h>
-/*ISO 639 languages*/
-#include <gpac/iso639.h>
-
-
-wxFileProps::wxFileProps(wxWindow *parent)
- : wxDialog(parent, -1, wxString(_T("File Properties")))
-{
-
- m_pApp = (wxOsmo4Frame *)parent;
- SetSize(540, 260);
- assert(m_pApp->m_pPlayList);
-
- m_pTreeView = new wxTreeCtrl(this, ID_TREE_VIEW, wxPoint(4, 2), wxSize(200, 180), wxTR_DEFAULT_STYLE | wxSUNKEN_BORDER);
-
- new wxStaticText(this, 0, _T("Information"), wxPoint(210, 2), wxSize(60, 20));
- m_pViewSel = new wxComboBox(this, ID_VIEW_SEL, _T(""), wxPoint(280, 2), wxSize(120, 24), 0, NULL, wxCB_READONLY);
- m_pViewSel->Append(wxT("General"));
- m_pViewSel->Append(wxT("Streams"));
- m_pViewSel->Append(wxT("Playback"));
- m_pViewSel->Append(wxT("Network"));
- m_pViewSel->SetSelection(0);
-
- m_pViewInfo = new wxTextCtrl(this, -1, wxT(""), wxPoint(210, 30), wxSize(320, 200), wxTE_MULTILINE | wxTE_READONLY | wxHSCROLL | wxSUNKEN_BORDER);
-
-#ifdef WIN32
- m_pViewInfo->SetBackgroundColour(wxColour(wxT("LIGHT GREY")));
-#endif
-
- m_pViewWI = new wxButton(this, ID_VIEW_WI, wxT("View World Info"), wxPoint(4, 174), wxSize(200, 40));
- m_pViewSG = new wxButton(this, ID_VIEW_SG, wxT("View Scene Graph"), wxPoint(4, 220), wxSize(200, 40));
-
-
- wxString str = m_pApp->m_pPlayList->GetDisplayName();
- str += wxT(" Properties");
- SetTitle(str);
-
- m_pTimer = new wxTimer();
- m_pTimer->SetOwner(this, ID_OD_TIMER);
- m_pTimer->Start(500, 0);
- RewriteODTree();
-
-}
-
-wxFileProps::~wxFileProps()
-{
- m_pTimer->Stop();
- delete m_pTimer;
-}
-
-
-BEGIN_EVENT_TABLE(wxFileProps, wxDialog)
- EVT_TREE_ITEM_ACTIVATED(ID_TREE_VIEW, wxFileProps::OnSetSelection)
- EVT_TREE_SEL_CHANGED(ID_TREE_VIEW, wxFileProps::OnSetSelection)
- EVT_TREE_ITEM_EXPANDED(ID_TREE_VIEW, wxFileProps::OnSetSelection)
- EVT_TREE_ITEM_COLLAPSED(ID_TREE_VIEW, wxFileProps::OnSetSelection)
- EVT_TIMER(ID_OD_TIMER, wxFileProps::OnTimer)
- EVT_BUTTON(ID_VIEW_SG, wxFileProps::OnViewSG)
- EVT_BUTTON(ID_VIEW_WI, wxFileProps::OnViewWorld)
- EVT_COMBOBOX(ID_VIEW_SEL, wxFileProps::OnSelectInfo)
-END_EVENT_TABLE()
-
-void wxFileProps::RewriteODTree()
-{
- GF_ObjectManager *root_odm = gf_term_get_root_object(m_pApp->m_term);
- if (!root_odm) return;
-
- m_pTreeView->DeleteAllItems();
- ODTreeData *root = new ODTreeData(root_odm);
- m_pTreeView->AddRoot(wxT("Root OD"), -1, -1, root);
- wxTreeItemId rootId = m_pTreeView->GetRootItem();
-
- WriteInlineTree(root);
- SetInfo(root_odm);
-}
-
-void wxFileProps::WriteInlineTree(ODTreeData *root)
-{
- /*browse all ODs*/
- u32 count = gf_term_get_object_count(m_pApp->m_term, root->m_pODMan);
-
- for (u32 i=0; i<count; i++) {
- GF_ObjectManager *odm = gf_term_get_object(m_pApp->m_term, root->m_pODMan, i);
- if (!odm) return;
- ODTreeData *odd = new ODTreeData(odm);
- m_pTreeView->AppendItem(root->GetId(), wxT("Object Descriptor"), -1, -1, odd);
-
- /*if inline propagate*/
- switch (gf_term_object_subscene_type(m_pApp->m_term, odm)) {
- case 1:
- m_pTreeView->SetItemText(odd->GetId(), wxT("Root Scene"));
- WriteInlineTree(odd);
- break;
- case 2:
- m_pTreeView->SetItemText(odd->GetId(), wxT("Inline Scene"));
- WriteInlineTree(odd);
- break;
- case 3:
- m_pTreeView->SetItemText(odd->GetId(), wxT("Extern Proto Lib"));
- break;
- default:
- break;
- }
- }
-}
-
-void wxFileProps::OnSetSelection(wxTreeEvent& event)
-{
- ODTreeData *odd = (ODTreeData *) m_pTreeView->GetItemData(event.GetItem());
- SetInfo(odd->m_pODMan);
-}
-
-void wxFileProps::SetInfo(GF_ObjectManager *odm)
-{
- m_current_odm = odm;
-
- switch (m_pViewSel->GetSelection()) {
- case 3: SetNetworkInfo(); break;
- case 2: SetDecoderInfo(); break;
- case 1: SetStreamsInfo(); break;
- default: SetGeneralInfo(); break;
- }
-}
-
-void wxFileProps::OnTimer(wxTimerEvent& WXUNUSED(event))
-{
- switch (m_pViewSel->GetSelection()) {
- case 2: SetDecoderInfo(); break;
- }
-}
-void wxFileProps::OnSelectInfo(wxCommandEvent & WXUNUSED(event) )
-{
- SetInfo(m_current_odm);
-}
-
-void wxFileProps::SetGeneralInfo()
-{
- wxString info;
- GF_MediaInfo odi;
- u32 h, m, s;
- u32 i, j;
-
- info = wxT("");
- m_pViewInfo->Clear();
- m_pViewInfo->AppendText(info);
-
- if (!m_current_odm || gf_term_get_object_info(m_pApp->m_term, m_current_odm, &odi) != GF_OK) return;
-
- if (odi.has_profiles) info += wxT("Initial ");
- info += wxString::Format(wxT("Object Descriptor ID %d\n"), odi.od->objectDescriptorID);
- if (odi.duration) {
- h = (u32) (odi.duration / 3600);
- m = (u32) (odi.duration / 60) - h*60;
- s = (u32) (odi.duration) - h*3600 - m*60;
- info += wxString::Format(wxT("Duration %02d:%02d:%02d\n"), h, m, s);
- } else {
- info += wxT("Unknown duration\n");
- }
-
- if (odi.owns_service) {
- info += wxT("Service Handler: ") + wxString(odi.service_handler, wxConvUTF8) + wxT("\n");
- info += wxT("Service URL: ") + wxString(odi.service_url, wxConvUTF8) + wxT("\n");
- }
-
- if (odi.od->URLString) {
- info += wxT("Remote OD - URL: ") + wxString(odi.od->URLString, wxConvUTF8) + wxT("\n");
- }
-
- if (odi.codec_name) {
- switch (odi.od_type) {
- case GF_STREAM_VISUAL:
- info += wxString::Format(wxT("Video Object: Width %d - Height %d\n"), odi.width, odi.height);
- info += wxT("Media Codec ") + wxString(odi.codec_name, wxConvUTF8) + wxT("\n");
- break;
- case GF_STREAM_AUDIO:
- info += wxString::Format(wxT("Audio Object: Sample Rate %d - %d channels\n"), odi.sample_rate, odi.num_channels);
- info += wxT("Media Codec ") + wxString(odi.codec_name, wxConvUTF8) + wxT("\n");
- break;
- case GF_STREAM_PRIVATE_SCENE:
- case GF_STREAM_SCENE:
- if (odi.width && odi.height) {
- info += wxString::Format(wxT("Scene Description: Width %d - Height %d\n"), odi.width, odi.height);
- } else {
- info += wxT("Scene Description: No size specified\n");
- }
- info += wxT("Scene Codec ") + wxString(odi.codec_name, wxConvUTF8) + wxT("\n");
- break;
- case GF_STREAM_TEXT:
- if (odi.width && odi.height) {
- info += wxString::Format(wxT("Text Object: Width %d - Height %d\n"), odi.width, odi.height);
- } else {
- info += wxString::Format(wxT("Text Object: No size specified\n"));
- }
- info += wxT("Text Codec ") + wxString(odi.codec_name, wxConvUTF8) + wxT("\n");
- break;
- }
- }
- if (odi.protection==2) info += wxT("Encrypted Media NOT UNLOCKED");
- else if (odi.protection==1) info += wxT("Encrypted Media");
-
- if (!gf_list_count(odi.od->OCIDescriptors)) {
- m_pViewInfo->Clear();
- m_pViewInfo->AppendText(info);
- return;
- }
-
- info += wxT("\nObject Content Information:\n");
-
- /*check OCI (not everything interests us) - FIXME: support for unicode*/
- for (i=0; i<gf_list_count(odi.od->OCIDescriptors); i++) {
- GF_Descriptor *desc = (GF_Descriptor *) gf_list_get(odi.od->OCIDescriptors, i);
- switch (desc->tag) {
- case GF_ODF_SEGMENT_TAG:
- {
- GF_Segment *sd = (GF_Segment *) desc;
- info += wxT("\nSegment Descriptor:\nName: ") + wxString((char *) sd->SegmentName, wxConvUTF8);
- info += wxString::Format(wxT(" - start time %g sec - duration %g sec\n"), sd->startTime, sd->Duration);
- }
- break;
- case GF_ODF_CC_NAME_TAG:
- {
- GF_CC_Name *ccn = (GF_CC_Name *)desc;
- info += wxT("\nContent Creators:\n");
- for (j=0; j<gf_list_count(ccn->ContentCreators); j++) {
- GF_ContentCreatorInfo *ci = (GF_ContentCreatorInfo *) gf_list_get(ccn->ContentCreators, j);
- if (!ci->isUTF8) continue;
- info += wxT("\t") + wxString(ci->contentCreatorName, wxConvUTF8) + wxT("\n");
- }
- }
- break;
-
- case GF_ODF_SHORT_TEXT_TAG:
- {
- GF_ShortTextual *std = (GF_ShortTextual *)desc;
- info += wxT("\n") + wxString(std->eventName, wxConvUTF8) + wxT(": ") + wxString(std->eventText, wxConvUTF8) + wxT("\n");
- }
- break;
- /*todo*/
- case GF_ODF_CC_DATE_TAG:
- break;
- default:
- break;
- }
-
- }
-
- m_pViewInfo->Clear();
- m_pViewInfo->AppendText(info);
-}
-
-void wxFileProps::SetStreamsInfo()
-{
- u32 i, count;
- wxString info;
- GF_MediaInfo odi;
- char code[5];
-
- info = wxT("");
- m_pViewInfo->Clear();
- m_pViewInfo->AppendText(info);
-
- if (!m_current_odm || gf_term_get_object_info(m_pApp->m_term, m_current_odm, &odi) != GF_OK) return;
-
- if (odi.has_profiles) {
- info += wxString::Format(wxT("\tOD Profile@Level %d\n"), odi.OD_pl);
- info += wxString::Format(wxT("\tScene Profile@Level %d\n"), odi.scene_pl);
- info += wxString::Format(wxT("\tGraphics Profile@Level %d\n"), odi.graphics_pl);
- info += wxString::Format(wxT("\tAudio Profile@Level %d\n"), odi.audio_pl);
- info += wxString::Format(wxT("\tVisual Profile@Level %d\n"), odi.scene_pl);
- if (odi.inline_pl) info += wxT("\tInline Content use same profiles\n");
- info += wxT("\n");
- }
-
- count = gf_list_count(odi.od->ESDescriptors);
-
- for (i=0; i<count; i++) {
- GF_ESD *esd = (GF_ESD *) gf_list_get(odi.od->ESDescriptors, i);
-
- info += wxString::Format(wxT("Stream ID %d - Clock ID %d\n"), esd->ESID, esd->OCRESID);
- if (esd->dependsOnESID) {
- info += wxString::Format(wxT("\tDepends on Stream ID %d for decoding\n"), esd->dependsOnESID);
- }
- switch (esd->decoderConfig->streamType) {
- case GF_STREAM_OD:
- info += wxString::Format(wxT("\tOD Stream - version %d\n"), esd->decoderConfig->objectTypeIndication);
- break;
- case GF_STREAM_OCR:
- info += wxT("\tObject Clock Reference Stream\n");
- break;
- case GF_STREAM_SCENE:
- info += wxString::Format(wxT("\tScene Description Stream - version %d\n"), esd->decoderConfig->objectTypeIndication);
- break;
- case GF_STREAM_PRIVATE_SCENE:
- info += wxString::Format(wxT("\tGPAC Private Scene Description Stream\n"));
- break;
- case GF_STREAM_VISUAL:
- info += wxT("\tVisual Stream - media type: ");
- switch (esd->decoderConfig->objectTypeIndication) {
- case GPAC_OTI_VIDEO_MPEG4_PART2: info += wxT("MPEG-4\n"); break;
- case GPAC_OTI_VIDEO_MPEG2_SIMPLE: info += wxT("MPEG-2 Simple Profile\n"); break;
- case GPAC_OTI_VIDEO_MPEG2_MAIN: info += wxT("MPEG-2 Main Profile\n"); break;
- case GPAC_OTI_VIDEO_MPEG2_SNR: info += wxT("MPEG-2 SNR Profile\n"); break;
- case GPAC_OTI_VIDEO_MPEG2_SPATIAL: info += wxT("MPEG-2 Spatial Profile\n"); break;
- case GPAC_OTI_VIDEO_MPEG2_HIGH: info += wxT("MPEG-2 High Profile\n"); break;
- case GPAC_OTI_VIDEO_MPEG2_422: info += wxT("MPEG-2 422 Profile\n"); break;
- case GPAC_OTI_VIDEO_MPEG1: info += wxT("MPEG-1\n"); break;
- case GPAC_OTI_IMAGE_JPEG: info += wxT("JPEG\n"); break;
- case GPAC_OTI_IMAGE_PNG: info += wxT("PNG\n"); break;
- case GPAC_OTI_IMAGE_JPEG_2000: info += wxT("JPEG2000\n"); break;
- case 0x80:
- memcpy(code, esd->decoderConfig->decoderSpecificInfo->data, 4);
- code[4] = 0;
- info += wxT("GPAC Intern (") + wxString(code, wxConvUTF8) + wxT(")\n");
- break;
- default:
- info += wxString::Format(wxT("Private/Unknown Type (0x%x)\n"), esd->decoderConfig->objectTypeIndication);
- break;
- }
- break;
-
- case GF_STREAM_AUDIO:
- info += wxT("\tAudio Stream - media type: ");
- switch (esd->decoderConfig->objectTypeIndication) {
- case GPAC_OTI_AUDIO_AAC_MPEG4: info += wxT("MPEG-4\n"); break;
- case GPAC_OTI_AUDIO_AAC_MPEG2_MP: info += wxT("MPEG-2 AAC Main Profile\n"); break;
- case GPAC_OTI_AUDIO_AAC_MPEG2_LCP: info += wxT("MPEG-2 AAC LowComplexity Profile\n"); break;
- case GPAC_OTI_AUDIO_AAC_MPEG2_SSRP: info += wxT("MPEG-2 AAC Scalable Sampling Rate Profile\n"); break;
- case GPAC_OTI_AUDIO_MPEG2_PART3: info += wxT("MPEG-2 Audio\n"); break;
- case GPAC_OTI_AUDIO_MPEG1: info += wxT("MPEG-1 Audio\n"); break;
- case 0xA0: info += wxT("EVRC Audio\n"); break;
- case 0xA1: info += wxT("SMV Audio\n"); break;
- case 0xE1: info += wxT("QCELP Audio\n"); break;
- case 0x80:
- memcpy(code, esd->decoderConfig->decoderSpecificInfo->data, 4);
- code[4] = 0;
- info += wxT("GPAC Intern (") + wxString(code, wxConvUTF8) + wxT(")\n");
- break;
- default:
- info += wxString::Format(wxT("Private/Unknown Type (0x%x)\n"), esd->decoderConfig->objectTypeIndication);
- break;
- }
- break;
- case GF_STREAM_MPEG7:
- info += wxString::Format(wxT("\tMPEG-7 Stream - version %d\n"), esd->decoderConfig->objectTypeIndication);
- break;
- case GF_STREAM_IPMP:
- info += wxString::Format(wxT("\tIPMP Stream - version %d\n"), esd->decoderConfig->objectTypeIndication);
- break;
- case GF_STREAM_OCI:
- info += wxString::Format(wxT("\tOCI Stream - version %d\n"), esd->decoderConfig->objectTypeIndication);
- break;
- case GF_STREAM_MPEGJ:
- info += wxString::Format(wxT("\tMPEGJ Stream - version %d\n"), esd->decoderConfig->objectTypeIndication);
- break;
- case GF_STREAM_INTERACT:
- info += wxString::Format(wxT("\tUser Interaction Stream - version %d\n"), esd->decoderConfig->objectTypeIndication);
- break;
- default:
- info += wxT("Private/Unknown\n");
- break;
- }
-
- info += wxString::Format(wxT("\tBuffer Size %d\n\tAverage Bitrate %d bps\n\tMaximum Bitrate %d bps\n"), esd->decoderConfig->bufferSizeDB, esd->decoderConfig->avgBitrate, esd->decoderConfig->maxBitrate);
- if (esd->slConfig->predefined==SLPredef_SkipSL) {
- info += wxString::Format(wxT("\tNot using MPEG-4 Synchronization Layer\n"));
- } else {
- info += wxString::Format(wxT("\tStream Clock Resolution %d\n"), esd->slConfig->timestampResolution);
- }
- if (esd->URLString)
- info += wxT("\tStream Location: ") + wxString(esd->URLString, wxConvUTF8) + wxT("\n");
-
- /*check language*/
- if (esd->langDesc) {
- u32 i=0;
- char lan[4], *szLang;
- lan[0] = esd->langDesc->langCode>>16;
- lan[1] = (esd->langDesc->langCode>>8)&0xFF;
- lan[2] = (esd->langDesc->langCode)&0xFF;
- lan[3] = 0;
-
- if ((lan[0]=='u') && (lan[1]=='n') && (lan[2]=='d')) szLang = (char*) "Undetermined";
- else {
- szLang = lan;
- while (GF_ISO639_Lang[i]) {
- if (GF_ISO639_Lang[i+2][0] && strstr(GF_ISO639_Lang[i+1], lan)) {
- szLang = (char*) GF_ISO639_Lang[i];
- break;
- }
- i+=3;
- }
- }
- info += wxString::Format(wxT("\tStream Language: %s\n"), szLang);
- }
-
- }
- m_pViewInfo->Clear();
- m_pViewInfo->AppendText(info);
-}
-
-
-void wxFileProps::SetDecoderInfo()
-{
- GF_MediaInfo odi;
- wxString info;
- u32 h, m, s;
-
- if (!m_current_odm || gf_term_get_object_info(m_pApp->m_term, m_current_odm, &odi)) {
- m_pViewInfo->Clear();
- m_pViewInfo->AppendText(info);
- return;
- }
-
- info = wxT("Status: ");
- switch (odi.status) {
- case 0:
- case 1:
- case 2:
- h = (u32) (odi.current_time / 3600);
- m = (u32) (odi.current_time / 60) - h*60;
- s = (u32) (odi.current_time) - h*3600 - m*60;
- if (odi.status==0) info += wxT("Stopped");
- else if (odi.status==1) info += wxT("Playing");
- else info += wxT("Paused");
- info += wxString::Format(wxT("\nObject Time: %02d:%02d:%02d\n"), h, m, s);
- break;
- case 3:
- info += wxT("Not Setup\n");
- m_pViewInfo->Clear();
- m_pViewInfo->AppendText(info);
- return;
- default:
- info += wxT("Setup Failed\n");
- m_pViewInfo->Clear();
- m_pViewInfo->AppendText(info);
- return;
- }
- /*get clock drift*/
- info += wxString::Format(wxT("Clock drift: %d ms\n"), odi.clock_drift);
- /*get buffering*/
- if (odi.buffer>=0) info += wxString::Format(wxT("Buffering Time: %d ms\n"), odi.buffer);
- else if (odi.buffer==-1) info += wxT("Not buffering\n");
- else info += wxT("Not Playing\n");
-
- /*get DB occupation*/
- if (odi.buffer>=0) info += wxString::Format(wxT("Decoding Buffer: %d Access Units\n"), odi.db_unit_count);
- /*get CB occupation*/
- if (odi.cb_max_count)
- info += wxString::Format(wxT("Composition Memory: %d/%d Units\n"), odi.cb_unit_count, odi.cb_max_count);
-
- Float avg_dec_time = 0;
- if (odi.nb_dec_frames) {
- avg_dec_time = (Float) odi.total_dec_time;
- avg_dec_time /= odi.nb_dec_frames;
- }
- info += wxString::Format(wxT("Average Bitrate %d kbps (%d max)\nAverage Decoding Time %.2f ms (%d max)\nTotal decoded frames %d - %d dropped\n"),
- (u32) odi.avg_bitrate/1024, odi.max_bitrate/1024, avg_dec_time, odi.max_dec_time, odi.nb_dec_frames, odi.nb_droped);
-
- m_pViewInfo->Clear();
- m_pViewInfo->AppendText(info);
-}
-
-void wxFileProps::SetNetworkInfo()
-{
- wxString info;
- u32 id;
- NetStatCommand com;
- GF_MediaInfo odi;
- u32 d_enum;
- GF_Err e;
-
- info = wxT("");
- m_pViewInfo->Clear();
- m_pViewInfo->AppendText(wxT(""));
-
- if (!m_current_odm || gf_term_get_object_info(m_pApp->m_term, m_current_odm, &odi) != GF_OK) return;
-
- if (odi.owns_service) {
- const char *url, *path;
- u32 done, total, bps;
- info = wxT("Current Downloads in service:\n");
- d_enum = 0;
- while (gf_term_get_download_info(m_pApp->m_term, m_current_odm, &d_enum, &url, &path, &done, &total, &bps)) {
- info += wxString(url, wxConvUTF8);
- if (total) {
- info += wxString::Format(wxT(": %d / %d bytes (%.2f %%) - %.2f kBps\n"), done, total, (100.0*done)/total, ((Double)bps)/1024);
- } else {
- info += wxString::Format(wxT(": %.2f kBps\n"), ((Double)bps)/1024);
- }
- }
- if (!d_enum) info = wxT("No Downloads in service\n");
- info += wxT("\n");
- }
-
- d_enum = 0;
- while (gf_term_get_channel_net_info(m_pApp->m_term, m_current_odm, &d_enum, &id, &com, &e)) {
- if (e) continue;
- if (!com.bw_down && !com.bw_up) continue;
-
- info += wxString::Format(wxT("Stream ID %d statistics:\n"), id);
- if (com.multiplex_port) {
- info += wxString::Format(wxT("\tMultiplex Port %d - multiplex ID %d\n"), com.multiplex_port, com.port);
- } else {
- info += wxString::Format(wxT("\tPort %d\n"), com.port);
- }
- info += wxString::Format(wxT("\tPacket Loss Percentage: %.4f\n"), com.pck_loss_percentage);
- info += wxString::Format(wxT("\tDown Bandwidth: %.3f bps\n"), ((Float)com.bw_down)/1024);
- if (com.bw_up) info += wxString::Format(wxT("\tUp Bandwidth: %d bps\n"), com.bw_up);
- if (com.ctrl_port) {
- if (com.multiplex_port) {
- info += wxString::Format(wxT("\tControl Multiplex Port: %d - Control Multiplex ID %d\n"), com.multiplex_port, com.ctrl_port);
- } else {
- info += wxString::Format(wxT("\tControl Port: %d\n"), com.ctrl_port);
- }
- info += wxString::Format(wxT("\tControl Down Bandwidth: %d bps\n"), com.ctrl_bw_down);
- info += wxString::Format(wxT("\tControl Up Bandwidth: %d bps\n"), com.ctrl_bw_up);
- }
- info += wxT("\n");
- }
- m_pViewInfo->Clear();
- m_pViewInfo->AppendText(info);
-}
-
-
-void wxFileProps::OnViewWorld(wxCommandEvent &WXUNUSED(event))
-{
- wxString wit;
- const char *str;
- GF_List *descs;
- descs = gf_list_new();
- str = gf_term_get_world_info(m_pApp->m_term, m_current_odm, descs);
-
- if (!str) {
- wxMessageDialog(this, wxT("No World Info available"), wxT("Sorry!"), wxOK).ShowModal();
- return;
- }
-
- wit = wxT("");
- for (u32 i=0; gf_list_count(descs); i++) {
- const char *d = (const char *) gf_list_get(descs, i);
- wit += wxString(d, wxConvUTF8);
- wit += wxT("\n");
- }
- wxMessageDialog(this, wit, wxString(str, wxConvUTF8), wxOK).ShowModal();
- gf_list_del(descs);
-}
-
-void wxFileProps::OnViewSG(wxCommandEvent &WXUNUSED(event))
-{
- const char *sOpt;
- Bool dump_xmt;
- wxFileName out_file;
- char szOutFile[GF_MAX_PATH];
- wxString fname;
-
- sOpt = gf_cfg_get_key(m_pApp->m_user.config, "General", "CacheDirectory");
- out_file.AssignDir(wxString(sOpt, wxConvUTF8) );
-
- sOpt = gf_cfg_get_key(m_pApp->m_user.config, "General", "ViewXMT");
- out_file.SetFullName(wxT("scene_dump"));
- if (sOpt && !stricmp(sOpt, "yes")) {
- dump_xmt = 1;
- } else {
- dump_xmt = 0;
- }
- strcpy(szOutFile, out_file.GetFullName().mb_str(wxConvUTF8));
-
- GF_Err e = gf_term_dump_scene(m_pApp->m_term, szOutFile, NULL, dump_xmt, 0, m_current_odm);
- if (e) {
- wxMessageDialog dlg(this, wxString(gf_error_to_string(e), wxConvUTF8), wxT("Error while dumping"), wxOK);
- dlg.ShowModal();
- } else {
- wxString cmd = get_pref_browser(m_pApp->m_user.config);
- cmd += wxT(" ");
- cmd += wxString(szOutFile, wxConvUTF8);
- wxExecute(cmd);
- }
-}
+++ /dev/null
-/*
- * GPAC - Multimedia Framework C SDK
- *
- * Copyright (c) Jean Le Feuvre 2000-2005
- * All rights reserved
- *
- * This file is part of GPAC / Osmo4 wxWidgets GUI
- *
- * GPAC is free software; you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation; either version 2, or (at your option)
- * any later version.
- *
- * GPAC is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; see the file COPYING. If not, write to
- * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
- *
- *
- */
-
-#ifndef _FILEPROPS_H
-#define _FILEPROPS_H
-
-#include "wx/wxprec.h"
-
-#ifndef WX_PRECOMP
- #include "wx/wx.h"
-#endif
-
-#include <wx/treectrl.h>
-
-#include <gpac/terminal.h>
-
-/*abstract class for all items in the tree*/
-class ODTreeData : public wxTreeItemData
-{
-public:
- ODTreeData(GF_ObjectManager *odm) : wxTreeItemData(), m_pODMan(odm) {}
- GF_ObjectManager *m_pODMan;
-};
-
-
-class wxOsmo4Frame;
-class wxFileProps : public wxDialog
-{
-public:
- wxFileProps(wxWindow *parent);
- virtual ~wxFileProps();
-
-private:
- DECLARE_EVENT_TABLE()
-
- wxOsmo4Frame *m_pApp;
-
- wxTreeCtrl *m_pTreeView;
- wxTextCtrl *m_pViewInfo;
- wxComboBox *m_pViewSel;
- wxButton *m_pViewWI, *m_pViewSG;
- wxTimer *m_pTimer;
-
- GF_ObjectManager *m_current_odm;
-
- void RewriteODTree();
- void SetGeneralInfo();
- void SetStreamsInfo();
- void SetDecoderInfo();
- void SetNetworkInfo();
- void WriteInlineTree(ODTreeData *pRoot);
- void OnSetSelection(wxTreeEvent &event);
- void OnSelectInfo(wxCommandEvent &event);
- void OnTimer(wxTimerEvent &event);
- void OnViewWorld(wxCommandEvent &event);
- void OnViewSG(wxCommandEvent &event);
- void SetInfo(GF_ObjectManager *odm);
-};
-
-#endif
-
+++ /dev/null
-/////////////////////////////////////////////////////////////////////////////
-// Name: wxMenuButton
-// Purpose: A button with a dropdown wxMenu
-// Author: John Labenski
-// Modified by:
-// Created: 11/05/2002
-// RCS-ID:
-// Copyright: (c) John Labenki
-// Licence: wxWidgets licence
-/////////////////////////////////////////////////////////////////////////////
-
-#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
- #pragma implementation "menubtn.h"
-#endif
-
-// For compilers that support precompilation, includes "wx/wx.h".
-#include "wx/wxprec.h"
-
-#ifdef __BORLANDC__
- #pragma hdrstop
-#endif
-
-#ifndef WX_PRECOMP
- #include "wx/control.h"
- #include "wx/menu.h"
- #include "wx/settings.h"
- #include "wx/bitmap.h"
- #include "wx/pen.h"
- #include "wx/dc.h"
-#endif // WX_PRECOMP
-
-#include <wx/tglbtn.h>
-#include <wx/dcclient.h>
-#include <wx/timer.h>
-#include <wx/image.h>
-
-#include "menubtn.h"
-
-
-
-// ==========================================================================
-// wxCustomButton
-// ==========================================================================
-IMPLEMENT_DYNAMIC_CLASS( wxCustomButton, wxControl )
-
-BEGIN_EVENT_TABLE(wxCustomButton,wxControl)
- EVT_MOUSE_EVENTS ( wxCustomButton::OnMouseEvents )
- EVT_PAINT ( wxCustomButton::OnPaint )
- EVT_SIZE ( wxCustomButton::OnSize )
-END_EVENT_TABLE()
-
-wxCustomButton::~wxCustomButton()
-{
- if (HasCapture()) ReleaseMouse();
- if (m_timer) delete m_timer;
-}
-
-void wxCustomButton::Init()
-{
- m_focused = FALSE;
- m_labelMargin = wxSize(4,4);
- m_bitmapMargin = wxSize(2,2);
- m_down = 0;
- m_timer = NULL;
- m_eventType = 0;
- m_button_style = wxCUSTBUT_TOGGLE|wxCUSTBUT_BOTTOM;
-}
-
-bool wxCustomButton::Create(wxWindow* parent, wxWindowID id,
- const wxString& label, const wxBitmap &bitmap,
- const wxPoint& pos, const wxSize& size,
- long style, const wxValidator& val,
- const wxString& name)
-{
- if (!wxControl::Create(parent,id,pos,size,wxNO_BORDER|wxCLIP_CHILDREN,val,name))
- return FALSE;
-
- wxControl::SetLabel(label);
- wxControl::SetBackgroundColour(parent->GetBackgroundColour());
- wxControl::SetForegroundColour(parent->GetForegroundColour());
- wxControl::SetFont(parent->GetFont());
-
- if (bitmap.Ok()) m_bmpLabel = bitmap;
-
- if (!SetButtonStyle(style)) return FALSE;
-
- wxSize bestSize = DoGetBestSize();
- SetSize(wxSize(size.x<0 ? bestSize.x:size.x, size.y<0 ? bestSize.y:size.y));
-#if (wxMINOR_VERSION<8)
- SetBestSize(GetSize());
-#else
- SetInitialSize(GetSize());
-#endif
-
- CalcLayout(TRUE);
- return TRUE;
-}
-
-void wxCustomButton::SetValue(bool depressed)
-{
- wxCHECK_RET(!(m_button_style & wxCUSTBUT_NOTOGGLE), wxT("can't set button state"));
- m_down = depressed ? 1 : 0;
- Refresh(FALSE);
-}
-
-bool wxCustomButton::SetButtonStyle(long style)
-{
- int n_styles = 0;
- if ((style & wxCUSTBUT_LEFT) != 0) n_styles++;
- if ((style & wxCUSTBUT_RIGHT) != 0) n_styles++;
- if ((style & wxCUSTBUT_TOP) != 0) n_styles++;
- if ((style & wxCUSTBUT_BOTTOM) != 0) n_styles++;
- wxCHECK_MSG(n_styles < 2, FALSE, wxT("Only one wxCustomButton label position allowed"));
-
- n_styles = 0;
- if ((style & wxCUSTBUT_NOTOGGLE) != 0) n_styles++;
- if ((style & wxCUSTBUT_BUTTON) != 0) n_styles++;
- if ((style & wxCUSTBUT_TOGGLE) != 0) n_styles++;
- if ((style & wxCUSTBUT_BUT_DCLICK_TOG) != 0) n_styles++;
- if ((style & wxCUSTBUT_TOG_DCLICK_BUT) != 0) n_styles++;
- wxCHECK_MSG(n_styles < 2, FALSE, wxT("Only one wxCustomButton style allowed"));
-
- m_button_style = style;
-
- if ((m_button_style & wxCUSTBUT_BUTTON) != 0)
- m_down = 0;
-
- CalcLayout(TRUE);
- return TRUE;
-}
-
-void wxCustomButton::SetLabel( const wxString &label )
-{
- wxControl::SetLabel(label);
- CalcLayout(TRUE);
-}
-
-// sequence of events in GTK is up, dclick, up.
-
-void wxCustomButton::OnMouseEvents(wxMouseEvent& event)
-{
- if (m_button_style & wxCUSTBUT_NOTOGGLE) return;
-
- if (event.LeftDown() || event.RightDown())
- {
- if (!HasCapture())
- CaptureMouse(); // keep depressed until up
-
- m_down++;
- Redraw();
- }
- else if (event.LeftDClick() || event.RightDClick())
- {
- m_down++; // GTK eats second down event
- Redraw();
- }
- else if (event.LeftUp())
- {
- if (HasCapture())
- ReleaseMouse();
-
- m_eventType = wxEVT_LEFT_UP;
-
-#if (wxMINOR_VERSION<8)
- if (wxRect(wxPoint(0,0), GetSize()).Inside(event.GetPosition()))
-#else
- if (wxRect(wxPoint(0,0), GetSize()).Contains(event.GetPosition()))
-#endif
- {
- if ((m_button_style & wxCUSTBUT_BUTTON) && (m_down > 0))
- {
- m_down = 0;
- Redraw();
- SendEvent();
- return;
- }
- else
- {
- if (!m_timer)
- {
- m_timer = new wxTimer(this, m_down+1);
- m_timer->Start(200, TRUE);
- }
- else
- {
- m_eventType = wxEVT_LEFT_DCLICK;
- }
-
- if ((m_button_style & wxCUSTBUT_TOGGLE) &&
- (m_button_style & wxCUSTBUT_TOG_DCLICK_BUT)) m_down++;
- }
- }
-
- Redraw();
- }
- else if (event.RightUp())
- {
- if (HasCapture())
- ReleaseMouse();
-
- m_eventType = wxEVT_RIGHT_UP;
-
-#if (wxMINOR_VERSION<8)
- if (wxRect(wxPoint(0,0), GetSize()).Inside(event.GetPosition()))
-#else
- if (wxRect(wxPoint(0,0), GetSize()).Contains(event.GetPosition()))
-#endif
- {
- if ((m_button_style & wxCUSTBUT_BUTTON) && (m_down > 0))
- {
- m_down = 0;
- Redraw();
- SendEvent();
- return;
- }
- else
- {
- m_down++;
-
- if (!m_timer)
- {
- m_timer = new wxTimer(this, m_down);
- m_timer->Start(250, TRUE);
- }
- else
- {
- m_eventType = wxEVT_RIGHT_DCLICK;
- }
- }
- }
-
- Redraw();
- }
- else if (event.Entering())
- {
- m_focused = TRUE;
- if ((event.LeftIsDown() || event.RightIsDown()) && HasCapture())
- m_down++;
-
- Redraw();
- }
- else if (event.Leaving())
- {
- m_focused = FALSE;
- if ((event.LeftIsDown() || event.RightIsDown()) && HasCapture())
- m_down--;
-
- Redraw();
- }
-}
-
-
-
-void wxCustomButton::SendEvent()
-{
- if (((m_button_style & wxCUSTBUT_TOGGLE) && (m_eventType == wxEVT_LEFT_UP)) ||
- ((m_button_style & wxCUSTBUT_BUT_DCLICK_TOG) && (m_eventType == wxEVT_LEFT_DCLICK)) ||
- ((m_button_style & wxCUSTBUT_TOG_DCLICK_BUT) && (m_eventType == wxEVT_LEFT_UP)))
- {
- wxCommandEvent eventOut(wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, GetId());
- eventOut.SetInt(m_down%2 ? 1 : 0);
- eventOut.SetExtraLong(m_eventType);
- eventOut.SetEventObject(this);
- GetEventHandler()->ProcessEvent(eventOut);
- }
- else
- {
- wxCommandEvent eventOut(wxEVT_COMMAND_BUTTON_CLICKED, GetId());
- eventOut.SetInt(0);
- eventOut.SetExtraLong(m_eventType);
- eventOut.SetEventObject(this);
- GetEventHandler()->ProcessEvent(eventOut);
- }
-}
-
-wxBitmap wxCustomButton::CreateBitmapDisabled(const wxBitmap &bitmap) const
-{
- wxCHECK_MSG(bitmap.Ok(), wxNullBitmap, wxT("invalid bitmap"));
-
- unsigned char br = GetBackgroundColour().Red();
- unsigned char bg = GetBackgroundColour().Green();
- unsigned char bb = GetBackgroundColour().Blue();
-
- wxImage image = bitmap.ConvertToImage();
- int pos, width = image.GetWidth(), height = image.GetHeight();
- unsigned char *img_data = image.GetData();
-
- for (int j=0; j<height; j++)
- {
- for (int i=j%2; i<width; i+=2)
- {
- pos = (j*width+i)*3;
- img_data[pos ] = br;
- img_data[pos+1] = bg;
- img_data[pos+2] = bb;
- }
- }
-
- return wxBitmap(image);
-}
-
-void wxCustomButton::SetBitmapLabel(const wxBitmap& bitmap)
-{
- m_bmpLabel = bitmap;
- CalcLayout(TRUE);
-}
-
-void wxCustomButton::OnPaint(wxPaintEvent& WXUNUSED(event))
-{
- wxPaintDC dc(this);
- Paint(dc);
-}
-
-void wxCustomButton::Redraw()
-{
- wxClientDC dc(this);
- Paint(dc);
-}
-
-void wxCustomButton::Paint( wxDC &dc )
-{
-#if (wxMINOR_VERSION<8)
- dc.BeginDrawing();
-#endif
-
- int w, h;
- GetSize(&w,&h);
-
- wxColour foreColour = GetForegroundColour();
- wxColour backColour = GetBackgroundColour();
-
- if (m_focused)
- {
- backColour.Set( wxMin(backColour.Red() + 20, 255),
- wxMin(backColour.Green() + 20, 255),
- wxMin(backColour.Blue() + 20, 255) );
- }
-
- wxBitmap bitmap;
-
- if (IsEnabled())
- {
- if (GetValue() && m_bmpSelected.Ok())
- bitmap = m_bmpSelected;
- else if (m_focused && m_bmpFocus.Ok())
- bitmap = m_bmpFocus;
- else if (m_bmpLabel.Ok())
- bitmap = m_bmpLabel;
- }
- else
- {
- // try to create disabled if it doesn't exist
- if (!m_bmpDisabled.Ok() && m_bmpLabel.Ok())
- m_bmpDisabled = CreateBitmapDisabled(m_bmpLabel);
-
- if (m_bmpDisabled.Ok())
- bitmap = m_bmpDisabled;
- else if (m_bmpLabel.Ok())
- bitmap = m_bmpLabel;
-
- foreColour = wxSystemSettings::GetColour(wxSYS_COLOUR_GRAYTEXT);
- }
-
- wxBrush brush(backColour, wxSOLID);
- dc.SetBackground(brush);
- dc.SetBrush(brush);
- dc.SetPen(*wxTRANSPARENT_PEN);
-
- dc.DrawRectangle(0, 0, w, h);
-
- if (bitmap.Ok())
- dc.DrawBitmap(bitmap, m_bitmapPos.x, m_bitmapPos.y, TRUE );
-
- if (!GetLabel().IsEmpty())
- {
- dc.SetFont(GetFont());
- dc.SetTextBackground(backColour);
- dc.SetTextForeground(foreColour);
- dc.DrawText(GetLabel(), m_labelPos.x, m_labelPos.y);
- }
-
- if (GetValue()) // draw sunken border
- {
- dc.SetPen(*wxGREY_PEN);
- dc.DrawLine(0,h-1,0,0); dc.DrawLine(0,0,w,0);
- dc.SetPen(*wxWHITE_PEN);
- dc.DrawLine(w-1,1,w-1,h-1); dc.DrawLine(w-1,h-1,0,h-1);
- dc.SetPen(*wxBLACK_PEN);
- dc.DrawLine(1,h-2,1,1); dc.DrawLine(1,1,w-1,1);
- }
- else if (((m_button_style & wxCUSTBUT_FLAT) == 0) || m_focused) // draw raised border
- {
- dc.SetPen(*wxWHITE_PEN);
- dc.DrawLine(0,h-2,0,0); dc.DrawLine(0,0,w-1,0);
- dc.SetPen(*wxBLACK_PEN);
- dc.DrawLine(w-1,0,w-1,h-1); dc.DrawLine(w-1,h-1,-1,h-1);
- dc.SetPen(*wxGREY_PEN);
- dc.DrawLine(2,h-2,w-2,h-2); dc.DrawLine(w-2,h-2,w-2,1);
- }
-
- dc.SetBackground(wxNullBrush);
- dc.SetBrush(wxNullBrush);
- dc.SetPen(wxNullPen);
-#if (wxMINOR_VERSION<8)
- dc.EndDrawing();
-#endif
-}
-
-void wxCustomButton::OnSize( wxSizeEvent &event )
-{
- CalcLayout(TRUE);
- event.Skip();
-}
-
-void wxCustomButton::SetMargins(const wxSize &margin, bool fit)
-{
- m_labelMargin = margin;
- m_bitmapMargin = margin;
- CalcLayout(TRUE);
- if (fit) SetSize(DoGetBestSize());
-}
-void wxCustomButton::SetLabelMargin(const wxSize &margin, bool fit)
-{
- m_labelMargin = margin;
- CalcLayout(TRUE);
- if (fit) SetSize(DoGetBestSize());
-}
-void wxCustomButton::SetBitmapMargin(const wxSize &margin, bool fit)
-{
- m_bitmapMargin = margin;
- CalcLayout(TRUE);
- if (fit) SetSize(DoGetBestSize());
-}
-
-wxSize wxCustomButton::DoGetBestSize() const
-{
- int lw=0, lh=0;
- int bw=0, bh=0;
- bool has_bitmap = FALSE;
- bool has_label = FALSE;
-
- if (!GetLabel().IsEmpty())
- {
- GetTextExtent(GetLabel(), &lw, &lh);
- lw += 2*m_labelMargin.x;
- lh += 2*m_labelMargin.y;
- has_label = TRUE;
- }
- if (m_bmpLabel.Ok())
- {
- bw = m_bmpLabel.GetWidth() + 2*m_bitmapMargin.x;
- bh = m_bmpLabel.GetHeight() + 2*m_bitmapMargin.y;
- has_bitmap = TRUE;
- }
-
- if ((m_button_style & wxCUSTBUT_LEFT) || (m_button_style & wxCUSTBUT_RIGHT))
- {
- int h = bh > lh ? bh : lh;
- if (has_bitmap && has_label) lw -= wxMin(m_labelMargin.x, m_bitmapMargin.x);
- return wxSize(lw+bw, h);
- }
-
- int w = bw > lw ? bw : lw;
- if (has_bitmap && has_label) lh -= wxMin(m_labelMargin.y, m_bitmapMargin.y);
- return wxSize(w, lh+bh);
-}
-
-void wxCustomButton::CalcLayout(bool refresh)
-{
- int w, h;
- GetSize(&w,&h);
-
- int bw = 0, bh = 0;
- int lw = 0, lh = 0;
-
- if (m_bmpLabel.Ok()) // assume they're all the same size
- {
- bw = m_bmpLabel.GetWidth();
- bh = m_bmpLabel.GetHeight();
- }
- wxString label = GetLabel();
- if (!label.IsEmpty())
- {
- GetTextExtent(label, &lw, &lh);
- }
-
- // Center the label or bitmap if only one or the other
- if (!m_bmpLabel.Ok())
- {
- m_bitmapPos = wxPoint(0,0);
- m_labelPos = wxPoint((w-lw)/2, (h-lh)/2);
- }
- else if (label.IsEmpty())
- {
- m_bitmapPos = wxPoint((w-bw)/2, (h-bh)/2);
- m_labelPos = wxPoint(0,0);
- }
- else if (m_button_style & wxCUSTBUT_LEFT)
- {
- int mid_margin = wxMax(m_labelMargin.x, m_bitmapMargin.x);
- m_labelPos = wxPoint((w - (bw+lw+m_labelMargin.x+m_bitmapMargin.x+mid_margin))/2 + m_labelMargin.x, (h - lh)/2);
- m_bitmapPos = wxPoint(m_labelPos.x + lw + mid_margin, (h - bh)/2);
- }
- else if (m_button_style & wxCUSTBUT_RIGHT)
- {
- int mid_margin = wxMax(m_labelMargin.x, m_bitmapMargin.x);
- m_bitmapPos = wxPoint((w - (bw+lw+m_labelMargin.x+m_bitmapMargin.x+mid_margin))/2 + m_bitmapMargin.x, (h - bh)/2);
- m_labelPos = wxPoint(m_bitmapPos.x + bw + mid_margin, (h - lh)/2);
- }
- else if (m_button_style & wxCUSTBUT_TOP)
- {
- int mid_margin = wxMax(m_labelMargin.y, m_bitmapMargin.y);
- m_labelPos = wxPoint((w - lw)/2, (h - (bh+lh+m_labelMargin.y+m_bitmapMargin.y+mid_margin))/2 + m_labelMargin.y);
- m_bitmapPos = wxPoint((w - bw)/2, m_labelPos.y + lh + mid_margin);
- }
- else // if (m_button_style & wxCUSTBUT_BOTTOM) DEFAULT
- {
- int mid_margin = wxMax(m_labelMargin.y, m_bitmapMargin.y);
- m_bitmapPos = wxPoint((w - bw)/2, (h - (bh+lh+m_labelMargin.y+m_bitmapMargin.y+mid_margin))/2 + m_bitmapMargin.y);
- m_labelPos = wxPoint((w - lw)/2, m_bitmapPos.y + bh + mid_margin);
- }
-
- if (refresh) Refresh(FALSE);
-}
-
-
-/* XPM */
-static const char *down_arrow_xpm_data[] = {
-/* columns rows colors chars-per-pixel */
-"5 3 2 1",
-" c None",
-"a c Black",
-/* pixels */
-"aaaaa",
-" aaa ",
-" a "};
-
-static wxBitmap s_dropdownBitmap; // all buttons share the same bitmap
-
-enum
-{
- IDD_DROPDOWN_BUTTON = 100
-};
-
-//-----------------------------------------------------------------------------
-// wxMenuButtonEvents
-//-----------------------------------------------------------------------------
-
-DEFINE_LOCAL_EVENT_TYPE(wxEVT_MENUBUTTON_OPEN)
-
-// ==========================================================================
-// MenuDropButton
-// ==========================================================================
-
-class MenuDropButton : public wxCustomButton
-{
-public:
- MenuDropButton( wxWindow *parent, wxWindowID id, long style) : wxCustomButton()
- {
- if (!s_dropdownBitmap.Ok())
- s_dropdownBitmap = wxBitmap(down_arrow_xpm_data);
-
- Create( parent, id, wxEmptyString, s_dropdownBitmap, wxDefaultPosition,
- wxSize(wxMENUBUTTON_DROP_WIDTH, wxMENUBUTTON_DROP_HEIGHT), style);
- }
-
- virtual void Paint( wxDC &dc )
- {
- wxCustomButton *labelBut = ((wxMenuButton*)GetParent())->GetLabelButton();
-
- // pretend that both buttons have focus (for flat style)
- if (labelBut)
- {
- wxPoint p = GetParent()->ScreenToClient(wxGetMousePosition());
-
-#if (wxMINOR_VERSION<8)
- if (GetRect().Inside(p) || labelBut->GetRect().Inside(p))
-#else
- if (GetRect().Contains(p) || labelBut->GetRect().Contains(p))
-#endif
- {
- m_focused = TRUE;
-
- if (!labelBut->GetFocused())
- labelBut->SetFocused(TRUE);
- }
- else
- {
- m_focused = FALSE;
-
- if (labelBut->GetFocused())
- labelBut->SetFocused(FALSE);
- }
- }
-
- wxCustomButton::Paint(dc);
- }
-};
-
-// ==========================================================================
-// MenuLabelButton
-// ==========================================================================
-
-class MenuLabelButton : public wxCustomButton
-{
-public:
- MenuLabelButton( wxWindow* parent, wxWindowID id,
- const wxString &label,
- const wxBitmap &bitmap,
- long style ) : wxCustomButton()
- {
- Create(parent, id, label, bitmap, wxDefaultPosition, wxDefaultSize, style);
- }
-
- virtual void Paint( wxDC &dc )
- {
- wxCustomButton *dropBut = ((wxMenuButton*)GetParent())->GetDropDownButton();
-
- // pretend that both buttons have focus (for flat style)
- if (dropBut)
- {
- wxPoint p = GetParent()->ScreenToClient(wxGetMousePosition());
-
-#if (wxMINOR_VERSION<8)
- if (GetRect().Inside(p) || dropBut->GetRect().Inside(p))
-#else
- if (GetRect().Contains(p) || dropBut->GetRect().Contains(p))
-#endif
- {
- m_focused = TRUE;
-
- if (!dropBut->GetFocused())
- dropBut->SetFocused(TRUE);
- }
- else
- {
- m_focused = FALSE;
-
- if (dropBut->GetFocused())
- dropBut->SetFocused(FALSE);
- }
- }
-
- wxCustomButton::Paint(dc);
- }
-};
-
-// ==========================================================================
-// wxMenuButton
-// ==========================================================================
-
-IMPLEMENT_DYNAMIC_CLASS( wxMenuButton, wxControl )
-
-BEGIN_EVENT_TABLE(wxMenuButton,wxControl)
- EVT_BUTTON(wxID_ANY, wxMenuButton::OnButton)
-
-#ifdef __WXMSW__
- EVT_MENU(wxID_ANY, wxMenuButton::OnMenu)
-#endif
-END_EVENT_TABLE()
-
-wxMenuButton::~wxMenuButton()
-{
- AssignMenu(NULL, TRUE);
-}
-
-void wxMenuButton::Init()
-{
- m_labelButton = NULL;
- m_dropdownButton = NULL;
- m_menu = NULL;
- m_menu_static = FALSE;
- m_style = 0;
-}
-
-bool wxMenuButton::Create( wxWindow* parent, wxWindowID id,
- const wxString &label,
- const wxBitmap &bitmap,
- const wxPoint& pos,
- const wxSize& size,
- long style,
- const wxValidator& val,
- const wxString& name)
-{
- m_style = style;
-
- long flat = style & wxMENUBUT_FLAT;
-
- wxControl::Create(parent,id,pos,size,wxNO_BORDER|wxCLIP_CHILDREN,val,name);
- wxControl::SetLabel(label);
- SetBackgroundColour(parent->GetBackgroundColour());
- SetForegroundColour(parent->GetForegroundColour());
- SetFont(parent->GetFont());
-
- m_labelButton = new MenuLabelButton(this, id, label, bitmap, wxCUSTBUT_BUTTON|flat);
- m_dropdownButton = new MenuDropButton(this, IDD_DROPDOWN_BUTTON, wxCUSTBUT_BUTTON|flat);
-
- wxSize bestSize = DoGetBestSize();
- SetSize( wxSize(size.x < 0 ? bestSize.x : size.x,
- size.y < 0 ? bestSize.y : size.y) );
-
-#if (wxMINOR_VERSION<8)
- SetBestSize(GetSize());
-#else
- SetInitialSize(GetSize());
-#endif
-
- return TRUE;
-}
-
-#ifdef __WXMSW__
-// FIXME - I think there was a patch to fix this
-void wxMenuButton::OnMenu( wxCommandEvent &event )
-{
- event.Skip();
- wxMenuItem *mi = m_menu->FindItem(event.GetId());
- if (mi && (mi->GetKind() == wxITEM_RADIO))
- m_menu->Check(event.GetId(), TRUE);
-}
-#endif // __WXMSW__
-
-void wxMenuButton::OnButton( wxCommandEvent &event)
-{
- int win_id = event.GetId();
-
- if (win_id == IDD_DROPDOWN_BUTTON)
- {
- wxNotifyEvent mevent(wxEVT_MENUBUTTON_OPEN, GetId());
- mevent.SetEventObject(this);
- if (GetEventHandler()->ProcessEvent(mevent) && !mevent.IsAllowed())
- return;
-
- if (!m_menu)
- return;
-
- PopupMenu(m_menu, wxPoint(0, GetSize().y));
-
- m_labelButton->Refresh(FALSE);
- m_dropdownButton->Refresh(FALSE);
- }
- else if (win_id == m_labelButton->GetId())
- {
-
- wxCommandEvent cevent(wxEVT_COMMAND_MENU_SELECTED, win_id);
- cevent.SetEventObject(this);
- cevent.SetId(win_id);
- GetParent()->GetEventHandler()->ProcessEvent(cevent);
-
- if (!m_menu) return;
-
- const wxMenuItemList &items = m_menu->GetMenuItems();
- int first_radio_id = -1;
- int checked_id = -1;
- bool check_next = FALSE;
-
- // find the next available radio item to check
- for (wxMenuItemList::Node *node = items.GetFirst(); node; node = node->GetNext())
- {
- wxMenuItem *mi = (wxMenuItem*)node->GetData();
- if (mi && (mi->GetKind() == wxITEM_RADIO))
- {
- if (first_radio_id == -1)
- first_radio_id = mi->GetId();
-
- if (check_next)
- {
- check_next = FALSE;
- checked_id = mi->GetId();
- break;
- }
- else if (mi->IsChecked())
- check_next = TRUE;
- }
- }
- // the last item was checked, go back to the first
- if (check_next && (first_radio_id != -1))
- checked_id = first_radio_id;
-
- if (checked_id != -1)
- {
- m_menu->Check(checked_id, TRUE);
-
- wxCommandEvent mevent( wxEVT_COMMAND_MENU_SELECTED, checked_id);
- mevent.SetEventObject( m_menu );
- mevent.SetInt(1);
- GetEventHandler()->ProcessEvent(mevent);
- }
- }
-}
-
-int wxMenuButton::GetSelection() const
-{
- wxCHECK_MSG(m_menu != NULL, wxNOT_FOUND, wxT("No attached menu in wxMenuButton::GetSelection"));
-
- const wxMenuItemList &items = m_menu->GetMenuItems();
-
- for (wxMenuItemList::Node *node = items.GetFirst(); node; node = node->GetNext())
- {
- wxMenuItem *mi = (wxMenuItem*)node->GetData();
- if (mi && (mi->GetKind() == wxITEM_RADIO))
- {
- if (mi->IsChecked())
- return mi->GetId();
- }
- }
-
- return wxNOT_FOUND;
-}
-
-void wxMenuButton::AssignMenu(wxMenu *menu, bool static_menu)
-{
- if (!m_menu_static && m_menu)
- delete m_menu;
-
- m_menu = menu;
- m_menu_static = static_menu;
-}
-
-void wxMenuButton::SetToolTip(const wxString &tip)
-{
- wxWindow::SetToolTip(tip);
- ((wxWindow*)m_labelButton)->SetToolTip(tip);
- ((wxWindow*)m_dropdownButton)->SetToolTip(tip);
-}
-void wxMenuButton::SetToolTip(wxToolTip *tip)
-{
- wxWindow::SetToolTip(tip);
- ((wxWindow*)m_labelButton)->SetToolTip(tip);
- ((wxWindow*)m_dropdownButton)->SetToolTip(tip);
-}
-
-void wxMenuButton::DoSetSize(int x, int y, int width, int height, int sizeFlags)
-{
- wxSize curSize( GetSize() );
- wxSize bestSize( DoGetBestSize() );
-
- if (width == -1)
- width = curSize.GetWidth();
- if (width < 10)
- width = bestSize.GetWidth();
-
- if (height == -1)
- height = curSize.GetHeight();
- if (height < 5)
- height = bestSize.GetHeight();
-
- wxWindow::DoSetSize(x, y, width, height, sizeFlags);
-
- if (m_labelButton)
- m_labelButton->SetSize(0, 0, width - wxMENUBUTTON_DROP_WIDTH, height);
- if (m_dropdownButton)
- m_dropdownButton->SetSize(width-wxMENUBUTTON_DROP_WIDTH, 0, wxMENUBUTTON_DROP_WIDTH, height);
-}
-
-wxSize wxMenuButton::DoGetBestSize()
-{
- if (!m_labelButton || !m_dropdownButton)
- return wxSize(wxMENUBUTTON_DROP_WIDTH+wxMENUBUTTON_DROP_HEIGHT, wxMENUBUTTON_DROP_HEIGHT);
-
- wxSize size = m_labelButton->GetBestSize();
- size.x += wxMENUBUTTON_DROP_WIDTH;
- return size;
-}
+++ /dev/null
-/////////////////////////////////////////////////////////////////////////////
-// Name: wxMenuButton
-// Purpose: A button with a dropdown wxMenu
-// Author: John Labenski
-// Modified by:
-// Created: 11/05/2002
-// Copyright: (c) John Labenski
-// Licence: wxWidgets licence
-/////////////////////////////////////////////////////////////////////////////
-
-/*
-
-wxMenuButton is a button that drops down an assigned wxMenu
-
-Create the button with either a text or bitmap label.
- Create a new wxMenu and call AssignMenu and thats it. When you press the
- dropdown button the menu appears. When you press the label button the next
- wxITEM_RADIO (ie wxMenuItem::GetKind) in the menu is selected round robin.
- If there are no radio items then it really just acts like a menubar, though
- this is probably not too useful. The events sent in this case are EVT_MENUs
- either generated by the menu when you click on it or created when you click
- on the label to select the next radio item.
-*/
-
-#ifndef _WX_MENUBTN_H_
-#define _WX_MENUBTN_H_
-
-#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
- #pragma interface "menubtn.h"
-#endif
-
-class wxMenu;
-class wxBitmap;
-class wxCustomButton;
-
-//-----------------------------------------------------------------------------
-// wxCustomButton styles
-//-----------------------------------------------------------------------------
-
-enum wxCustomButton_Style
-{
- // Position of the label, use only one
- wxCUSTBUT_LEFT = 0x0001,
- wxCUSTBUT_RIGHT = 0x0002,
- wxCUSTBUT_TOP = 0x0004,
- wxCUSTBUT_BOTTOM = 0x0008,
- // Button style, use only one
- wxCUSTBUT_NOTOGGLE = 0x0100,
- wxCUSTBUT_BUTTON = 0x0200,
- wxCUSTBUT_TOGGLE = 0x0400,
- wxCUSTBUT_BUT_DCLICK_TOG = 0x0800,
- wxCUSTBUT_TOG_DCLICK_BUT = 0x1000,
- // drawing styles
- wxCUSTBUT_FLAT = 0x2000 // flat, mouseover raises if not depressed
-};
-
-//-----------------------------------------------------------------------------
-// wxCustomButton
-//-----------------------------------------------------------------------------
-
-class WXDLLEXPORT wxCustomButton : public wxControl
-{
-public:
-
- wxCustomButton() : wxControl() { Init(); }
-
- // wxToggleButton or wxButton compatible constructor (also wxTextCtrl)
- wxCustomButton(wxWindow* parent, wxWindowID id,
- const wxString& label,
- const wxPoint& pos = wxDefaultPosition,
- const wxSize& size = wxDefaultSize,
- long style = wxCUSTBUT_TOGGLE,
- const wxValidator& val = wxDefaultValidator,
- const wxString& name = wxT("wxCustomButton"))
- : wxControl()
- {
- Init();
- Create(parent,id,label,wxNullBitmap,pos,size,style,val,name);
- }
-
- // wxBitmapButton compatible constructor
- wxCustomButton(wxWindow *parent, wxWindowID id,
- const wxBitmap& bitmap,
- const wxPoint& pos = wxDefaultPosition,
- const wxSize& size = wxDefaultSize,
- long style = wxCUSTBUT_TOGGLE,
- const wxValidator& val = wxDefaultValidator,
- const wxString& name = wxT("wxCustomButton"))
- : wxControl()
- {
- Init();
- Create(parent,id,wxEmptyString,bitmap,pos,size,style,val,name);
- }
-
- // Native constructor
- wxCustomButton(wxWindow *parent, wxWindowID id,
- const wxString& label, const wxBitmap& bitmap,
- const wxPoint& pos = wxDefaultPosition,
- const wxSize& size = wxDefaultSize,
- long style = wxCUSTBUT_TOGGLE|wxCUSTBUT_BOTTOM,
- const wxValidator& val = wxDefaultValidator,
- const wxString& name = wxT("wxCustomButton"))
- : wxControl()
- {
- Init();
- Create(parent,id,label,bitmap,pos,size,style,val,name);
- }
-
- virtual ~wxCustomButton();
-
- bool Create(wxWindow* parent,
- wxWindowID id,
- const wxString& label,
- const wxBitmap &bitmap,
- const wxPoint& pos = wxDefaultPosition,
- const wxSize& size = wxDefaultSize,
- long style = 0,
- const wxValidator& val = wxDefaultValidator,
- const wxString& name = wxT("wxCustomButton"));
-
- bool GetValue() const { return m_down%2 != 0; }
- void SetValue( bool depressed );
-
- // Use combinations of wxCustomButton_Style(s)
- long GetButtonStyle() const { return m_button_style; }
- bool SetButtonStyle( long style );
-
- // Set the text label, wxEmptyString for none
- void SetLabel( const wxString &label );
-
- // set the bitmaps, ONLY this Label bitmap is used for calculating control size
- // all bitmaps will be centered accordingly in any case
- // call SetSet(GetBestSize()) if you change their size and want the control to resize appropriately
- void SetBitmapLabel(const wxBitmap& bitmap);
- void SetBitmapSelected(const wxBitmap& sel) { m_bmpSelected = sel; CalcLayout(TRUE); };
- void SetBitmapFocus(const wxBitmap& focus) { m_bmpFocus = focus; CalcLayout(TRUE); };
- void SetBitmapDisabled(const wxBitmap& disabled) { m_bmpDisabled = disabled; CalcLayout(TRUE); };
- // wxBitmapButton compatibility
- void SetLabel(const wxBitmap& bitmap) { SetBitmapLabel(bitmap); }
-
- // retrieve the bitmaps
- const wxBitmap& GetBitmapLabel() const { return m_bmpLabel; }
- const wxBitmap& GetBitmapSelected() const { return m_bmpSelected; }
- const wxBitmap& GetBitmapFocus() const { return m_bmpFocus; }
- const wxBitmap& GetBitmapDisabled() const { return m_bmpDisabled; }
-
- // Creates a "disabled" bitmap by dithering it with the background colour
- wxBitmap CreateBitmapDisabled(const wxBitmap &bitmap) const;
-
- // set/get the margins (in pixels) around the label and bitmap
- // if fit = TRUE then resize the button to fit
- void SetMargins(const wxSize &margin, bool fit = FALSE);
-
- // set/get the margins around the text label
- // the inter bitmap/label margin is the max of either margin, not the sum
- void SetLabelMargin(const wxSize &margin, bool fit = FALSE);
- wxSize GetLabelMargin() const { return m_labelMargin; }
- // set/get the margins around the bitmap
- // the inter bitmap/label margin is the max of either margin, not the sum
- void SetBitmapMargin(const wxSize &margin, bool fit = FALSE);
- wxSize GetBitmapMargin() const { return m_bitmapMargin; }
-
- // can be used to activate the focused behavior (see MenuButton)
- void SetFocused(bool focused) { m_focused = focused; Refresh(FALSE); }
- bool GetFocused() const { return m_focused; }
-
-protected:
- void OnPaint(wxPaintEvent &event);
- void Redraw();
- virtual void Paint( wxDC &dc );
-
- virtual wxSize DoGetBestSize() const;
-
- virtual void SendEvent();
-
- void OnMouseEvents(wxMouseEvent &event);
-
- void OnSize( wxSizeEvent &event );
-
- virtual void CalcLayout(bool refresh);
-
- long m_down; // toggle state if m_down%2 then depressed
- bool m_focused; // mouse in window
- long m_button_style;
-
- // the bitmaps for various states
- wxBitmap m_bmpLabel,
- m_bmpSelected,
- m_bmpFocus,
- m_bmpDisabled;
-
- // the margins around the label/bitmap
- wxSize m_labelMargin,
- m_bitmapMargin;
-
- wxPoint m_bitmapPos,
- m_labelPos;
-
- wxTimer *m_timer;
-
- wxEventType m_eventType; // store the mouse event type
-
-private:
- void Init();
- DECLARE_DYNAMIC_CLASS(wxCustomButton)
- DECLARE_EVENT_TABLE()
-};
-
-//-----------------------------------------------------------------------------
-// wxMenuButton styles
-//-----------------------------------------------------------------------------
-
-#define wxMENUBUTTON_DROP_WIDTH 10
-#define wxMENUBUTTON_DROP_HEIGHT 22
-
-enum wxMenuButton_Styles
-{
- wxMENUBUT_FLAT = wxCUSTBUT_FLAT
-};
-
-//-----------------------------------------------------------------------------
-// wxMenuButton
-//-----------------------------------------------------------------------------
-
-class wxMenuButton : public wxControl
-{
-public:
-
- wxMenuButton() : wxControl() { Init(); }
-
- // Use this constructor if you need one compatible with a wxBitmapButton
- // setup the button later with AssignMenu
- wxMenuButton( wxWindow* parent, wxWindowID id,
- const wxBitmap &bitmap,
- const wxPoint& pos = wxDefaultPosition,
- const wxSize& size = wxDefaultSize,
- long style = 0,
- const wxValidator& val = wxDefaultValidator,
- const wxString& name = wxT("wxMenuButton"))
- : wxControl()
- {
- Init();
- Create(parent,id,wxEmptyString,bitmap,pos,size,style,val,name);
- }
-
- virtual ~wxMenuButton();
-
- bool Create( wxWindow* parent,
- wxWindowID id,
- const wxString &label,
- const wxBitmap &bitmap,
- const wxPoint& pos = wxDefaultPosition,
- const wxSize& size = wxDefaultSize,
- long style = wxNO_BORDER,
- const wxValidator& val = wxDefaultValidator,
- const wxString& name = wxT("wxMenuButton"));
-
- // Gets the id of the first selected radio item or wxNOT_FOUND (-1) if none
- int GetSelection() const;
-
- // This menu will be displayed when the dropdown button is pressed.
- // if static_menu is FALSE it will be deleted when the buttton is destroyed.
- void AssignMenu(wxMenu *menu, bool static_menu = FALSE);
-
- wxMenu *GetMenu() const { return m_menu; }
-
- // get a pointer to the label button, for turning it into a toggle perhaps
- wxCustomButton *GetLabelButton() const { return m_labelButton; }
- wxCustomButton *GetDropDownButton() const { return m_dropdownButton; }
-
- void SetToolTip(const wxString &tip);
- void SetToolTip(wxToolTip *tip);
-
-protected:
- void OnButton(wxCommandEvent &event);
-
- virtual void DoSetSize(int x, int y, int width, int height,
- int sizeFlags = wxSIZE_AUTO);
-
- virtual wxSize DoGetBestSize();
-
-// FIXME! - in MSW the radio items don't check themselves
-#ifdef __WXMSW__
- void OnMenu( wxCommandEvent &event );
-#endif
-
- wxCustomButton *m_labelButton;
- wxCustomButton *m_dropdownButton;
-
- wxMenu *m_menu;
- bool m_menu_static;
- long m_style;
-
-private:
- void Init();
- DECLARE_DYNAMIC_CLASS(wxMenuButton)
- DECLARE_EVENT_TABLE()
-};
-
-//-----------------------------------------------------------------------------
-// wxMenuButtonEvents
-//
-// EVT_MENUBUTTON_OPEN(id, fn) - menu is about to be opened, (dis)(en)able items
-// or call Veto() to stop menu from popping up
-// this is a wxNotifyEvent
-//-----------------------------------------------------------------------------
-
-BEGIN_DECLARE_EVENT_TYPES()
- DECLARE_LOCAL_EVENT_TYPE( wxEVT_MENUBUTTON_OPEN, 0 )
-END_DECLARE_EVENT_TYPES()
-
-#define EVT_MENUBUTTON_OPEN(id, fn) DECLARE_EVENT_TABLE_ENTRY(wxEVT_MENUBUTTON_OPEN, id, wxID_ANY, (wxObjectEventFunction) (wxEventFunction) (wxCommandEventFunction) (wxNotifyEventFunction) & fn, (wxObject *) NULL ),
-
-#endif // _WX_MENUBTN_H_
+++ /dev/null
-/* XPM */
-static const char * osmo4[] = {
-"32 32 266 2",
-" c None",
-". c #990909",
-"+ c #A10505",
-"@ c #AB0404",
-"# c #AF0202",
-"$ c #B10303",
-"% c #AE0202",
-"& c #A90505",
-"* c #A10606",
-"= c #990E0E",
-"- c #990D0D",
-"; c #A80303",
-"> c #BD0000",
-", c #D40000",
-"' c #DE0000",
-") c #E20000",
-"! c #E10000",
-"~ c #DC0000",
-"{ c #CD0000",
-"] c #B80101",
-"^ c #A40909",
-"/ c #A20505",
-"( c #BD0101",
-"_ c #E00000",
-": c #CB0000",
-"< c #A80000",
-"[ c #7E0101",
-"} c #6B0202",
-"| c #670202",
-"1 c #720202",
-"2 c #920000",
-"3 c #B70000",
-"4 c #D70000",
-"5 c #B80303",
-"6 c #9D0B0B",
-"7 c #980909",
-"8 c #B00202",
-"9 c #DB0000",
-"0 c #B50909",
-"a c #8A1313",
-"b c #1C0505",
-"c c #070505",
-"d c #080808",
-"e c #0A0A0A",
-"f c #090909",
-"g c #070707",
-"h c #0C0404",
-"i c #5B1414",
-"j c #A70F0F",
-"k c #CC0303",
-"l c #CC0000",
-"m c #AB0505",
-"n c #950D0D",
-"o c #B60101",
-"p c #DD0000",
-"q c #CF0202",
-"r c #9C1414",
-"s c #141414",
-"t c #0C0C0C",
-"u c #0F0F0F",
-"v c #111111",
-"w c #101010",
-"x c #0E0E0E",
-"y c #B70707",
-"z c #DF0000",
-"A c #D50000",
-"B c #A90606",
-"C c #970E0E",
-"D c #B30202",
-"E c #C50505",
-"F c #812121",
-"G c #191919",
-"H c #161616",
-"I c #181818",
-"J c #171717",
-"K c #151515",
-"L c #AF0A0A",
-"M c #D70101",
-"N c #D60000",
-"O c #AD0606",
-"P c #AA0303",
-"Q c #DA0000",
-"R c #C80505",
-"S c #8E1E1E",
-"T c #1D1D1D",
-"U c #1F1F1F",
-"V c #202020",
-"W c #B00909",
-"X c #CE0000",
-"Y c #9F0A0A",
-"Z c #9B0808",
-"` c #D20000",
-" . c #D80101",
-".. c #8B1B1B",
-"+. c #2D2D2D",
-"@. c #272727",
-"#. c #262626",
-"$. c #252525",
-"%. c #BB0606",
-"&. c #BB0303",
-"*. c #AF0303",
-"=. c #AF0B0B",
-"-. c #303030",
-";. c #2B2B2B",
-">. c #323232",
-",. c #CD0202",
-"'. c #A60A0A",
-"). c #9E0909",
-"!. c #CF0000",
-"~. c #CE0404",
-"{. c #292929",
-"]. c #B10808",
-"^. c #A70303",
-"/. c #B60A0A",
-"(. c #961010",
-"_. c #B90000",
-":. c #9C1212",
-"<. c #1A1A1A",
-"[. c #222222",
-"}. c #1C1C1C",
-"|. c #C20202",
-"1. c #A30606",
-"2. c #C60000",
-"3. c #2A2A2A",
-"4. c #3B3B3B",
-"5. c #444444",
-"6. c #434343",
-"7. c #3A3A3A",
-"8. c #1E1E1E",
-"9. c #131313",
-"0. c #BB0A0A",
-"a. c #AD0707",
-"b. c #9A1515",
-"c. c #D30000",
-"d. c #353535",
-"e. c #484848",
-"f. c #5F5F5F",
-"g. c #6C6C6C",
-"h. c #646464",
-"i. c #565656",
-"j. c #343434",
-"k. c #212121",
-"l. c #121212",
-"m. c #B30505",
-"n. c #B10404",
-"o. c #9A1111",
-"p. c #424242",
-"q. c #555555",
-"r. c #6B6B6B",
-"s. c #757575",
-"t. c #6E6E6E",
-"u. c #606060",
-"v. c #4E4E4E",
-"w. c #3F3F3F",
-"x. c #2C2C2C",
-"y. c #B10909",
-"z. c #B60707",
-"A. c #9B1515",
-"B. c #D00000",
-"C. c #494949",
-"D. c #595959",
-"E. c #676767",
-"F. c #696969",
-"G. c #616161",
-"H. c #525252",
-"I. c #454545",
-"J. c #B20707",
-"K. c #363636",
-"L. c #626262",
-"M. c #5B5B5B",
-"N. c #505050",
-"O. c #282828",
-"P. c #B80B0B",
-"Q. c #AC0707",
-"R. c #AA1111",
-"S. c #0D0D0D",
-"T. c #585858",
-"U. c #545454",
-"V. c #4B4B4B",
-"W. c #BF0303",
-"X. c #9F0B0B",
-"Y. c #B90707",
-"Z. c #242424",
-"`. c #313131",
-" + c #3E3E3E",
-".+ c #474747",
-"++ c #4D4D4D",
-"@+ c #4F4F4F",
-"#+ c #4C4C4C",
-"$+ c #3D3D3D",
-"%+ c #D90000",
-"&+ c #8E1010",
-"*+ c #A00808",
-"=+ c #D00303",
-"-+ c #3C3C3C",
-";+ c #0B0B0B",
-">+ c #AE0808",
-",+ c #C10101",
-"'+ c #BB0202",
-")+ c #BA0A0A",
-"!+ c #1B1B1B",
-"~+ c #2F2F2F",
-"{+ c #C10303",
-"]+ c #A10A0A",
-"^+ c #9F0707",
-"/+ c #D80000",
-"(+ c #BE0303",
-"_+ c #821C1C",
-":+ c #C20404",
-"<+ c #232323",
-"[+ c #A90C0C",
-"}+ c #970C0C",
-"|+ c #960E0E",
-"1+ c #BE0101",
-"2+ c #C60505",
-"3+ c #131212",
-"4+ c #B00B0B",
-"5+ c #CE0101",
-"6+ c #A80707",
-"7+ c #990B0B",
-"8+ c #C40404",
-"9+ c #AD0909",
-"0+ c #D00101",
-"a+ c #B00505",
-"b+ c #7B1C1C",
-"c+ c #960C0C",
-"d+ c #BC0202",
-"e+ c #BC0808",
-"f+ c #962525",
-"g+ c #482E2E",
-"h+ c #1E1616",
-"i+ c #141010",
-"j+ c #2F2020",
-"k+ c #703636",
-"l+ c #A81212",
-"m+ c #A90707",
-"n+ c #8E1313",
-"o+ c #D30606",
-"p+ c #B91E1E",
-"q+ c #901919",
-"r+ c #661010",
-"s+ c #540F0F",
-"t+ c #4F0D0D",
-"u+ c #5A0F0F",
-"v+ c #7A1515",
-"w+ c #A21E1E",
-"x+ c #C51212",
-"y+ c #D60101",
-"z+ c #980D0D",
-"A+ c #930C0C",
-"B+ c #B30404",
-"C+ c #C60202",
-"D+ c #7B1919",
-"E+ c #8C1515",
-"F+ c #9F0909",
-"G+ c #B20303",
-"H+ c #C30000",
-"I+ c #CA0000",
-"J+ c #C90000",
-"K+ c #BC0101",
-"L+ c #AA0505",
-"M+ c #8F1111",
-"N+ c #7F1E1E",
-"O+ c #732626",
-"P+ c #762A2A",
-"Q+ c #6E2828",
-" ",
-" . + @ # $ % & * = ",
-" - ; > , ' ) ) ! ) ! ~ { ] ^ ",
-" / ( ' _ : < [ } | 1 2 3 4 ) , 5 6 ",
-" 7 8 9 ' 0 a b c d e e f g h i j k ) l m ",
-" n o p q r s t u v v w t x y z A B ",
-" C D ) E F G H I G J K L M N O ",
-" P Q R S T U U T V W ' X Y ",
-" Z ` ... +.@.#.$. %.! &. ",
-" *.) =. -.;.>. ,.4 '. ",
-" ).!.~. {. ].) ( ",
-" ^.z /. $. A ` (. ",
-" _.! :. K K <.V [.}.K K |.z 1. ",
-" 2.9 v <.3.4.5.6.7.;.8.9.J 0.) a. ",
-" b.!.c. w }.d.e.f.g.h.i.5.j.k.l. m._ n. ",
-" o.` !. u J 3.p.q.r.s.t.u.v.w.x.T w y._ z. ",
-" A.B.` u k.j.C.D.E.g.F.G.H.I.j.$.9.l. m._ J. ",
-" : 4 s v #.K.C.q.u.h.L.M.N.I.K.O.J x P.) Q. ",
-" > z R. S.9.#.d.5.v.i.D.T.U.V.p.j.{.G t W._ X. ",
-" % ) Y. l.9.Z.`. +.+++N.@+#+I.$+>.@.I t { %+&+ ",
-" *+, =+ x w V ;.K.$+6.I.I.p.-+K.;.[.H ;+ >+z ,+ ",
-" '+_ )+ x S.!+Z.~+d.7.-+-+7.d.~+#.8.9.;+ {+_ ]+ ",
-" ^+/+, e s }.$.;.~+`.`.-.;.#.U J S.w z.' (+_+ ",
-" ] ) :+ t S.K T [.@.O.O.@.<+U I v ;+ [+` ~ }+ ",
-" |+1+) 2+ e t 9.I }.T 8.}.G K u e 3+ 4+5+' 6+ ",
-" 7+l ) 8+ e ;+u 9.K K 9.v S.f w 9+0+) a+b+ ",
-" c+d+) N e+f+g+h+;+f e f i+j+k+l+|.~ /+m+ ",
-" n+D N ! o+p+q+r+s+t+u+v+w+x+y+! X z+ ",
-" A+B+X _ ! ~ /+N %+' ) ~ C+Y D+ ",
-" E+F+G+H+I+l J+K+L+M+N+ ",
-" O+P+Q+ ",
-" "};
+++ /dev/null
-/* XPM */
-static const char* pl_open[] = {
-"16 16 5 1",
-" c #000000",
-"! c #808000",
-"# c #C0C0C0",
-"$ c #FFFF00",
-"% c #FFFFFF",
-"################",
-"################",
-"######### ####",
-"######## ### # #",
-"############# #",
-"# ######## #",
-" %$% #####",
-" $%$%$%$%$ #####",
-" %$%$%$%$% #####",
-" $%$% #",
-" %$% !!!!!!!!! #",
-" $% !!!!!!!!! ##",
-" % !!!!!!!!! ###",
-" !!!!!!!!! ####",
-" #####",
-"################"};
-
-/* XPM */
-static const char* pl_save[] = {
-"16 16 3 1",
-" c #000000",
-"! c #808000",
-"# c #C0C0C0",
-"################",
-"# #",
-"# ! ######## # #",
-"# ! ######## #",
-"# ! ######## ! #",
-"# ! ######## ! #",
-"# ! ######## ! #",
-"# ! ######## ! #",
-"# !! !! #",
-"# !!!!!!!!!!!! #",
-"# !! ! #",
-"# !! ## ! #",
-"# !! ## ! #",
-"# !! ## ! #",
-"## #",
-"################"};
-
-/* XPM */
-static const char* pl_add[] = {
-"16 16 2 1",
-" c #000000",
-"! c #C0C0C0",
-"!!!!!!!!!!!!!!!!",
-"!!!!!!!!!!!!!!!!",
-"!!!!!!!!!!!!!!!!",
-"!!!!!! !!!!!!!",
-"!!!!!! !!!!!!!",
-"!!!!!! !!!!!!!",
-"!!!!!! !!!!!!!",
-"!! !!!",
-"!! !!!",
-"!! !!!",
-"!!!!!! !!!!!!!",
-"!!!!!! !!!!!!!",
-"!!!!!! !!!!!!!",
-"!!!!!! !!!!!!!",
-"!!!!!!!!!!!!!!!!",
-"!!!!!!!!!!!!!!!!"};
-
-/* XPM */
-static const char* pl_rem[] = {
-"16 16 2 1",
-" c #000000",
-"! c #C0C0C0",
-"!!!!!!!!!!!!!!!!",
-"!!!!!!!!!!!!!!!!",
-"!!!!!!!!!!!!!!!!",
-"!!!!!!!!!!!!!!!!",
-"!!!!!!!!!!!!!!!!",
-"!!!!!!!!!!!!!!!!",
-"!!!!!!!!!!!!!!!!",
-"!! !!!",
-"!! !!!",
-"!! !!!",
-"!!!!!!!!!!!!!!!!",
-"!!!!!!!!!!!!!!!!",
-"!!!!!!!!!!!!!!!!",
-"!!!!!!!!!!!!!!!!",
-"!!!!!!!!!!!!!!!!",
-"!!!!!!!!!!!!!!!!"};
-
-/* XPM */
-static const char* pl_up[] = {
-"16 16 2 1",
-" c #000000",
-"! c #C0C0C0",
-"!!!!!!!!!!!!!!!!",
-"!!!!!!!!!!!!!!!!",
-"!!!!!!!!!!!!!!!!",
-"!!!!!!! !!!!!!!!",
-"!!!!!! !!!!!!!",
-"!!!!! !!!!!!",
-"!!!! !!!!!",
-"!!! !!!!",
-"!!!!!! !!!!!!!",
-"!!!!!! !!!!!!!",
-"!!!!!! !!!!!!!",
-"!!!!!! !!!!!!!",
-"!!!!!! !!!!!!!",
-"!!!!!! !!!!!!!",
-"!!!!!!!!!!!!!!!!",
-"!!!!!!!!!!!!!!!!"};
-
-/* XPM */
-static const char* pl_down[] = {
-"16 16 2 1",
-" c #000000",
-"! c #C0C0C0",
-"!!!!!!!!!!!!!!!!",
-"!!!!!!!!!!!!!!!!",
-"!!!!!!!!!!!!!!!!",
-"!!!!!! !!!!!!!",
-"!!!!!! !!!!!!!",
-"!!!!!! !!!!!!!",
-"!!!!!! !!!!!!!",
-"!!!!!! !!!!!!!",
-"!!!!!! !!!!!!!",
-"!!! !!!!",
-"!!!! !!!!!",
-"!!!!! !!!!!!",
-"!!!!!! !!!!!!!",
-"!!!!!!! !!!!!!!!",
-"!!!!!!!!!!!!!!!!",
-"!!!!!!!!!!!!!!!!"};
-
-/* XPM */
-static const char* pl_sort[] = {
-"16 16 2 1",
-" c #000000",
-"! c #C0C0C0",
-"!!!!!!!!!!!!!!!!",
-"!!!!!!!!!!!!!!!!",
-"!!!!!!!!!!!!!!!!",
-"!!!!!!!!!!!!!!!!",
-"!!!! !!!!! !!!!!",
-"!!!! !!!! !!!!",
-"!!!! !!! !!!",
-"!!!! !!!!! !!!!!",
-"!!!! !!!!! !!!!!",
-"!!!! !!!!! !!!!!",
-"!!!! !!!!! !!!!!",
-"!! !!! !!!!!",
-"!!! !!!! !!!!!",
-"!!!! !!!!! !!!!!",
-"!!!!!!!!!!!!!!!!",
-"!!!!!!!!!!!!!!!!"};
-
+++ /dev/null
-//{{NO_DEPENDENCIES}}
-// Microsoft Developer Studio generated include file.
-// Used by wxOsmo4.rc
-//
-#define IDI_OSMO_ICON 101
-
-// Next default values for new objects
-//
-#ifdef APSTUDIO_INVOKED
-#ifndef APSTUDIO_READONLY_SYMBOLS
-#define _APS_NEXT_RESOURCE_VALUE 104
-#define _APS_NEXT_COMMAND_VALUE 40001
-#define _APS_NEXT_CONTROL_VALUE 1000
-#define _APS_NEXT_SYMED_VALUE 101
-#endif
-#endif
+++ /dev/null
-/* XPM */
-static const char* tool_open_file[] = {
-"16 16 2 1",
-" c #000000",
-"! c none",
-"!!!!!!!!!!!!!!!!",
-"!!!!!!!!!!!!!!!!",
-"!!!!!!!!!!!!!!!!",
-"!!!!!!!!!!!!!!!!",
-"!!!!!!! !!!!!!!",
-"!!!!!! !!!!!!",
-"!!!!! !!!!!",
-"!!!! !!!!",
-"!!! !!!",
-"!! !!",
-"!! !!",
-"!!!!!!!!!!!!!!!!",
-"!! !!",
-"!! !!",
-"!!!!!!!!!!!!!!!!",
-"!!!!!!!!!!!!!!!!"};
-
-/* XPM */
-static const char* tool_prev[] = {
-"16 16 3 1",
-" c #000000",
-"! c none",
-"# c #FF0000",
-"!!!!!!!!!!!!!!!!",
-"!!!!!!!!!!!!!!!!",
-"!!!!!!!!!!!!!!!!",
-"!!!!!!!!!!!! !!",
-"!!!!!!!!!! !!",
-"!!!!!!!! ## !!",
-"!!!!!! #### !!",
-"!!!! ###### !!",
-"!!! ######## !!",
-"!!!! ##### !!",
-"!!!!!! ### !!",
-"!!!!!!!! # !!",
-"!!!!!!!!!! !!",
-"!!!!!!!!!!!! !!",
-"!!!!!!!!!!!!!!!!",
-"!!!!!!!!!!!!!!!!"};
-
-/* XPM */
-static const char* tool_next[] = {
-"16 16 3 1",
-" c #000000",
-"! c none",
-"# c #FF0000",
-"!!!!!!!!!!!!!!!!",
-"!!!!!!!!!!!!!!!!",
-"!!!!!!!!!!!!!!!!",
-"!! !!!!!!!!!!!!",
-"!! !!!!!!!!!!",
-"!! ## !!!!!!!!",
-"!! #### !!!!!!",
-"!! ###### !!!!",
-"!! ######## !!!",
-"!! ###### !!!!",
-"!! #### !!!!!!",
-"!! ## !!!!!!!!",
-"!! !!!!!!!!!!",
-"!! !!!!!!!!!!!!",
-"!!!!!!!!!!!!!!!!",
-"!!!!!!!!!!!!!!!!"};
-
-/* XPM */
-static const char* tool_play[] = {
-"16 16 2 1",
-" c #000000",
-"! c none",
-"!!!!!!!!!!!!!!!!",
-"!!!!!!!!!!!!!!!!",
-"!!!!!!!!!!!!!!!!",
-"!! !!!!!!!!!!!!",
-"!! !!!!!!!!!!",
-"!! !!!!!!!!",
-"!! !!!!!!",
-"!! !!!!",
-"!! !!",
-"!! !!!!",
-"!! !!!!!!",
-"!! !!!!!!!!",
-"!! !!!!!!!!!!",
-"!! !!!!!!!!!!!!",
-"!!!!!!!!!!!!!!!!",
-"!!!!!!!!!!!!!!!!"};
-
-/* XPM */
-static const char* tool_pause[] = {
-"16 16 3 1",
-" c #000000",
-"! c #808080",
-"# c none",
-"################",
-"################",
-"################",
-"### !##! ###",
-"### !##! ###",
-"### !##! ###",
-"### !##! ###",
-"### !##! ###",
-"### !##! ###",
-"### !##! ###",
-"### !##! ###",
-"### !##! ###",
-"### !##! ###",
-"### !##! ###",
-"################",
-"################"};
-
-
-/* XPM */
-static const char* tool_step[] = {
-"16 16 2 1",
-" c #000000",
-"! c none",
-"!!!!!!!!!!!!!!!!",
-"!!!!!!!!!!!!!!!!",
-"!!!!!!!!!!!!!!!!",
-"!! !!!!!!!!!!!",
-"!! !!!!!!!!!",
-"!! !!!!!!!",
-"!!!! !!!!!",
-"!!!!!! !!!",
-"!!!!!!!! !!",
-"!!!!!! !!!",
-"!!!! !!!!!",
-"!! !!!!!!!",
-"!! !!!!!!!!!",
-"!! !!!!!!!!!!!",
-"!!!!!!!!!!!!!!!!",
-"!!!!!!!!!!!!!!!!"};
-
-
-/* XPM */
-static const char* tool_stop[] = {
-"16 16 2 1",
-" c #000000",
-"! c none",
-"!!!!!!!!!!!!!!!!",
-"!!!!!!!!!!!!!!!!",
-"!!!!!!!!!!!!!!!!",
-"!! !!",
-"!! !!",
-"!! !!",
-"!! !!",
-"!! !!",
-"!! !!",
-"!! !!",
-"!! !!",
-"!! !!",
-"!! !!",
-"!! !!",
-"!!!!!!!!!!!!!!!!",
-"!!!!!!!!!!!!!!!!"};
-
-/* XPM */
-static const char* tool_info[] = {
-"16 16 3 1",
-" c #000000",
-"! c none",
-"# c #0000FF",
-"!!!!!!!!!!!!!!!!",
-"!!!!! !!!!!",
-"!!! !!!",
-"!! ###### !!",
-"! ####!!#### !",
-"! ####!!#### !",
-" ############ ",
-" #####!!##### ",
-" ######!!##### ",
-" #####!!##### ",
-" #####!!##### ",
-"! ####!!#### !",
-"! #####!!### !",
-"!! ###### !!",
-"!!! !!!",
-"!!!!! !!!!!"};
-
-
-/* XPM */
-static const char* tool_config[] = {
-"16 16 3 1",
-" c #000000",
-"! c #808080",
-"# c none",
-"################",
-"################",
-"## ## ######",
-"## ## # ## # ##",
-"## ## #",
-"## #!# ####### #",
-"## # #!# ## ## #",
-"## #!# #!# ! # #",
-"## # #!# ## ## #",
-"## #!# #!##### #",
-"## # #!# ## ## #",
-"## #!# #!# ! # #",
-"## # #!# ## ## #",
-"## #",
-"################",
-"################"};
-
-/* XPM */
-static const char* tool_sw_2d[] = {
-"16 16 4 1",
-" c #FF0000",
-". c #C0C0C0",
-"+ c #0000FF",
-"@ c #000000",
-" .............. ",
-". ..++..++++.. .",
-".. +..+..+..+ ..",
-"... ..+..+.. ...",
-".... +...+. +...",
-"...+. +..+ .+...",
-"...+++ .+ ++....",
-"....... .......",
-"....@@ @@ @.....",
-"...@. .@.@ .....",
-"...@ ....@. ....",
-"... ..@@.@.. ...",
-".. @...@.@.@. ..",
-". ..@@@@@@@@.. .",
-" .............. ",
-"................"};
-
-/* XPM */
-static const char* tool_sw_3d[] = {
-"16 16 4 1",
-" c #FFFFFF",
-". c #C0C0C0",
-"+ c #0000FF",
-"@ c #000000",
-" ",
-"................",
-"....++..++++....",
-"...+..+..+..+...",
-"......+..+..+...",
-"....++...+..+...",
-"...+..+..+..+...",
-"...++++.++++....",
-"................",
-"....@@@@@@@.....",
-"...@...@.@......",
-"...@.....@......",
-"...@..@@.@......",
-"...@...@.@.@....",
-"....@@@@@@@@....",
-"................"};
-
+++ /dev/null
-/*
- * GPAC - Multimedia Framework C SDK
- *
- * Copyright (c) Jean Le Feuvre 2000-2005
- * All rights reserved
- *
- * This file is part of GPAC / Osmo4 wxWidgets GUI
- *
- * GPAC is free software; you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation; either version 2, or (at your option)
- * any later version.
- *
- * GPAC is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; see the file COPYING. If not, write to
- * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
- *
- *
- */
-
-#include "wxOsmo4.h"
-#include <gpac/options.h>
-#include <gpac/modules/codec.h>
-#include <gpac/modules/raster2d.h>
-#include <gpac/modules/font.h>
-#include <gpac/modules/audio_out.h>
-#include <gpac/modules/video_out.h>
-
-#include <gpac/iso639.h>
-
-#include "wxGPACControl.h"
-
-
-#define NUM_RATES 11
-static const char *BIFSRates[11] =
-{
- "5.0",
- "7.5",
- "10.0",
- "12.5",
- "15.0",
- "24.0",
- "25.0",
- "30.0",
- "50.0",
- "60.0",
- "100.0"
-};
-
-void wxGPACControl::SetYUVLabel()
-{
- u32 yuv_format = gf_term_get_option(m_pApp->m_term, GF_OPT_YUV_FORMAT);
- if (!yuv_format) {
- m_yuvtxt->SetLabel(wxT("(No YUV used)"));
- } else {
- char str[100];
- sprintf(str, "(%s used)", gf_4cc_to_str(yuv_format));
- m_yuvtxt->SetLabel(wxString(str, wxConvUTF8) );
- }
-}
-
-wxGPACControl::wxGPACControl(wxWindow *parent)
- : wxDialog(parent, -1, wxString(wxT("GPAC Control Panel")))
-{
- const char *sOpt;
- SetSize(320, 240);
- u32 i;
- wxBoxSizer *bs;
- Centre();
-
- m_pApp = (wxOsmo4Frame *)parent;
-
- s_main = new wxBoxSizer(wxVERTICAL);
-
- s_header = new wxBoxSizer(wxHORIZONTAL);
- //s_header->Add(new wxStaticText(this, 0, wxT("Category"), wxDefaultPosition, wxSize(60, 20)), wxALIGN_CENTER);
- m_select = new wxComboBox(this, ID_SELECT, wxT(""), wxDefaultPosition, wxSize(120, 30), 0, NULL, wxCB_READONLY);
- s_header->Add(m_select, 2, wxALIGN_CENTER | wxADJUST_MINSIZE);
- s_header->Add( new wxButton(this, ID_APPLY, wxT("Apply"), wxDefaultPosition,
-#ifdef WIN32
- wxSize(40, 20)
-#else
- wxSize(40, 30)
-#endif
- ),
- 1, wxALIGN_TOP|wxALIGN_RIGHT|wxADJUST_MINSIZE);
- s_main->Add(s_header, 0, wxEXPAND, 0);
-
- /*general section*/
- s_general = new wxBoxSizer(wxVERTICAL);
- m_loop = new wxCheckBox(this, 0, wxT("Loop at End"), wxPoint(10, 40), wxSize(140, 20));
- s_general->Add(m_loop);
- m_lookforsubs = new wxCheckBox(this, 0, wxT("Look for Subtitles"), wxPoint(180, 40), wxSize(140, 20));
- s_general->Add(m_lookforsubs);
- m_noconsole = new wxCheckBox(this, 0, wxT("Disable console messages"), wxPoint(10, 80), wxSize(180, 20));
- s_general->Add(m_noconsole);
- m_viewxmt = new wxCheckBox(this, 0, wxT("View graph in XMT-A format"), wxPoint(10, 120), wxSize(180, 20));
- s_general->Add(m_viewxmt);
- s_main->Add(s_general, 0, wxEXPAND, 0);
-
- /*MPEG-4 systems*/
- s_mpeg4 = new wxBoxSizer(wxVERTICAL);
- bs = new wxBoxSizer(wxHORIZONTAL);
- bs->Add(new wxStaticText(this, 0, wxT("Prefered Stream Language")), wxALIGN_CENTER | wxADJUST_MINSIZE);
- m_lang = new wxComboBox(this, 0, wxT(""), wxDefaultPosition, wxDefaultSize, 0, NULL, wxCB_READONLY);
- bs->Add(m_lang, wxALIGN_CENTER | wxADJUST_MINSIZE);
- s_mpeg4->Add(bs, 0, wxALL|wxEXPAND, 2);
-
- bs = new wxBoxSizer(wxHORIZONTAL);
- bs->Add(new wxStaticText(this, 0, wxT("Decoder Threading Mode")), wxALIGN_CENTER | wxADJUST_MINSIZE);
- m_thread = new wxComboBox(this, 0, wxT(""), wxDefaultPosition, wxDefaultSize, 0, NULL, wxCB_READONLY);
- bs->Add(m_thread, wxALIGN_CENTER | wxADJUST_MINSIZE);
- s_mpeg4->Add(bs, 0, wxALL|wxEXPAND, 2);
- m_bifsalwaysdrawn = new wxCheckBox(this, 0, wxT("Always draw late BIFS frames"));
- s_mpeg4->Add(m_bifsalwaysdrawn);
- m_singletime = new wxCheckBox(this, 0, wxT("Force Single Timeline"));
- s_mpeg4->Add(m_singletime);
- s_main->Add(s_mpeg4, 0, wxEXPAND, 0);
-
- /*media decoders*/
- s_mdec = new wxBoxSizer(wxVERTICAL);
- bs = new wxBoxSizer(wxHORIZONTAL);
- bs->Add(new wxStaticText(this, 0, wxT("Prefered Audio Output")), wxALIGN_CENTER | wxADJUST_MINSIZE);
- m_decaudio = new wxComboBox(this, 0, wxT(""), wxDefaultPosition, wxDefaultSize, 0, NULL, wxCB_READONLY);
- bs->Add(m_decaudio, wxALIGN_CENTER | wxADJUST_MINSIZE);
- s_mdec->Add(bs, 0, wxALL|wxEXPAND, 2);
- bs = new wxBoxSizer(wxHORIZONTAL);
- bs->Add(new wxStaticText(this, 0, wxT("Prefered Video Output")), wxALIGN_CENTER | wxADJUST_MINSIZE);
- m_decvideo = new wxComboBox(this, 0, wxT(""), wxDefaultPosition, wxDefaultSize, 0, NULL, wxCB_READONLY);
- bs->Add(m_decvideo, wxALIGN_CENTER | wxADJUST_MINSIZE);
- s_mdec->Add(bs, 0, wxALL|wxEXPAND, 2);
- s_main->Add(s_mdec, 0, wxEXPAND, 0);
-
- /*Rendering*/
- s_rend = new wxBoxSizer(wxVERTICAL);
- bs = new wxBoxSizer(wxHORIZONTAL);
- bs->Add(new wxStaticText(this, 0, wxT("Target Frame Rate")), wxALIGN_CENTER | wxADJUST_MINSIZE);
- m_fps = new wxComboBox(this, 0, wxT(""), wxDefaultPosition, wxDefaultSize, 0, NULL, wxCB_READONLY);
- bs->Add(m_fps, wxALIGN_CENTER | wxADJUST_MINSIZE);
- s_rend->Add(bs, 0, wxALL|wxEXPAND, 2);
- bs = new wxBoxSizer(wxHORIZONTAL);
- bs->Add(new wxStaticText(this, 0, wxT("Anti-Aliasing")), wxALIGN_CENTER | wxADJUST_MINSIZE);
- m_aa = new wxComboBox(this, 0, wxT(""), wxDefaultPosition, wxDefaultSize, 0, NULL, wxCB_READONLY);
- bs->Add(m_aa, wxALIGN_CENTER | wxADJUST_MINSIZE);
- s_rend->Add(bs, 0, wxALL|wxEXPAND, 2);
- bs = new wxBoxSizer(wxHORIZONTAL);
- bs->Add(new wxStaticText(this, 0, wxT("Graphics Driver")), wxALIGN_CENTER | wxADJUST_MINSIZE);
- m_graph = new wxComboBox(this, 0, wxT(""), wxDefaultPosition, wxDefaultSize, 0, NULL, wxCB_READONLY);
- bs->Add(m_graph, wxALIGN_CENTER | wxADJUST_MINSIZE);
- s_rend->Add(bs, 0, wxALL|wxEXPAND, 2);
- bs = new wxBoxSizer(wxHORIZONTAL);
- m_draw_bounds = new wxComboBox(this, 0, wxT(""), wxDefaultPosition, wxDefaultSize, 0, NULL, wxCB_READONLY);
- bs->Add(new wxStaticText(this, 0, wxT("Bounds")), wxALIGN_CENTER | wxADJUST_MINSIZE | wxALIGN_RIGHT);
- bs->Add(m_draw_bounds, wxALIGN_CENTER | wxADJUST_MINSIZE);
- s_rend->Add(bs, 0, wxALL|wxEXPAND, 2);
- m_fast = new wxCheckBox(this, 0, wxT("Fast Rendering"));
- m_force_size = new wxCheckBox(this, 0, wxT("Force Scene Size"));
- bs = new wxBoxSizer(wxHORIZONTAL);
- bs->Add(m_fast, wxALIGN_CENTER | wxADJUST_MINSIZE);
- bs->Add(m_force_size, wxALIGN_CENTER | wxADJUST_MINSIZE);
- s_rend->Add(bs, 0, wxALL|wxEXPAND, 2);
- m_use3D = new wxCheckBox(this, 0, wxT("Use 3D Renderer"));
- s_rend->Add(m_use3D, 0, wxALL|wxEXPAND, 2);
- m_bWas3D = m_use3D->GetValue();
- s_main->Add(s_rend, 0, wxEXPAND, 0);
-
- /*Render 2D*/
- s_rend2d = new wxBoxSizer(wxVERTICAL);
- m_direct = new wxCheckBox(this, 0, wxT("Direct Rendering"));
- s_rend2d->Add(m_direct, 0, wxALL|wxEXPAND, 2);
- m_scalable = new wxCheckBox(this, 0, wxT("Scalable Zoom"));
- s_rend2d->Add(m_scalable, 0, wxALL|wxEXPAND, 2);
- bs = new wxBoxSizer(wxHORIZONTAL);
- m_noyuv = new wxCheckBox(this, 0, wxT("Disable YUV hardware"));
- bs->Add(m_noyuv, wxALIGN_CENTER | wxADJUST_MINSIZE);
- m_yuvtxt = new wxStaticText(this, 0, wxT("(No YUV used)"), wxDefaultPosition, wxSize(60, 20), wxALIGN_LEFT);
- bs->Add(m_yuvtxt, wxALIGN_CENTER|wxADJUST_MINSIZE);
- s_rend2d->Add(bs, 0, wxALL|wxEXPAND, 2);
- s_main->Add(s_rend2d, 0, wxEXPAND, 0);
-
- /*Render 3D*/
- s_rend3d = new wxBoxSizer(wxVERTICAL);
- m_raster_outlines = new wxCheckBox(this, 0, wxT("Use OpenGL Raster outlines"));
- s_rend3d->Add(m_raster_outlines, 0, wxALL|wxEXPAND, 2);
- m_polyaa = new wxCheckBox(this, 0, wxT("Enable polygon anti-aliasing"));
- s_rend3d->Add(m_polyaa, 0, wxALL|wxEXPAND, 2);
- m_nobackcull = new wxCheckBox(this, 0, wxT("Disable backface culling"));
- s_rend3d->Add(m_nobackcull, 0, wxALL|wxEXPAND, 2);
-
- bs = new wxBoxSizer(wxHORIZONTAL);
- bs->Add(new wxStaticText(this, 0, wxT("Wireframe mode")), wxALIGN_CENTER | wxADJUST_MINSIZE);
- m_wire = new wxComboBox(this, 0, wxT(""), wxDefaultPosition, wxDefaultSize, 0, NULL, wxCB_READONLY);
- bs->Add(m_wire, wxALIGN_CENTER | wxADJUST_MINSIZE);
- s_rend3d->Add(bs, 0, wxALL|wxEXPAND, 2);
-
- bs = new wxBoxSizer(wxHORIZONTAL);
- bs->Add(new wxStaticText(this, 0, wxT("Draw Normals")), wxALIGN_CENTER | wxADJUST_MINSIZE);
- m_normals = new wxComboBox(this, 0, wxT(""), wxDefaultPosition, wxDefaultSize, 0, NULL, wxCB_READONLY);
- bs->Add(m_normals, wxALIGN_CENTER | wxADJUST_MINSIZE);
- s_rend3d->Add(bs, 0, wxALL|wxEXPAND, 2);
-
- m_emulpow2 = new wxCheckBox(this, 0, wxT("Emulate power-of-two textures for video"));
- s_rend3d->Add(m_emulpow2, 0, wxALL|wxEXPAND, 2);
- m_norectext = new wxCheckBox(this, 0, wxT("Disable rectangular texture extensions"));
- s_rend3d->Add(m_norectext, 0, wxALL|wxEXPAND, 2);
- m_copypixels = new wxCheckBox(this, 0, wxT("Bitmap node uses direct pixel copy"));
- s_rend3d->Add(m_copypixels, 0, wxALL|wxEXPAND, 2);
- s_main->Add(s_rend3d, 0, wxEXPAND, 0);
-
- /*video*/
- s_video = new wxBoxSizer(wxVERTICAL);
- bs = new wxBoxSizer(wxHORIZONTAL);
- bs->Add(new wxStaticText(this, 0, wxT("Video Driver")), wxALIGN_CENTER | wxADJUST_MINSIZE | wxALIGN_RIGHT);
- m_video = new wxComboBox(this, 0, wxT(""), wxDefaultPosition, wxDefaultSize, 0, NULL, wxCB_READONLY);
- bs->Add(m_video , wxALIGN_CENTER | wxADJUST_MINSIZE);
- s_video->Add(bs, 0, wxALL|wxEXPAND, 2);
- m_switchres = new wxCheckBox(this, 0, wxT("Change video resolution in fullscreen"));
- s_video->Add(m_switchres, 0, wxALL|wxEXPAND, 2);
- m_usehwmem = new wxCheckBox(this, 0, wxT("Use hardware memory in 2D mode"));
- s_video->Add(m_usehwmem, 0, wxALL|wxEXPAND, 2);
- s_main->Add(s_video, 0, wxEXPAND, 0);
-
-
- /*audio*/
- s_audio = new wxBoxSizer(wxVERTICAL);
- bs = new wxBoxSizer(wxHORIZONTAL);
- bs->Add(new wxStaticText(this, 0, wxT("Audio Driver")), wxALIGN_CENTER | wxADJUST_MINSIZE);
- m_audio = new wxComboBox(this, ID_AUDIO_DRIVER, wxT(""), wxDefaultPosition, wxDefaultSize, 0, NULL, wxCB_READONLY);
- bs->Add(m_audio, wxALIGN_CENTER | wxADJUST_MINSIZE);
- s_audio->Add(bs, 0, wxALL|wxEXPAND, 2);
- m_forcecfg = new wxCheckBox(this, ID_FORCE_AUDIO, wxT("Force Audio Config"));
- m_forcecfg->SetValue(1);
- s_audio->Add(m_forcecfg, 0, wxALL|wxEXPAND, 2);
-
-
- bs = new wxBoxSizer(wxHORIZONTAL);
- bs->Add(new wxStaticText(this, 0, wxT("Number of buffers")), wxALIGN_CENTER|wxADJUST_MINSIZE);
- m_nbbuf = new wxSpinCtrl(this, -1, wxT(""), wxDefaultPosition, wxSize(20, 20), wxSP_WRAP | wxSP_ARROW_KEYS, 1, 30, 15);
- m_nbbuf->SetValue(8);
- bs->Add(m_nbbuf, wxALIGN_CENTER | wxADJUST_MINSIZE);
- s_audio->Add(bs, 0, wxALL|wxEXPAND, 2);
-
- bs = new wxBoxSizer(wxHORIZONTAL);
- bs->Add(new wxStaticText(this, 0, wxT("Total length in ms")), wxALIGN_CENTER | wxADJUST_MINSIZE);
- m_buflen = new wxSpinCtrl(this, -1, wxT(""), wxDefaultPosition, wxSize(20, 20), wxSP_WRAP | wxSP_ARROW_KEYS, 1, 1000);
- m_buflen->SetValue(400);
- bs->Add(m_buflen, wxALIGN_CENTER | wxADJUST_MINSIZE|wxLEFT,10);
- s_audio->Add(bs, 0, wxALL|wxEXPAND, 2);
-
- m_noresync = new wxCheckBox(this, -1, wxT("Disable Resynchronization"));
- s_audio->Add(m_noresync);
- m_nomulitch = new wxCheckBox(this, -1, wxT("Disable Multichannel"));
- s_audio->Add(m_nomulitch);
-#ifdef WIN32
- m_notifs = new wxCheckBox(this, -1, wxT("Disable DirectSound Notifications"));
- s_audio->Add(m_notifs);
-#endif
- s_main->Add(s_audio, 0, wxEXPAND, 0);
-
- /*font*/
- s_font = new wxBoxSizer(wxVERTICAL);
- bs = new wxBoxSizer(wxHORIZONTAL);
- bs->Add(new wxStaticText(this, 0, wxT("Font Engine")), wxALIGN_CENTER | wxADJUST_MINSIZE | wxALIGN_RIGHT);
- m_font = new wxComboBox(this, 0, wxT(""), wxDefaultPosition, wxDefaultSize, 0, NULL, wxCB_READONLY);
- bs->Add(m_font, wxALIGN_CENTER | wxADJUST_MINSIZE);
- s_font->Add(bs, 0, wxALL|wxEXPAND, 2);
- bs = new wxBoxSizer(wxHORIZONTAL);
- bs->Add(new wxStaticText(this, 0, wxT("System Font Directory")), wxALIGN_CENTER | wxADJUST_MINSIZE | wxALIGN_RIGHT);
- m_fontdir = new wxButton(this, ID_FONT_DIR, wxT("..."), wxDefaultPosition, wxDefaultSize);
- bs->Add(m_fontdir, wxALIGN_CENTER | wxADJUST_MINSIZE);
- s_font->Add(bs, 0, wxALL|wxEXPAND, 2);
- bs = new wxBoxSizer(wxHORIZONTAL);
- bs->Add(new wxStaticText(this, 0, wxT("Text Texturing Mode")), wxALIGN_CENTER | wxADJUST_MINSIZE | wxALIGN_RIGHT);
- m_texturemode = new wxComboBox(this, 0, wxT(""), wxDefaultPosition, wxDefaultSize, 0, NULL, wxCB_READONLY);
- bs->Add(m_texturemode, wxALIGN_CENTER | wxADJUST_MINSIZE);
- s_font->Add(bs, 0, wxALL|wxEXPAND, 2);
- s_main->Add(s_font, 0, wxEXPAND, 0);
-
- /*download*/
- s_dnld = new wxBoxSizer(wxVERTICAL);
- bs = new wxBoxSizer(wxHORIZONTAL);
- bs->Add(new wxStaticText(this, 0, wxT("Cache Directory")), wxALIGN_CENTER | wxADJUST_MINSIZE | wxALIGN_RIGHT);
- m_cachedir = new wxButton(this, ID_CACHE_DIR, wxT("..."));
- bs->Add(m_cachedir, wxALIGN_CENTER | wxADJUST_MINSIZE);
- s_dnld->Add(bs, 0, wxALL|wxEXPAND, 2);
- m_cleancache = new wxCheckBox(this, -1, wxT("Remove temp files on exit"));
- s_dnld->Add(m_cleancache);
- m_restartcache = new wxCheckBox(this, -1, wxT("Always redownload incomplete cached files"));
- s_dnld->Add(m_restartcache);
- bs = new wxBoxSizer(wxHORIZONTAL);
- m_progressive = new wxCheckBox(this, ID_PROGRESSIVE, wxT("XML progressive load"));
- bs->Add(m_progressive, wxALIGN_CENTER | wxADJUST_MINSIZE);
- m_sax_duration = new wxTextCtrl(this, 0, wxT(""), wxPoint(10, 120), wxSize(60, 20));
- bs->Add(m_sax_duration, wxALIGN_CENTER | wxADJUST_MINSIZE);
- bs->Add(new wxStaticText(this, 0, wxT("max load slice (ms)")), wxADJUST_MINSIZE | wxALIGN_CENTER);
- s_dnld->Add(bs, 0, wxALL|wxEXPAND, 2);
- bs = new wxBoxSizer(wxHORIZONTAL);
- m_use_proxy = new wxCheckBox(this, ID_USE_PROXY, wxT("Use proxy"));
- bs->Add(m_use_proxy, wxALIGN_CENTER | wxADJUST_MINSIZE);
- m_proxy_name = new wxTextCtrl(this, 0, wxT(""), wxPoint(10, 120), wxSize(60, 20));
- bs->Add(m_proxy_name, wxALIGN_CENTER | wxADJUST_MINSIZE);
- s_dnld->Add(bs, 0, wxALL|wxEXPAND, 2);
- s_main->Add(s_dnld, 0, wxEXPAND, 0);
-
- /*streaming*/
- s_stream = new wxBoxSizer(wxVERTICAL);
- bs = new wxBoxSizer(wxHORIZONTAL);
- bs->Add(new wxStaticText(this, 0, wxT("Default RTSP port")), wxALIGN_CENTER | wxADJUST_MINSIZE | wxALIGN_RIGHT);
- m_port = new wxComboBox(this, ID_RTSP_PORT, wxT(""), wxPoint(160, 40), wxSize(140, 30), 0, NULL, wxCB_READONLY);
- bs->Add(m_port, wxALIGN_CENTER | wxADJUST_MINSIZE);
- s_stream->Add(bs, 0, wxALL|wxEXPAND, 2);
- m_rtsp = new wxCheckBox(this, ID_RTP_OVER_RTSP, wxT("RTP over RTSP"), wxPoint(10, 80), wxSize(140, 20));
- m_reorder = new wxCheckBox(this, -1, wxT("use RTP reordering"), wxPoint(160, 80), wxSize(130, 20));
- bs = new wxBoxSizer(wxHORIZONTAL);
- bs->Add(m_rtsp, wxALIGN_CENTER | wxADJUST_MINSIZE);
- bs->Add(m_reorder, wxALIGN_CENTER | wxADJUST_MINSIZE);
- s_stream->Add(bs, 0, wxALL|wxEXPAND, 2);
- bs = new wxBoxSizer(wxHORIZONTAL);
- m_timeout = new wxTextCtrl(this, 0, wxT(""), wxPoint(10, 120), wxSize(60, 20));
- bs->Add(new wxStaticText(this, 0, wxT("Control Timeout (ms): ")), wxALIGN_CENTER | wxADJUST_MINSIZE | wxALIGN_RIGHT);
- bs->Add(m_timeout, wxALIGN_CENTER | wxADJUST_MINSIZE);
- s_stream->Add(bs, 0, wxALL|wxEXPAND, 2);
- bs = new wxBoxSizer(wxHORIZONTAL);
- m_buffer = new wxTextCtrl(this, 0, wxT(""), wxPoint(10, 150), wxSize(60, 20));
- bs->Add(new wxStaticText(this, 0, wxT("Media Buffering (ms): ")), wxALIGN_CENTER | wxADJUST_MINSIZE | wxALIGN_RIGHT);
- bs->Add(m_buffer, wxALIGN_CENTER | wxADJUST_MINSIZE);
- s_stream->Add(bs, 0, wxALL|wxEXPAND, 2);
- bs = new wxBoxSizer(wxHORIZONTAL);
- m_dorebuffer = new wxCheckBox(this, ID_RTSP_REBUFFER, wxT("Rebuffer if below"));
- bs->Add(m_dorebuffer, wxALIGN_CENTER | wxADJUST_MINSIZE);
- m_rebuffer = new wxTextCtrl(this, 0, wxT(""), wxPoint(200, 180), wxSize(60, 20));
- bs->Add(m_rebuffer, wxALIGN_CENTER | wxADJUST_MINSIZE);
- m_rebuffer->Disable();
- s_stream->Add(bs, 0, wxALL|wxEXPAND, 2);
- s_main->Add(s_stream, 0, wxEXPAND, 0);
-
- /*streaming cache*/
- s_rec = new wxBoxSizer(wxVERTICAL);
- bs = new wxBoxSizer(wxHORIZONTAL);
- bs->Add(new wxStaticText(this, 0, wxT("Record To: ")), wxALIGN_CENTER | wxADJUST_MINSIZE | wxALIGN_RIGHT);
- m_recdir = new wxButton(this, ID_RECORD_DIR, wxT("..."));
- bs->Add(m_recdir, wxALIGN_CENTER | wxADJUST_MINSIZE);
- s_rec->Add(bs, 0, wxALL|wxEXPAND, 2);
- m_overwrite = new wxCheckBox(this, -1, wxT("Overwrite existing files"));
- s_rec->Add(m_overwrite);
- bs = new wxBoxSizer(wxHORIZONTAL);
- m_usename = new wxCheckBox(this, ID_USE_FILENAME, wxT("Use filename"));
- m_recfile = new wxTextCtrl(this, 0, wxT(""));
- bs->Add(m_usename, wxALIGN_CENTER | wxADJUST_MINSIZE);
- bs->Add(m_recfile, wxALIGN_CENTER | wxADJUST_MINSIZE);
- s_rec->Add(bs, 0, wxALL|wxEXPAND, 2);
- s_main->Add(s_rec, 0, wxEXPAND, 0);
-
- /*load options*/
- GF_Config *cfg = m_pApp->m_user.config;
- /*general*/
- sOpt = gf_cfg_get_key(cfg, "General", "Loop");
- m_loop->SetValue((sOpt && !stricmp(sOpt, "yes")) ? 1 : 0);
- sOpt = gf_cfg_get_key(cfg, "General", "LookForSubtitles");
- m_lookforsubs->SetValue((sOpt && !stricmp(sOpt, "no")) ? 1 : 0);
- sOpt = gf_cfg_get_key(cfg, "General", "ConsoleOff");
- m_noconsole->SetValue((sOpt && !stricmp(sOpt, "yes")) ? 1 : 0);
- sOpt = gf_cfg_get_key(cfg, "General", "ViewXMT");
- m_viewxmt->SetValue((sOpt && !stricmp(sOpt, "yes")) ? 1 : 0);
-
- /*systems config*/
- sOpt = gf_cfg_get_key(cfg, "Systems", "Language3CC");
- if (!sOpt) sOpt = "eng";
- u32 select = 0;
- i=0;
- while (GF_ISO639_Lang[i]) {
- /*only use common languages (having both 2- and 3-char code names)*/
- if (GF_ISO639_Lang[i+2][0]) {
- m_lang->Append(wxString(GF_ISO639_Lang[i], wxConvUTF8) );
- if (sOpt && !stricmp(sOpt, GF_ISO639_Lang[i+1])) select = m_lang->GetCount() - 1;
- }
- i+=3;
- }
- m_lang->SetSelection(select);
- sOpt = gf_cfg_get_key(cfg, "Systems", "ThreadingPolicy");
- select = 0;
- m_thread->Append(wxT("Single Thread"));
- m_thread->Append(wxT("Mutli Thread"));
- if (sOpt && !stricmp(sOpt, "Multi")) select = 1;
- m_thread->Append(wxT("Free"));
- if (sOpt && !stricmp(sOpt, "Free")) select = 2;
- m_thread->SetSelection(select);
- sOpt = gf_cfg_get_key(cfg, "Systems", "ForceSingleClock");
- m_singletime->SetValue((sOpt && !stricmp(sOpt, "yes")) ? 1 : 0);
- sOpt = gf_cfg_get_key(cfg, "Systems", "AlwaysDrawBIFS");
- m_bifsalwaysdrawn->SetValue((sOpt && !stricmp(sOpt, "yes")) ? 1 : 0);
-
-
- /*audio dec enum*/
- sOpt = gf_cfg_get_key(cfg, "Systems", "DefAudioDec");
- u32 count = gf_modules_get_count(m_pApp->m_user.modules);
- GF_BaseDecoder *ifc_d;
- select = 0;
- s32 to_sel = 0;
- for (i=0; i<count; i++) {
- ifc_d = (GF_BaseDecoder *) gf_modules_load_interface(m_pApp->m_user.modules, i, GF_MEDIA_DECODER_INTERFACE);
- if (!ifc_d) continue;
- if (ifc_d->CanHandleStream(ifc_d, GF_STREAM_AUDIO, NULL, 0)) {
- if (sOpt && !stricmp(ifc_d->module_name, sOpt)) select = to_sel;
- m_decaudio->Append(wxString(ifc_d->module_name, wxConvUTF8) );
- to_sel++;
- }
- gf_modules_close_interface((GF_BaseInterface *) ifc_d);
- }
- m_decaudio->SetSelection(select);
-
- /*video dec enum*/
- sOpt = gf_cfg_get_key(cfg, "Systems", "DefVideoDec");
- select = to_sel = 0;
- for (i=0; i<count; i++) {
- ifc_d = (GF_BaseDecoder *) gf_modules_load_interface(m_pApp->m_user.modules, i, GF_MEDIA_DECODER_INTERFACE);
- if (!ifc_d) continue;
- if (ifc_d->CanHandleStream(ifc_d, GF_STREAM_VISUAL, NULL, 0)) {
- if (sOpt && !stricmp(ifc_d->module_name, sOpt)) select = to_sel;
- m_decvideo->Append(wxString(ifc_d->module_name, wxConvUTF8) );
- to_sel++;
- }
- gf_modules_close_interface((GF_BaseInterface *) ifc_d);
- }
- m_decvideo->SetSelection(select);
-
- /*rendering FIXME*/
- m_bWas3D = 0;
- m_use3D->SetValue(m_bWas3D ? 1 : 0);
-
- sOpt = gf_cfg_get_key(cfg, "Compositor", "ForceSceneSize");
- m_force_size->SetValue( (sOpt && !stricmp(sOpt, "yes")) ? 1 : 0);
-
- sOpt = gf_cfg_get_key(cfg, "Compositor", "FrameRate");
- if (!sOpt) sOpt = "30.0";
- select = 0;
- for (i = 0; i<NUM_RATES; i++) {
- m_fps->Append(wxString(BIFSRates[i], wxConvUTF8) );
- if (sOpt && !stricmp(sOpt, BIFSRates[i]) ) select = i;
- }
- m_fps->SetSelection(select);
-
- sOpt = gf_cfg_get_key(cfg, "Compositor", "HighSpeed");
- m_fast->SetValue( (sOpt && !stricmp(sOpt, "yes")) ? 1 : 0);
-
- sOpt = gf_cfg_get_key(cfg, "Compositor", "AntiAlias");
- m_aa->Append(wxT("None"));
- m_aa->Append(wxT("Text only"));
- m_aa->Append(wxT("Complete"));
- select = 2;
- if (sOpt && !stricmp(sOpt, "Text")) select = 1;
- else if (sOpt && !stricmp(sOpt, "None")) select = 0;
- m_aa->SetSelection(select);
-
- sOpt = gf_cfg_get_key(cfg, "Compositor", "BoundingVolume");
- m_draw_bounds->Append(wxT("None"));
- m_draw_bounds->Append(wxT("Box/Rect"));
- m_draw_bounds->Append(wxT("AABB Tree"));
- select = 0;
- if (sOpt && !stricmp(sOpt, "Box")) select = 1;
- else if (sOpt && !stricmp(sOpt, "AABB")) select = 2;
- m_draw_bounds->SetSelection(select);
-
- /*render2d*/
- sOpt = gf_cfg_get_key(cfg, "Compositor", "DirectDraw");
- m_direct->SetValue( (sOpt && !stricmp(sOpt, "yes")) ? 1 : 0);
- sOpt = gf_cfg_get_key(cfg, "Compositor", "ScalableZoom");
- m_scalable->SetValue( (sOpt && !stricmp(sOpt, "yes")) ? 1 : 0);
- sOpt = gf_cfg_get_key(cfg, "Compositor", "DisableYUV");
- m_noyuv->SetValue( (sOpt && !stricmp(sOpt, "yes")) ? 1 : 0);
- SetYUVLabel();
-
- /*graphics driver enum*/
- sOpt = gf_cfg_get_key(cfg, "Compositor", "Raster2D");
- GF_BaseInterface *ifce;
- select = to_sel = 0;
- for (i=0; i<count; i++) {
- ifce = gf_modules_load_interface(m_pApp->m_user.modules, i, GF_RASTER_2D_INTERFACE);
- if (!ifce) continue;
- if (sOpt && !stricmp(((GF_BaseInterface *)ifce)->module_name, sOpt)) select = to_sel;
- m_graph->Append(wxString(((GF_BaseInterface *)ifce)->module_name, wxConvUTF8) );
- gf_modules_close_interface(ifce);
- to_sel++;
- }
- m_graph->SetSelection(select);
-
- /*render3d*/
- sOpt = gf_cfg_get_key(cfg, "Compositor", "RasterOutlines");
- m_raster_outlines->SetValue( (sOpt && !stricmp(sOpt, "yes")) ? 1 : 0);
- sOpt = gf_cfg_get_key(cfg, "Compositor", "EmulatePOW2");
- m_emulpow2->SetValue((sOpt && !stricmp(sOpt, "yes")) ? 1 : 0);
- sOpt = gf_cfg_get_key(cfg, "Compositor", "PolygonAA");
- m_polyaa->SetValue((sOpt && !stricmp(sOpt, "yes")) ? 1 : 0);
- sOpt = gf_cfg_get_key(cfg, "Compositor", "BackFaceCulling");
- m_nobackcull->SetValue((sOpt && !stricmp(sOpt, "Off")) ? 1 : 0);
- sOpt = gf_cfg_get_key(cfg, "Compositor", "Wireframe");
- sOpt = gf_cfg_get_key(cfg, "Compositor", "BitmapCopyPixels");
- m_copypixels->SetValue((sOpt && !stricmp(sOpt, "yes")) ? 1 : 0);
- sOpt = gf_cfg_get_key(cfg, "Compositor", "DisableRectExt");
- m_norectext->SetValue((sOpt && !stricmp(sOpt, "yes")) ? 1 : 0);
- m_wire->Append(wxT("No Wireframe"));
- m_wire->Append(wxT("Wireframe Only"));
- m_wire->Append(wxT("Solid and Wireframe"));
- sOpt = gf_cfg_get_key(cfg, "Compositor", "Wireframe");
- if (sOpt && !stricmp(sOpt, "WireOnly")) m_wire->SetSelection(1);
- else if (sOpt && !stricmp(sOpt, "WireOnSolid")) m_wire->SetSelection(2);
- else m_wire->SetSelection(0);
- m_normals->Append(wxT("Never"));
- m_normals->Append(wxT("Per Face"));
- m_normals->Append(wxT("Per Vertex"));
- sOpt = gf_cfg_get_key(cfg, "Compositor", "DrawNormals");
- if (sOpt && !stricmp(sOpt, "PerFace")) m_normals->SetSelection(1);
- else if (sOpt && !stricmp(sOpt, "PerVertex")) m_normals->SetSelection(2);
- else m_normals->SetSelection(0);
-
- /*video*/
- sOpt = gf_cfg_get_key(cfg, "Video", "SwitchResolution");
- m_switchres->SetValue( (sOpt && !stricmp(sOpt, "yes")) ? 1 : 0);
- sOpt = gf_cfg_get_key(cfg, "Video", "UseHardwareMemory");
- m_usehwmem->SetValue( (sOpt && !stricmp(sOpt, "yes")) ? 1 : 0);
- sOpt = gf_cfg_get_key(cfg, "Video", "DriverName");
- select = to_sel = 0;
- for (i=0; i<count; i++) {
- ifce = gf_modules_load_interface(m_pApp->m_user.modules, i, GF_VIDEO_OUTPUT_INTERFACE);
- if (!ifce) continue;
- if (sOpt && !stricmp(((GF_BaseInterface *)ifce)->module_name, sOpt)) select = to_sel;
- m_video->Append(wxString(((GF_BaseInterface *)ifce)->module_name, wxConvUTF8) );
- gf_modules_close_interface(ifce);
- to_sel++;
- }
- m_video->SetSelection(select);
-
- /*audio*/
- sOpt = gf_cfg_get_key(cfg, "Audio", "ForceConfig");
- m_forcecfg->SetValue( (sOpt && !stricmp(sOpt, "yes")) ? 1 : 0);
- sOpt = gf_cfg_get_key(cfg, "Audio", "NumBuffers");
- m_nbbuf->SetValue( sOpt ? wxString(sOpt, wxConvUTF8) : wxT("2"));
- sOpt = gf_cfg_get_key(cfg, "Audio", "TotalDuration");
- m_buflen->SetValue( sOpt ? wxString(sOpt, wxConvUTF8) : wxT("120"));
- wxCommandEvent event;
- ForceAudio(event);
- sOpt = gf_cfg_get_key(cfg, "Audio", "NoResync");
- m_noresync->SetValue( (sOpt && !stricmp(sOpt, "yes")) ? 1 : 0);
- sOpt = gf_cfg_get_key(cfg, "Audio", "DisableMultiChannel");
- m_nomulitch->SetValue( (sOpt && !stricmp(sOpt, "yes")) ? 1 : 0);
-
- /*driver enum*/
- sOpt = gf_cfg_get_key(cfg, "Audio", "DriverName");
- select = to_sel = 0;
- for (i=0; i<count; i++) {
- ifce = gf_modules_load_interface(m_pApp->m_user.modules, i, GF_AUDIO_OUTPUT_INTERFACE);
- if (!ifce) continue;
- if (sOpt && !stricmp(((GF_BaseInterface *)ifce)->module_name, sOpt)) select = to_sel;
- m_audio->Append(wxString(((GF_BaseInterface *)ifce)->module_name, wxConvUTF8) );
- gf_modules_close_interface(ifce);
- to_sel++;
- }
- m_audio->SetSelection(select);
-#ifdef WIN32
- sOpt = gf_cfg_get_key(cfg, "Audio", "DisableNotification");
- m_notifs->SetValue( (sOpt && !stricmp(sOpt, "yes")) ? 1 : 0);
- wxCommandEvent audevt;
- OnSetAudioDriver(audevt);
-#endif
-
- /*font*/
- sOpt = gf_cfg_get_key(cfg, "FontEngine", "FontReader");
- to_sel = select = 0;
- for (i=0; i<count; i++) {
- ifce = gf_modules_load_interface(m_pApp->m_user.modules, i, GF_FONT_READER_INTERFACE);
- if (!ifce) continue;
- if (sOpt && !stricmp(((GF_BaseInterface *)ifce)->module_name, sOpt)) select = to_sel;
- m_font->Append(wxString(((GF_BaseInterface *)ifce)->module_name, wxConvUTF8) );
- gf_modules_close_interface(ifce);
- to_sel++;
- }
- m_font->SetSelection(select);
- sOpt = gf_cfg_get_key(cfg, "FontEngine", "FontDirectory");
- if (sOpt) m_fontdir->SetLabel(wxString(sOpt, wxConvUTF8) );
- sOpt = gf_cfg_get_key(cfg, "Compositor", "TextureTextMode");
- m_texturemode->Append(wxT("Default"));
- m_texturemode->Append(wxT("Never"));
- m_texturemode->Append(wxT("Always"));
- if (sOpt && !stricmp(sOpt, "Always")) m_texturemode->SetSelection(2);
- else if (sOpt && !stricmp(sOpt, "3D")) m_texturemode->SetSelection(1);
- else m_texturemode->SetSelection(0);
-
- /*downloader*/
- sOpt = gf_cfg_get_key(cfg, "General", "CacheDirectory");
- if (sOpt) m_cachedir->SetLabel(wxString(sOpt, wxConvUTF8) );
- sOpt = gf_cfg_get_key(cfg, "Downloader", "CleanCache");
- m_cleancache->SetValue( (sOpt && !stricmp(sOpt, "yes")) ? 1 : 0);
- sOpt = gf_cfg_get_key(cfg, "Downloader", "RestartFiles");
- m_restartcache->SetValue( (sOpt && !stricmp(sOpt, "yes")) ? 1 : 0);
- sOpt = gf_cfg_get_key(cfg, "SAXLoader", "Progressive");
- m_progressive->SetValue( (sOpt && !stricmp(sOpt, "yes")) ? 1 : 0);
- sOpt = gf_cfg_get_key(cfg, "SAXLoader", "MaxDuration");
- m_sax_duration->SetValue(sOpt ? wxString(sOpt, wxConvUTF8) : wxT("30"));
- if (! m_progressive->GetValue()) m_sax_duration->Enable(0);
-
- sOpt = gf_cfg_get_key(cfg, "HTTPProxy", "Enabled");
- m_use_proxy->SetValue( (sOpt && !stricmp(sOpt, "yes")) ? 1 : 0);
- char szProxy[GF_MAX_PATH];
- strcpy(szProxy, "");
- sOpt = gf_cfg_get_key(cfg, "HTTPProxy", "Name");
- if (sOpt) {
- strcat(szProxy, sOpt);
- sOpt = gf_cfg_get_key(cfg, "HTTPProxy", "Port");
- if (sOpt) {
- strcat(szProxy, ":");
- strcat(szProxy, sOpt);
- }
- } else {
- m_use_proxy->SetValue(0);
- }
- m_proxy_name->SetValue( wxString((char *)szProxy, wxConvUTF8) );
- if (! m_use_proxy->GetValue()) m_proxy_name->Enable(0);
-
- /*streaming*/
- m_port->Append(wxT("554 (RTSP standard)"));
- m_port->Append(wxT("7070 (RTSP ext)"));
- m_port->Append(wxT("80 (RTSP / HTTP tunnel)"));
- m_port->Append(wxT("8080 (RTSP / HTTP tunnel)"));
- sOpt = gf_cfg_get_key(cfg, "Streaming", "DefaultPort");
- u32 port = 554;
- Bool force_rtsp = 0;
- if (sOpt) port = atoi(sOpt);
- switch (port) {
- case 8080:
- m_port->SetSelection(3);
- force_rtsp = 1;
- break;
- case 80:
- m_port->SetSelection(2);
- force_rtsp = 1;
- break;
- case 7070:
- m_port->SetSelection(1);
- break;
- default:
- m_port->SetSelection(0);
- break;
- }
-
- Bool use_rtsp = 0;
- sOpt = gf_cfg_get_key(cfg, "Streaming", "RTPoverRTSP");
- if (sOpt && !stricmp(sOpt, "yes")) use_rtsp = 1;
-
- if (force_rtsp) {
- m_rtsp->SetValue(1);
- m_rtsp->Enable(0);
- m_reorder->SetValue(0);
- m_reorder->Enable(0);
- } else {
- m_rtsp->SetValue(use_rtsp ? 1 : 0);
- m_rtsp->Enable(1);
- m_reorder->Enable(1);
- sOpt = gf_cfg_get_key(cfg, "Streaming", "ReorderSize");
- m_reorder->SetValue( (sOpt && !stricmp(sOpt, "0")) ? 1 : 0);
- }
- sOpt = gf_cfg_get_key(cfg, "Streaming", "RTSPTimeout");
- m_timeout->SetValue(sOpt ? wxString(sOpt, wxConvUTF8) : wxT("30000"));
- sOpt = gf_cfg_get_key(cfg, "Network", "BufferLength");
- m_buffer->SetValue(sOpt ? wxString(sOpt, wxConvUTF8) : wxT("3000"));
- sOpt = gf_cfg_get_key(cfg, "Network", "RebufferLength");
- u32 buf_len = 0;
- if (sOpt) buf_len = atoi(sOpt);
- if (buf_len) {
- m_dorebuffer->SetValue(1);
- m_rebuffer->SetValue(wxString(sOpt, wxConvUTF8));
- m_rebuffer->Enable(1);
- } else {
- m_dorebuffer->SetValue(0);
- m_rebuffer->SetValue(wxT("0"));
- m_rebuffer->Enable(0);
- }
-
- RTPoverRTSP(event);
-
- sOpt = gf_cfg_get_key(cfg, "StreamingCache", "RecordDirectory");
- if (!sOpt) sOpt = gf_cfg_get_key(cfg, "General", "CacheDirectory");
- if (sOpt) m_recdir->SetLabel(wxString(sOpt, wxConvUTF8));
- sOpt = gf_cfg_get_key(cfg, "StreamingCache", "KeepExistingFiles");
- m_overwrite->SetValue((sOpt && !stricmp(sOpt, "yes")) ? 0 : 1);
-
- sOpt = gf_cfg_get_key(cfg, "StreamingCache", "BaseFileName");
- if (sOpt) {
- m_usename->SetValue(1);
- m_recfile->Enable(1);
- m_recfile->SetValue(wxString(sOpt, wxConvUTF8));
- } else {
- m_usename->SetValue(0);
- m_recfile->Enable(0);
- m_recfile->SetValue(wxT("uses service URL"));
- }
-
- m_select->Append(wxT("General"));
- m_select->Append(wxT("MPEG-4 Systems"));
- m_select->Append(wxT("Media Decoders"));
- m_select->Append(wxT("Compositor"));
- m_select->Append(wxT("Renderer 2D"));
- m_select->Append(wxT("Renderer 3D"));
- m_select->Append(wxT("Video Output"));
- m_select->Append(wxT("Audio Output"));
- m_select->Append(wxT("Text Engine"));
- m_select->Append(wxT("File Download"));
- m_select->Append(wxT("Real-Time Streaming"));
- m_select->Append(wxT("Streaming Cache"));
-
- sOpt = gf_cfg_get_key(cfg, "General", "ConfigPanel");
- m_sel = sOpt ? atoi(sOpt) : 0;
- if (m_sel>11) m_sel=11;
- m_select->SetSelection(m_sel);
-
- DoSelect();
-}
-
-BEGIN_EVENT_TABLE(wxGPACControl, wxDialog)
- EVT_BUTTON(ID_APPLY, wxGPACControl::Apply)
- EVT_COMBOBOX(ID_SELECT, wxGPACControl::OnSetSelection)
- EVT_CHECKBOX(ID_FORCE_AUDIO, wxGPACControl::ForceAudio)
- EVT_COMBOBOX(ID_AUDIO_DRIVER, wxGPACControl::OnSetAudioDriver)
- EVT_BUTTON(ID_FONT_DIR, wxGPACControl::FontDir)
- EVT_BUTTON(ID_CACHE_DIR, wxGPACControl::CacheDir)
- EVT_CHECKBOX(ID_PROGRESSIVE, wxGPACControl::OnProgressive)
- EVT_CHECKBOX(ID_USE_PROXY, wxGPACControl::OnUseProxy)
- EVT_CHECKBOX(ID_RTP_OVER_RTSP, wxGPACControl::RTPoverRTSP)
- EVT_CHECKBOX(ID_RTSP_REBUFFER, wxGPACControl::Rebuffer)
- EVT_COMBOBOX(ID_RTSP_PORT, wxGPACControl::OnSetRTSPPort)
- EVT_CHECKBOX(ID_USE_FILENAME, wxGPACControl::OnUseFileName)
- EVT_BUTTON(ID_RECORD_DIR, wxGPACControl::OnRecDir)
-END_EVENT_TABLE()
-
-
-wxGPACControl::~wxGPACControl()
-{
- char str[20];
- sprintf(str, "%d", m_sel);
- gf_cfg_set_key(m_pApp->m_user.config, "General", "ConfigPanel", str);
-}
-
-
-void wxGPACControl::DoSelect()
-{
-
- /*hide everything*/
- s_main->Show(s_general, false);
- s_main->Show(s_mpeg4, false);
- s_main->Show(s_mdec, false);
- s_main->Show(s_rend, false);
- s_main->Show(s_rend2d, false);
- s_main->Show(s_rend3d, false);
- s_main->Show(s_video, false);
- s_main->Show(s_audio, false);
- s_main->Show(s_font, false);
- s_main->Show(s_dnld, false);
- s_main->Show(s_stream, false);
- s_main->Show(s_rec, false);
- switch (m_sel) {
- case 0: s_main->Show(s_general, true); break;
- case 1: s_main->Show(s_mpeg4, true); break;
- case 2: s_main->Show(s_mdec, true); break;
- case 3: s_main->Show(s_rend, true); break;
- case 4: s_main->Show(s_rend2d, true); break;
- case 5: s_main->Show(s_rend3d, true); break;
- case 6: s_main->Show(s_video, true); break;
- case 7: s_main->Show(s_audio, true); break;
- case 8: s_main->Show(s_font, true); break;
- case 9: s_main->Show(s_dnld, true); break;
- case 10: s_main->Show(s_stream, true); break;
- case 11: s_main->Show(s_rec, true); break;
- }
- SetSizer(s_main);
- s_main->Fit(this);
- //s_main->Layout();
- return;
-
-}
-
-void wxGPACControl::OnSetSelection(wxCommandEvent &WXUNUSED(event))
-{
- m_sel = m_select->GetSelection();
- DoSelect();
-}
-
-void wxGPACControl::FontDir(wxCommandEvent &WXUNUSED(event))
-{
- wxDirDialog dlg(this);
- dlg.SetPath(m_fontdir->GetLabel());
- if (dlg.ShowModal() == wxID_OK) {
- m_fontdir->SetLabel(dlg.GetPath());
- }
-}
-void wxGPACControl::CacheDir(wxCommandEvent &WXUNUSED(event))
-{
- wxDirDialog dlg(this);
- dlg.SetPath(m_cachedir->GetLabel());
- if (dlg.ShowModal() == wxID_OK) {
- m_cachedir->SetLabel(dlg.GetPath());
- }
-}
-
-void wxGPACControl::OnProgressive(wxCommandEvent &WXUNUSED(event))
-{
- m_sax_duration->Enable(m_progressive->GetValue() ? 1 : 0);
-}
-
-void wxGPACControl::OnUseProxy(wxCommandEvent &WXUNUSED(event))
-{
- m_proxy_name->Enable(m_use_proxy->GetValue() ? 1 : 0);
-}
-
-void wxGPACControl::RTPoverRTSP(wxCommandEvent &WXUNUSED(event))
-{
- m_reorder->Enable(m_rtsp->GetValue() ? 0 : 1);
-}
-
-void wxGPACControl::Rebuffer(wxCommandEvent &WXUNUSED(event))
-{
- if (m_dorebuffer->GetValue()) {
- m_rebuffer->Enable();
- } else {
- m_rebuffer->Disable();
- }
-}
-
-void wxGPACControl::OnSetRTSPPort(wxCommandEvent &WXUNUSED(event))
-{
- if (m_port->GetSelection() > 1) {
- m_rtsp->Enable(0);
- m_reorder->Enable(0);
- } else {
- m_rtsp->Enable(1);
- m_reorder->Enable(1);
- }
-}
-
-void wxGPACControl::OnRecDir(wxCommandEvent &WXUNUSED(event))
-{
- wxDirDialog dlg(this);
- dlg.SetPath(m_recdir->GetLabel());
- if (dlg.ShowModal() == wxID_OK) {
- m_recdir->SetLabel(dlg.GetPath());
- }
-}
-
-void wxGPACControl::OnUseFileName(wxCommandEvent &WXUNUSED(event))
-{
- if (m_usename->GetValue()) {
- m_recfile->Enable();
- m_recfile->SetValue(wxT("record"));
- } else {
- m_recfile->Disable();
- m_recfile->SetValue(wxT("uses service URL"));
- }
-}
-
-void wxGPACControl::ForceAudio(wxCommandEvent &WXUNUSED(event))
-{
- if (m_forcecfg->GetValue()) {
- m_nbbuf->Enable();
- m_buflen->Enable();
- } else {
- m_nbbuf->Disable();
- m_buflen->Disable();
- }
-}
-
-void wxGPACControl::OnSetAudioDriver(wxCommandEvent &WXUNUSED(event))
-{
-#ifdef WIN32
- if (strstr(m_audio->GetStringSelection().mb_str(wxConvUTF8), "DirectSound")) {
- m_notifs->Enable(1);
- } else {
- m_notifs->Enable(0);
- }
-#endif
-}
-
-
-
-void wxGPACControl::Apply(wxCommandEvent &WXUNUSED(event))
-{
- /*save options*/
- GF_Config *cfg = m_pApp->m_user.config;
-
- m_pApp->m_loop = m_loop->GetValue() ? 1 : 0;
- gf_cfg_set_key(cfg, "General", "Loop", m_loop->GetValue() ? "yes" : "no");
- m_pApp->m_lookforsubs = m_lookforsubs->GetValue() ? 1 : 0;
- gf_cfg_set_key(cfg, "General", "LookForSubtitles", m_lookforsubs->GetValue() ? "yes" : "no");
- m_pApp->m_console_off = m_noconsole->GetValue() ? 1 : 0;
- gf_cfg_set_key(cfg, "General", "ConsoleOff", m_noconsole->GetValue() ? "yes" : "no");
- gf_cfg_set_key(cfg, "General", "ViewXMT", m_viewxmt->GetValue() ? "yes" : "no");
-
- s32 sel = m_lang->GetSelection();
- u32 i=0;
- while (GF_ISO639_Lang[i]) {
- /*only use common languages (having both 2- and 3-char code names)*/
- if (GF_ISO639_Lang[i+2][0]) {
- if (!sel) break;
- sel--;
- }
- i+=3;
- }
- gf_cfg_set_key(cfg, "Systems", "LanguageName", GF_ISO639_Lang[i]);
- gf_cfg_set_key(cfg, "Systems", "Language3CC", GF_ISO639_Lang[i+1]);
- gf_cfg_set_key(cfg, "Systems", "Language2CC", GF_ISO639_Lang[i+2]);
-
-
- sel = m_thread->GetSelection();
- gf_cfg_set_key(cfg, "Systems", "ThreadingPolicy", (sel==0) ? "Single" : ( (sel==1) ? "Multi" : "Free"));
- gf_cfg_set_key(cfg, "Systems", "ForceSingleClock", m_singletime->GetValue() ? "yes" : "no");
- gf_cfg_set_key(cfg, "Systems", "AlwaysDrawBIFS", m_bifsalwaysdrawn->GetValue() ? "yes" : "no");
-
- gf_cfg_set_key(cfg, "Systems", "DefAudioDec", m_decaudio->GetStringSelection().mb_str(wxConvUTF8));
- gf_cfg_set_key(cfg, "Systems", "DefVideoDec", m_decvideo->GetStringSelection().mb_str(wxConvUTF8));
-
-
- gf_cfg_set_key(cfg, "Compositor", "HighSpeed", m_fast->GetValue() ? "yes" : "no");
- gf_cfg_set_key(cfg, "Compositor", "ForceSceneSize", m_force_size->GetValue() ? "yes" : "no");
-
- gf_cfg_set_key(cfg, "Compositor", "FrameRate", BIFSRates[m_fps->GetSelection()]);
- sel = m_aa->GetSelection();
- gf_cfg_set_key(cfg, "Compositor", "AntiAlias", (sel==0) ? "None" : ( (sel==1) ? "Text" : "All"));
- sel = m_draw_bounds->GetSelection();
- gf_cfg_set_key(cfg, "Compositor", "BoundingVolume", (sel==2) ? "AABB" : (sel==1) ? "Box" : "None");
-
- Bool is_3D = m_use3D->GetValue() ? 1 : 0;
- if (m_bWas3D != is_3D) {
- /*FIXME*/
- }
- gf_cfg_set_key(cfg, "Compositor", "Raster2D", m_graph->GetStringSelection().mb_str(wxConvUTF8));
-
- gf_cfg_set_key(cfg, "Compositor", "DirectDraw", m_direct->GetValue() ? "yes" : "no");
- gf_cfg_set_key(cfg, "Compositor", "ScalableZoom", m_scalable->GetValue() ? "yes" : "no");
- gf_cfg_set_key(cfg, "Compositor", "DisableYUV", m_noyuv->GetValue() ? "yes" : "no");
-
- gf_cfg_set_key(cfg, "Compositor", "RasterOutlines", m_raster_outlines->GetValue() ? "yes" : "no");
- gf_cfg_set_key(cfg, "Compositor", "EmulatePOW2", m_emulpow2->GetValue() ? "yes" : "no");
- gf_cfg_set_key(cfg, "Compositor", "PolygonAA", m_polyaa->GetValue() ? "yes" : "no");
- gf_cfg_set_key(cfg, "Compositor", "DisableRectExt", m_norectext->GetValue() ? "yes" : "no");
- gf_cfg_set_key(cfg, "Compositor", "BitmapCopyPixels", m_copypixels->GetValue() ? "yes" : "no");
- gf_cfg_set_key(cfg, "Compositor", "BackFaceCulling", m_nobackcull->GetValue() ? "Off" : "On");
-
- sel = m_wire->GetSelection();
- gf_cfg_set_key(cfg, "Compositor", "Wireframe", (sel==2) ? "WireOnSolid" : ( (sel==1) ? "WireOnly" : "WireNone" ) );
- sel = m_normals->GetSelection();
- gf_cfg_set_key(cfg, "Compositor", "DrawNormals", (sel==2) ? "PerVertex" : ( (sel==1) ? "PerFace" : "Never" ) );
-
- gf_cfg_set_key(cfg, "Video", "SwitchResolution", m_switchres->GetValue() ? "yes" : "no");
- gf_cfg_set_key(cfg, "Video", "UseHardwareMemory", m_usehwmem->GetValue() ? "yes" : "no");
- gf_cfg_set_key(cfg, "Video", "DriverName", m_video->GetStringSelection().mb_str(wxConvUTF8));
-
-
- gf_cfg_set_key(cfg, "Audio", "ForceConfig", m_forcecfg->GetValue() ? "yes" : "no");
- gf_cfg_set_key(cfg, "Audio", "NoResync", m_noresync->GetValue() ? "yes" : "no");
- gf_cfg_set_key(cfg, "Audio", "DisableMultiChannel", m_nomulitch->GetValue() ? "yes" : "no");
-
- gf_cfg_set_key(cfg, "Audio", "NumBuffers", wxString::Format(wxT("%d"), m_nbbuf->GetValue()).mb_str(wxConvUTF8) );
- gf_cfg_set_key(cfg, "Audio", "TotalDuration", wxString::Format(wxT("%d"), m_buflen->GetValue()).mb_str(wxConvUTF8) );
- gf_cfg_set_key(cfg, "Audio", "DriverName", m_audio->GetStringSelection().mb_str(wxConvUTF8));
-#ifdef WIN32
- if (m_notifs->IsEnabled())
- gf_cfg_set_key(cfg, "Audio", "DisableNotification", m_notifs->GetValue() ? "yes" : "no");
-#endif
-
- gf_cfg_set_key(cfg, "FontEngine", "FontReader", m_font->GetStringSelection().mb_str(wxConvUTF8));
- gf_cfg_set_key(cfg, "FontEngine", "FontDirectory", m_fontdir->GetLabel().mb_str(wxConvUTF8));
- switch (m_texturemode->GetSelection()) {
- case 2: gf_cfg_set_key(cfg, "Compositor", "TextureTextMode", "Always"); break;
- case 1: gf_cfg_set_key(cfg, "Compositor", "TextureTextMode", "Never"); break;
- default: gf_cfg_set_key(cfg, "Compositor", "TextureTextMode", "Default"); break;
- }
-
- gf_cfg_set_key(cfg, "Downloader", "CleanCache", m_cleancache->GetValue() ? "yes" : "no");
- gf_cfg_set_key(cfg, "Downloader", "RestartFiles", m_restartcache->GetValue() ? "yes" : "no");
- gf_cfg_set_key(cfg, "SAXLoader", "Progressive", m_progressive->GetValue() ? "yes" : "no");
- gf_cfg_set_key(cfg, "SAXLoader", "MaxDuration", m_sax_duration->GetLabel().mb_str(wxConvUTF8));
- gf_cfg_set_key(cfg, "General", "CacheDirectory", m_cachedir->GetLabel().mb_str(wxConvUTF8));
-
-
- Bool force_rtsp = 0;
- switch (m_port->GetSelection()) {
- case 3:
- gf_cfg_set_key(cfg, "Streaming", "DefaultPort", "8080");
- force_rtsp = 1;
- break;
- case 2:
- gf_cfg_set_key(cfg, "Streaming", "DefaultPort", "80");
- force_rtsp = 1;
- break;
- case 1:
- gf_cfg_set_key(cfg, "Streaming", "DefaultPort", "7070");
- break;
- default:
- gf_cfg_set_key(cfg, "Streaming", "DefaultPort", "554");
- break;
- }
-
- if (force_rtsp) {
- gf_cfg_set_key(cfg, "Streaming", "RTPoverRTSP", "yes");
- } else {
- gf_cfg_set_key(cfg, "Streaming", "RTPoverRTSP", m_rtsp->GetValue() ? "yes" : "no");
- if (!m_rtsp->GetValue()) gf_cfg_set_key(cfg, "Streaming", "ReorderSize", m_dorebuffer->GetValue() ? "30" : "0");
- }
-
- gf_cfg_set_key(cfg, "Streaming", "RTSPTimeout", m_timeout->GetValue().mb_str(wxConvUTF8));
- gf_cfg_set_key(cfg, "Network", "BufferLength", m_buffer->GetValue().mb_str(wxConvUTF8));
- if (m_dorebuffer->GetValue()) {
- gf_cfg_set_key(cfg, "Network", "RebufferLength", m_rebuffer->GetValue().mb_str(wxConvUTF8));
- } else {
- gf_cfg_set_key(cfg, "Network", "RebufferLength", "0");
- }
-
- gf_cfg_set_key(cfg, "StreamingCache", "KeepExistingFiles", m_overwrite->GetValue() ? "no" : "yes");
- if (m_usename->GetValue()) {
- gf_cfg_set_key(cfg, "StreamingCache", "BaseFileName", m_recfile->GetValue().mb_str(wxConvUTF8));
- } else {
- gf_cfg_set_key(cfg, "StreamingCache", "BaseFileName", NULL);
- }
- gf_cfg_set_key(cfg, "StreamingCache", "RecordDirectory", m_recdir->GetLabel().mb_str(wxConvUTF8));
-
-
- gf_term_set_option(m_pApp->m_term, GF_OPT_RELOAD_CONFIG, 1);
-}
-
+++ /dev/null
-/*
- * GPAC - Multimedia Framework C SDK
- *
- * Copyright (c) Jean Le Feuvre 2000-2005
- * All rights reserved
- *
- * This file is part of GPAC / Osmo4 wxWidgets GUI
- *
- * GPAC is free software; you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation; either version 2, or (at your option)
- * any later version.
- *
- * GPAC is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; see the file COPYING. If not, write to
- * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
- *
- *
- */
-
-#ifndef _OPTIONS_H
-#define _OPTIONS_H
-
-#include "wx/wxprec.h"
-
-#ifndef WX_PRECOMP
- #include "wx/wx.h"
-#endif
-
-#include <wx/spinbutt.h>
-#include <wx/spinctrl.h>
-
-enum
-{
- ID_SELECT = 1000,
- ID_APPLY,
-
- ID_MAKE_DEF,
- ID_FORCE_AUDIO,
- ID_AUDIO_DRIVER,
- ID_FONT_DIR,
- ID_CACHE_DIR,
- ID_PROGRESSIVE,
- ID_RTSP_PORT,
- ID_RTP_OVER_RTSP,
- ID_RTSP_REBUFFER,
- ID_RECORD_DIR,
- ID_USE_FILENAME,
- ID_USE_PROXY,
-};
-
-class wxOsmo4Frame;
-class wxGPACControl : public wxDialog
-{
-public:
- wxGPACControl(wxWindow *parent);
- virtual ~wxGPACControl();
-
-private:
- DECLARE_EVENT_TABLE()
-
- wxOsmo4Frame *m_pApp;
-
- wxComboBox *m_select;
- Bool m_bWas3D;
-
- void Apply(wxCommandEvent &event);
- void OnSetSelection(wxCommandEvent &event);
- void ForceAudio(wxCommandEvent &event);
- void OnSetAudioDriver(wxCommandEvent &event);
- void FontDir(wxCommandEvent &event);
- void CacheDir(wxCommandEvent &event);
- void OnProgressive(wxCommandEvent &event);
- void OnUseProxy(wxCommandEvent &event);
- void RTPoverRTSP(wxCommandEvent &event);
- void Rebuffer(wxCommandEvent &event);
- void OnSetRTSPPort(wxCommandEvent &event);
- void OnUseFileName(wxCommandEvent &event);
- void OnRecDir(wxCommandEvent &event);
- void DoSelect();
- s32 m_sel;
- void SetYUVLabel();
-
- wxBoxSizer *s_header, *s_main, *s_general, *s_mpeg4, *s_mdec, *s_rend, *s_rend2d, *s_rend3d, *s_audio, *s_video, *s_font, *s_dnld, *s_stream, *s_rec;
-
- /*general section*/
- wxCheckBox *m_loop, *m_lookforsubs, *m_noconsole, *m_viewxmt;
- /*MPEG-4 systems*/
- wxCheckBox *m_bifsalwaysdrawn, *m_singletime;
- wxComboBox *m_lang, *m_thread;
- /*media decoders*/
- wxComboBox *m_decaudio, *m_decvideo;
- /*Rendering*/
- wxComboBox *m_fps, *m_aa, *m_draw_bounds;
- wxCheckBox *m_use3D, *m_fast, *m_force_size;
- /*Renderer 2D*/
- wxComboBox *m_graph;
- wxCheckBox *m_noyuv, *m_direct, *m_scalable;
- wxStaticText *m_yuvtxt;
- /*Renderer 3D*/
- wxCheckBox *m_raster_outlines, *m_polyaa, *m_nobackcull, *m_emulpow2, *m_norectext, *m_copypixels;
- wxComboBox *m_wire, *m_normals;
- /*video*/
- wxComboBox *m_video;
- wxCheckBox *m_switchres, *m_usehwmem;
- /*audio*/
- wxSpinCtrl *m_nbbuf, *m_buflen;
- wxComboBox *m_audio;
- wxCheckBox *m_forcecfg, *m_noresync, *m_nomulitch;
-#ifdef WIN32
- wxCheckBox *m_notifs;
-#endif
- /*font*/
- wxComboBox *m_font;
- wxButton *m_fontdir;
- wxComboBox *m_texturemode;
- /*file download*/
- wxButton *m_cachedir;
- wxCheckBox *m_cleancache, *m_restartcache, *m_progressive, *m_use_proxy;
- wxTextCtrl *m_sax_duration, *m_proxy_name;
- /*streaming*/
- wxComboBox *m_port;
- wxCheckBox *m_rtsp, *m_reorder, *m_dorebuffer;
- wxTextCtrl *m_timeout, *m_buffer, *m_rebuffer;
- /*file recorder*/
- wxButton *m_recdir;
- wxCheckBox *m_overwrite, *m_usename;
- wxTextCtrl *m_recfile;
-};
-
-#endif
-
+++ /dev/null
-/*
- * GPAC - Multimedia Framework C SDK
- *
- * Copyright (c) Jean Le Feuvre 2000-2005
- * All rights reserved
- *
- * This file is part of GPAC / Osmo4 wxWidgets GUI
- *
- * GPAC is gf_free software; you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation; either version 2, or (at your option)
- * any later version.
- *
- * GPAC is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; see the file COPYING. If not, write to
- * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
- *
- *
- */
-
-
-#include "wxOsmo4.h"
-#include "wxGPACControl.h"
-#include "fileprops.h"
-#include <wx/image.h>
-#include <gpac/modules/service.h>
-#include <gpac/network.h>
-#include <gpac/constants.h>
-#include <gpac/options.h>
-
-
-IMPLEMENT_APP(wxOsmo4App)
-
-#include "osmo4.xpm"
-
-#include <wx/dnd.h>
-
-
-
-
-
-#include <wx/filename.h>
-#include <wx/clipbrd.h>
-
-#include "toolbar.xpm"
-
-#include "Playlist.h"
-
-#ifdef WIN32
-#define FRAME_H 140
-#else
-#define FRAME_H 110
-#endif
-
-
-wxString get_pref_browser(GF_Config *cfg)
-{
- const char *sOpt = gf_cfg_get_key(cfg, "General", "Browser");
- if (sOpt) return wxString(sOpt, wxConvUTF8);
- return wxEmptyString;
-/*
-#ifdef __WXMAC__
- return wxT("safari");
-#else
-#ifdef WIN32
- return wxT("explorer.exe");
-#else
- return wxT("mozilla");
-#endif
-#endif*/
-}
-
-
-IMPLEMENT_DYNAMIC_CLASS(wxGPACEvent, wxEvent )
-
-wxGPACEvent::wxGPACEvent(wxWindow* win)
-{
- SetEventType(GPAC_EVENT);
- SetEventObject(win);
- gpac_evt.type = 0;
- to_url = wxT("");
-}
-wxEvent *wxGPACEvent::Clone() const
-{
- wxGPACEvent *evt = new wxGPACEvent((wxWindow *) m_eventObject);
- evt->to_url = to_url;
- evt->gpac_evt = gpac_evt;
- return evt;
-}
-
-#include <wx/wx.h>
-
-/*open file dlg*/
-BEGIN_EVENT_TABLE(OpenURLDlg, wxDialog)
- EVT_BUTTON(ID_URL_GO, OpenURLDlg::OnGo)
-END_EVENT_TABLE()
-
-OpenURLDlg::OpenURLDlg(wxWindow *parent, GF_Config *cfg)
- : wxDialog(parent, -1, wxString(wxT("Enter remote presentation location")))
-{
-#ifndef WIN32
- SetSize(430, 35);
-#else
- SetSize(430, 55);
-#endif
- Centre();
- m_url = new wxComboBox(this, -1, wxT(""), wxDefaultPosition, wxDefaultSize, 0, NULL, wxCB_DROPDOWN);
- m_url->SetSize(0, 2, 340, 18, wxSIZE_AUTO);
- m_go = new wxButton(this, ID_URL_GO, wxT("Go !"));
-#ifndef WIN32
- m_go->SetSize(344, 2, 20, 18, wxSIZE_AUTO);
-#else
- m_go->SetSize(364, 2, 30, 18, wxSIZE_AUTO);
-#endif
- m_urlVal = wxT("");
-
- m_cfg = cfg;
-
- const char *sOpt;
- u32 i=0;
-
- while (1) {
- sOpt = gf_cfg_get_key_name(m_cfg, "RecentFiles", i);
- if (!sOpt) break;
- m_url->Append(wxString(sOpt, wxConvUTF8) );
- i++;
- }
-}
-
-#define MAX_LAST_FILES 20
-void UpdateLastFiles(GF_Config *cfg, const char *URL)
-{
- u32 nb_entries;
- gf_cfg_set_key(cfg, "RecentFiles", URL, NULL);
- gf_cfg_insert_key(cfg, "RecentFiles", URL, "", 0);
- /*remove last entry if needed*/
- nb_entries = gf_cfg_get_key_count(cfg, "RecentFiles");
- if (nb_entries>MAX_LAST_FILES) {
- gf_cfg_set_key(cfg, "RecentFiles", gf_cfg_get_key_name(cfg, "RecentFiles", nb_entries-1), NULL);
- }
-}
-
-void OpenURLDlg::OnGo(wxCommandEvent& event)
-{
- m_urlVal = m_url->GetValue();
- UpdateLastFiles(m_cfg, m_urlVal.mb_str(wxConvUTF8));
- EndModal(wxID_OK);
-}
-/*end open file dlg*/
-
-#ifdef WIN32
-u32 get_sys_col(int idx)
-{
- u32 res;
- DWORD val = GetSysColor(idx);
- res = (val)&0xFF; res<<=8;
- res |= (val>>8)&0xFF; res<<=8;
- res |= (val>>16)&0xFF;
- return res;
-}
-#endif
-
-static void wxOsmo4_progress_cbk(const void *usr, const char *title, u64 done, u64 total)
-{
- if (!total) return;
- wxOsmo4Frame *app = (wxOsmo4Frame *)usr;
- s32 prog = (s32) ( (100 * (u64)done) / total);
- if (app->m_last_prog < prog) {
- app->m_last_prog = prog;
-
- if (prog<100) {
- /*appears to crash wxWidgets / X11 when refreshing the text too often*/
- if (app->m_LastStatusTime + 200 > gf_sys_clock()) return;
- char msg[1024];
- sprintf(msg, "%s %02d %%)", title, prog);
- //app->SetStatus(wxString(msg, wxConvUTF8));
- } else {
- app->SetStatus(wxT("Ready"));
- app->m_last_prog = -1;
- }
- }
-}
-
-Bool GPAC_EventProc(void *ptr, GF_Event *evt)
-{
- wxCommandEvent event;
- wxOsmo4Frame *app = (wxOsmo4Frame *)ptr;
-
- switch (evt->type) {
- case GF_EVENT_DURATION:
- app->m_duration = (u32) (evt->duration.duration*1000);
- app->m_can_seek = evt->duration.can_seek;
- if (app->m_duration<1100) app->m_can_seek = 0;
- app->m_pProg->Enable(app->m_can_seek ? 1 : 0);
- app->m_pPlayList->SetDuration((u32) evt->duration.duration);
- break;
- case GF_EVENT_MESSAGE:
- {
- const char *servName;
- if (!evt->message.service || !strcmp(evt->message.service, app->m_pPlayList->GetURL().mb_str(wxConvUTF8))) {
- servName = "main service";
- } else {
- servName = evt->message.service;
- }
- if (!evt->message.message) return 0;
-
- if (evt->message.error) {
- app->SetStatus(wxString(evt->message.message, wxConvUTF8) + wxT(" (") + wxString(servName, wxConvUTF8) + wxT(")") );
- if (!app->m_connected) app->m_pPlayList->SetDead();
- }
- else if (!app->m_console_off) {
- if (strstr(evt->message.message, "100 %")) {
- app->SetStatus(wxT(""));
- } else {
- app->SetStatus(wxString(evt->message.message, wxConvUTF8) );
- }
- }
-
-#if 0
- /*log*/
- if (evt->message.error)
- ::wxLogMessage(wxString(evt->message.message, wxConvUTF8) + wxT(" (") + wxString(servName, wxConvUTF8) + wxT(") ") + wxString(gf_error_to_string(evt->message.error), wxConvUTF8) );
- else
- ::wxLogMessage(wxString(evt->message.message, wxConvUTF8) + wxT(" (") + wxString(servName, wxConvUTF8) + wxT(")"));
-#endif
- }
- break;
- case GF_EVENT_PROGRESS:
- {
- const char *sTitle;
- if (evt->progress.progress_type==0) sTitle = (char *)"Buffer";
- else if (evt->progress.progress_type==1) sTitle = (char *)"Download";
- else if (evt->progress.progress_type==2) sTitle = (char *)"Import";
- gf_set_progress(sTitle, evt->progress.done, evt->progress.total);
- }
- break;
- case GF_EVENT_KEYDOWN:
- if (app->m_can_seek && (evt->key.flags & GF_KEY_MOD_ALT)) {
- s32 res;
- switch (evt->key.key_code) {
- case GF_KEY_LEFT:
- res = gf_term_get_time_in_ms(app->m_term) - 5*app->m_duration/100;
- if (res<0) res=0;
- gf_term_play_from_time(app->m_term, res, 0);
- break;
- case GF_KEY_RIGHT:
- res = gf_term_get_time_in_ms(app->m_term) + 5*app->m_duration/100;
- if ((u32) res>=app->m_duration) res = 0;
- gf_term_play_from_time(app->m_term, res, 0);
- break;
- case GF_KEY_DOWN:
- res = gf_term_get_time_in_ms(app->m_term) - 60000;
- if (res<0) res=0;
- gf_term_play_from_time(app->m_term, res, 0);
- break;
- case GF_KEY_UP:
- res = gf_term_get_time_in_ms(app->m_term) + 60000;
- if ((u32) res>=app->m_duration) res = 0;
- gf_term_play_from_time(app->m_term, res, 0);
- break;
- }
- } else if (evt->key.flags & GF_KEY_MOD_CTRL) {
- switch (evt->key.key_code) {
- case GF_KEY_LEFT:
- app->m_pPlayList->PlayPrev();
- break;
- case GF_KEY_RIGHT:
- app->m_pPlayList->PlayNext();
- break;
- }
- } else {
- switch (evt->key.key_code) {
- case GF_KEY_HOME:
- gf_term_set_option(app->m_term, GF_OPT_NAVIGATION_TYPE, 1);
- break;
- case GF_KEY_ESCAPE:
- if (gf_term_get_option(app->m_term, GF_OPT_FULLSCREEN))
- gf_term_set_option(app->m_term, GF_OPT_FULLSCREEN, 0);
- break;
- default:
- {
- wxGPACEvent wxevt(app);
- wxevt.gpac_evt = *evt;
- app->AddPendingEvent(wxevt);
- }
- break;
- }
- }
- break;
-
- case GF_EVENT_CONNECT:
- {
- wxGPACEvent wxevt(app);
- wxevt.gpac_evt.type = GF_EVENT_CONNECT;
- wxevt.gpac_evt.connect.is_connected = evt->connect.is_connected;
- if (!evt->connect.is_connected) app->m_duration = 0;
- app->AddPendingEvent(wxevt);
- }
- break;
- case GF_EVENT_NAVIGATE:
- {
- wxGPACEvent wxevt(app);
- wxevt.to_url = wxString(evt->navigate.to_url, wxConvUTF8);
- wxevt.gpac_evt.type = evt->type;
- app->AddPendingEvent(wxevt);
- }
- return 1;
- case GF_EVENT_SET_CAPTION:
- {
- wxGPACEvent wxevt(app);
- wxevt.to_url = wxString(evt->caption.caption, wxConvUTF8);
- wxevt.gpac_evt.type = evt->type;
- app->AddPendingEvent(wxevt);
- }
- return 1;
-
- case GF_EVENT_QUIT:
- case GF_EVENT_VIEWPOINTS:
- case GF_EVENT_STREAMLIST:
- case GF_EVENT_SCENE_SIZE:
-// case GF_EVENT_SIZE:
- {
- wxGPACEvent wxevt(app);
- wxevt.gpac_evt = *evt;
- app->AddPendingEvent(wxevt);
- }
- break;
- case GF_EVENT_DBLCLICK:
- gf_term_set_option(app->m_term, GF_OPT_FULLSCREEN, !gf_term_get_option(app->m_term, GF_OPT_FULLSCREEN));
- return 0;
- case GF_EVENT_MOUSEDOWN:
- if (!gf_term_get_option(app->m_term, GF_OPT_FULLSCREEN)) {
-#ifdef __WXGTK__
- app->m_pVisual->SetFocus();
-#else
- app->m_pView->SetFocus();
-#endif
- }
- break;
- case GF_EVENT_AUTHORIZATION:
- {
- wxGPACEvent wxevt(app);
- wxTextEntryDialog user_d (0,
- wxT("Please set the user name for connection"),
- wxString(evt->auth.site_url, wxConvUTF8),
- wxString(evt->auth.user, wxConvUTF8));
- if (user_d.ShowModal() != wxID_OK)
- return 0;
- strncpy(evt->auth.user, user_d.GetValue().mb_str(wxConvUTF8), 50);
- wxPasswordEntryDialog passwd_d(0,
- wxT("Please enter password"),
- wxString(evt->auth.site_url, wxConvUTF8),
- wxString(evt->auth.password, wxConvUTF8));
- if (passwd_d.ShowModal() != wxID_OK)
- return 0;
- strncpy(evt->auth.password, passwd_d.GetValue().mb_str(wxConvUTF8), 50);
- return 1;
- }
- case GF_EVENT_SYS_COLORS:
-#ifdef WIN32
- evt->sys_cols.sys_colors[0] = get_sys_col(COLOR_ACTIVEBORDER);
- evt->sys_cols.sys_colors[1] = get_sys_col(COLOR_ACTIVECAPTION);
- evt->sys_cols.sys_colors[2] = get_sys_col(COLOR_APPWORKSPACE);
- evt->sys_cols.sys_colors[3] = get_sys_col(COLOR_BACKGROUND);
- evt->sys_cols.sys_colors[4] = get_sys_col(COLOR_BTNFACE);
- evt->sys_cols.sys_colors[5] = get_sys_col(COLOR_BTNHIGHLIGHT);
- evt->sys_cols.sys_colors[6] = get_sys_col(COLOR_BTNSHADOW);
- evt->sys_cols.sys_colors[7] = get_sys_col(COLOR_BTNTEXT);
- evt->sys_cols.sys_colors[8] = get_sys_col(COLOR_CAPTIONTEXT);
- evt->sys_cols.sys_colors[9] = get_sys_col(COLOR_GRAYTEXT);
- evt->sys_cols.sys_colors[10] = get_sys_col(COLOR_HIGHLIGHT);
- evt->sys_cols.sys_colors[11] = get_sys_col(COLOR_HIGHLIGHTTEXT);
- evt->sys_cols.sys_colors[12] = get_sys_col(COLOR_INACTIVEBORDER);
- evt->sys_cols.sys_colors[13] = get_sys_col(COLOR_INACTIVECAPTION);
- evt->sys_cols.sys_colors[14] = get_sys_col(COLOR_INACTIVECAPTIONTEXT);
- evt->sys_cols.sys_colors[15] = get_sys_col(COLOR_INFOBK);
- evt->sys_cols.sys_colors[16] = get_sys_col(COLOR_INFOTEXT);
- evt->sys_cols.sys_colors[17] = get_sys_col(COLOR_MENU);
- evt->sys_cols.sys_colors[18] = get_sys_col(COLOR_MENUTEXT);
- evt->sys_cols.sys_colors[19] = get_sys_col(COLOR_SCROLLBAR);
- evt->sys_cols.sys_colors[20] = get_sys_col(COLOR_3DDKSHADOW);
- evt->sys_cols.sys_colors[21] = get_sys_col(COLOR_3DFACE);
- evt->sys_cols.sys_colors[22] = get_sys_col(COLOR_3DHIGHLIGHT);
- evt->sys_cols.sys_colors[23] = get_sys_col(COLOR_3DLIGHT);
- evt->sys_cols.sys_colors[24] = get_sys_col(COLOR_3DSHADOW);
- evt->sys_cols.sys_colors[25] = get_sys_col(COLOR_WINDOW);
- evt->sys_cols.sys_colors[26] = get_sys_col(COLOR_WINDOWFRAME);
- evt->sys_cols.sys_colors[27] = get_sys_col(COLOR_WINDOWTEXT);
- return 1;
-#else
- memset(evt->sys_cols.sys_colors, 0, sizeof(u32)*28);
- return 1;
-#endif
- }
- return 0;
-}
-
-
-
-bool wxOsmo4App::OnInit()
-{
-#ifdef __WXGTK__
- XSynchronize((Display *) wxGetDisplay(), 1);
-#endif
- wxFrame *frame = new wxOsmo4Frame();
- frame->Show(TRUE);
- SetTopWindow(frame);
- return true;
-}
-
-
-class myDropfiles : public wxFileDropTarget
-{
-public:
- myDropfiles() : wxFileDropTarget() {}
- virtual bool OnDropFiles(wxCoord x, wxCoord y, const wxArrayString& filenames);
- wxOsmo4Frame *m_pMain;
-};
-
-bool myDropfiles::OnDropFiles(wxCoord x, wxCoord y, const wxArrayString& filenames)
-{
- u32 count = filenames.GetCount();
-
- if (count==1) {
- const char *ext = strrchr(filenames.Item(0).mb_str(wxConvUTF8) , '.');
- /*if playing and sub d&d, open sub in current presentation*/
- if (m_pMain->m_connected && ext && ( !stricmp(ext, ".srt") || !stricmp(ext, ".sub") || !stricmp(ext, ".ttxt") || !stricmp(ext, ".xml") ) ) {
- m_pMain->AddSubtitle(filenames.Item(0).mb_str(wxConvUTF8) , 1);
- return TRUE;
- }
- }
-
- for (u32 i=0; i<count; i++)
- m_pMain->m_pPlayList->QueueURL(filenames.Item(i));
-
- m_pMain->m_pPlayList->RefreshList();
- m_pMain->m_pPlayList->PlayNext();
- return TRUE;
-}
-
-bool GPACLogs::OnFrameClose(wxFrame *frame)
-{
- Show(FALSE);
- return 0;
-}
-
-void wxOsmo4Frame::ShowViewWindow(Bool do_show)
-{
- m_pView->Show(do_show ? 1 : 0);
-#ifdef __WXGTK__
- //m_pView->Show(0);
-#endif
-}
-
-#ifdef __WXGTK__
-extern "C" {
-#ifdef __WXGTK20__
- int gdk_x11_drawable_get_xid( void * );
- void *gdk_x11_drawable_get_xdisplay( void * );
-#endif
- void *gtk_widget_get_parent_window( void * );
-}
-#endif
-
-
-void wxOsmo4Frame::CheckVideoOut()
-{
- const char *sOpt = gf_cfg_get_key(m_user.config, "Video", "DriverName");
- void *os_handle = NULL;
- void *os_display = NULL;
- /*build a child window for embed display*/
- if (sOpt && stricmp(sOpt, "SDL Video Output")) {
- if (m_user.os_window_handler) return;
- m_bExternalView = 0;
-
-#ifdef __WXGTK__
- GtkWidget* widget = m_pVisual->GetHandle();
-
-#ifdef __WXGTK20__
- os_handle = (void *) gdk_x11_drawable_get_xid(gtk_widget_get_parent_window(widget));
-#else
- os_handle = (void *)*(int *)( (char *)gtk_widget_get_parent_window(widget) + 2 * sizeof(void *) );
-#endif
-
-#elif defined (WIN32)
- os_handle = m_pView->GetHandle();
-#endif
- if (os_handle) {
- m_user.os_window_handler = os_handle;
- m_user.os_display = os_display;
- ShowViewWindow(1);
- m_pView->SetSize(320, 240);
- SetSize(wxSize(320, 240+FRAME_H));
- SetWindowStyle(wxDEFAULT_FRAME_STYLE);
- DoLayout(320, 240);
- return;
- }
- }
- /*we're using SDL, don't use SDL hack*/
- m_bExternalView = 1;
- m_user.os_window_handler = 0;
- m_user.os_display = NULL;
- SetSize(wxSize(320,FRAME_H));
- m_pView->SetSize(0, 0);
- ShowViewWindow(0);
- DoLayout();
- SetWindowStyle(wxDEFAULT_FRAME_STYLE & ~(wxMAXIMIZE_BOX | wxRESIZE_BORDER));
-}
-
-static void wxOsmo4_do_log(void *cbk, u32 level, u32 tool, const char *fmt, va_list list)
-{
- wxOsmo4Frame *osmo = (wxOsmo4Frame *)cbk;
-
- if (osmo->m_logs) {
- vfprintf(osmo->m_logs, fmt, list);
- fflush(osmo->m_logs);
- } else {
- ::wxVLogMessage(wxString(fmt, wxConvUTF8), list);
- }
-}
-
-
-Bool wxOsmo4Frame::LoadTerminal()
-{
- m_term = NULL;
- memset(&m_user, 0, sizeof(GF_User));
-
- /*locate exec dir for cfg file*/
- wxPathList pathList;
- wxString currentDir(wxGetCwd());
- wxString abs_gpac_path = wxT("");
- char *gpac_cfg, *sep;
-
- ::wxLogMessage(wxT("Looking for GPAC configuration file"));
-
- /*load config*/
- Bool first_launch = 0;
- m_user.config = gf_cfg_init(NULL, &first_launch);
-
- if (!m_user.config) {
- wxMessageDialog(NULL, wxT("Cannot open GPAC configuration file"), wxT("Init error"), wxOK);
- return 0;
- }
-
- gpac_cfg = gf_cfg_get_filename(m_user.config);
- sep = strrchr(gpac_cfg, '/');
- if (!sep) sep = strrchr(gpac_cfg, '\\');
- if (sep) sep[0] = 0;
- strcpy(szAppPath, gpac_cfg);
- if (sep) sep[0] = '/';
- gf_free(gpac_cfg);
-
- /*check log file*/
- const char *str = gf_cfg_get_key(m_user.config, "General", "LogFile");
- if (str) m_logs = fopen(str, "wt");
- gf_log_set_callback(this, wxOsmo4_do_log);
-
- /*set log level*/
- gf_log_set_tools_levels( gf_cfg_get_key(m_user.config, "General", "Logs") );
-
- gf_sys_init(0);
-
- ::wxLogMessage(wxT("GPAC configuration file opened - looking for modules"));
-
- m_user.modules = gf_modules_new(str, m_user.config);
- /*initial launch*/
- if (!m_user.modules || !gf_modules_get_count(m_user.modules)) {
- wxMessageDialog(NULL, wxT("No modules available - system cannot work"), wxT("Fatal Error"), wxOK).ShowModal();
- if (m_user.modules) gf_modules_del(m_user.modules);
- gf_cfg_del(m_user.config);
- m_user.config = NULL;
- return 0;
- }
-
- if (first_launch) {
- u32 i;
- for (i=0; i<gf_modules_get_count(m_user.modules); i++) {
- GF_InputService *ifce = (GF_InputService *) gf_modules_load_interface(m_user.modules, i, GF_NET_CLIENT_INTERFACE);
- if (!ifce) continue;
- if (ifce) {
- ifce->CanHandleURL(ifce, "test.test");
- gf_modules_close_interface((GF_BaseInterface *) ifce);
- }
- }
- }
-
-
-
- ::wxLogMessage(wxT("%d modules found:"), gf_modules_get_count(m_user.modules));
- for (u32 i=0; i<gf_modules_get_count(m_user.modules); i++) {
- ::wxLogMessage(wxT("\t") + wxString(gf_modules_get_file_name(m_user.modules, i), wxConvUTF8) );
- }
-
- ::wxLogMessage(wxT("Starting GPAC Terminal"));
- /*now load terminal*/
- m_user.opaque = this;
- m_user.EventProc = GPAC_EventProc;
-
- CheckVideoOut();
-
- m_term = gf_term_new(&m_user);
- if (!m_term) {
- wxMessageDialog(NULL, wxT("Fatal Error"), wxT("Cannot load GPAC Terminal"), wxOK).ShowModal();
- return 0;
- } else {
- ::wxLogMessage(wxT("GPAC Terminal started") );
- }
- return 1;
-}
-
-
-
-wxOsmo4Frame::wxOsmo4Frame() :
- wxFrame((wxFrame *) NULL, -1, wxT("Osmo4 - GPAC"), wxPoint(-1, -1), wxSize(320, FRAME_H), //wxDEFAULT_FRAME_STYLE & ~(wxMAXIMIZE_BOX | wxRESIZE_BORDER)
-wxDEFAULT_FRAME_STYLE
- )
-
-{
- int ws[3];
- m_Address = NULL;
- m_pView = NULL;
- m_term = NULL;
- SetIcon(wxIcon(osmo4));
- m_bExternalView = 0;
- m_last_prog = -1;
- m_num_chapters = 0;
- m_chapters_start = NULL;
- m_bViewRTI = 0;
- m_logs = NULL;
- m_bStartupFile = 0;
- gf_set_progress_callback(this, wxOsmo4_progress_cbk);
-
- myDropfiles *droptarget = new myDropfiles();
- droptarget->m_pMain = this;
- SetDropTarget(droptarget);
- m_pLogs = new GPACLogs(this);
- m_bGrabbed = 0;
-
- /*new menu bar*/
- wxMenuBar *b = new wxMenuBar();
- /*file*/
- wxMenu *menu = new wxMenu();
- menu->Append(GWX_FILE_OPEN, wxT("&Open File\tCtrl+O"), wxT("Open local presentation"));
- menu->Append(GWX_FILE_OPEN_URL, wxT("&Open URL\tCtrl+U"), wxT("Open remote presentation"));
- menu->AppendSeparator();
- menu->Append(FILE_PROPERTIES, wxT("&Properties\tCtrl+I"), wxT("Show presentation properties"));
- menu->Enable(FILE_PROPERTIES, 0);
- wxMenu *smenu = new wxMenu();
- smenu->Append(ID_MCACHE_ENABLE, wxT("&Enable"), wxT("Turns Recorder On/Off"));
- smenu->Append(ID_MCACHE_STOP, wxT("&Stop"), wxT("Stops recording and saves"));
- smenu->Append(ID_MCACHE_ABORT, wxT("&Abort"), wxT("Stops recording and discards"));
- menu->Append(0, wxT("&Streaming Cache"), smenu);
- menu->AppendSeparator();
- menu->Append(FILE_COPY, wxT("&Copy\tCtrl+C"), wxT("Copy selected text"));
- menu->Append(FILE_PASTE, wxT("&Paste\tCtrl+V"), wxT("Copy selected text"));
- menu->AppendSeparator();
- menu->Append(FILE_QUIT, wxT("E&xit"), wxT("Quit the application"));
- b->Append(menu, wxT("&File"));
- /*view*/
- menu = new wxMenu();
- vp_list = new wxMenu();
- menu->Append(0, wxT("&Viewpoint"), vp_list);
- smenu = new wxMenu();
- smenu->Append(ID_HEADLIGHT, wxT("Headlight"), wxT("Turns headlight on/off"), wxITEM_CHECK);
- smenu->AppendSeparator();
- smenu->Append(ID_NAVIGATE_NONE, wxT("None"), wxT("Disables Navigation"), wxITEM_CHECK);
- smenu->Append(ID_NAVIGATE_WALK, wxT("Walk"), wxT("Walk Navigation"), wxITEM_CHECK);
- smenu->Append(ID_NAVIGATE_FLY, wxT("Fly"), wxT("Fly Navigation"), wxITEM_CHECK);
- smenu->Append(ID_NAVIGATE_EXAMINE, wxT("Examine"), wxT("Examine Navigation"), wxITEM_CHECK);
- smenu->Append(ID_NAVIGATE_PAN, wxT("Pan"), wxT("Pan Navigation"), wxITEM_CHECK);
- smenu->Append(ID_NAVIGATE_SLIDE, wxT("Slide"), wxT("Slide Navigation"), wxITEM_CHECK);
- smenu->Append(ID_NAVIGATE_ORBIT, wxT("Orbit"), wxT("Orbit Navigation"), wxITEM_CHECK);
- smenu->Append(ID_NAVIGATE_GAME, wxT("Game"), wxT("Game Navigation"), wxITEM_CHECK);
- smenu->AppendSeparator();
- wxMenu *ssmenu = new wxMenu();
- ssmenu->Append(ID_COLLIDE_NONE, wxT("None"), wxT("No Collision detection"), wxITEM_CHECK);
- ssmenu->Append(ID_COLLIDE_REG, wxT("Regular"), wxT("Regular Collision detection"), wxITEM_CHECK);
- ssmenu->Append(ID_COLLIDE_DISP, wxT("Displacement"), wxT("Collision detecion with camera displacement"), wxITEM_CHECK);
- smenu->Append(0, wxT("&Collision"), ssmenu);
- smenu->Append(ID_GRAVITY, wxT("Gravity"), wxT("Turns gravity on/off"), wxITEM_CHECK);
- smenu->AppendSeparator();
- smenu->Append(ID_NAVIGATE_RESET, wxT("Reset"), wxT("Reset Navigation"));
-
- menu->Append(0, wxT("&Navigation"), smenu);
- menu->AppendSeparator();
- menu->Append(VIEW_FULLSCREEN, wxT("&Fullscreen"), wxT("Toggles Fullscreen"), wxITEM_CHECK);
- menu->Append(VIEW_ORIGINAL, wxT("&Original Size"), wxT("Restore original size"));
- smenu = new wxMenu();
- smenu->Append(VIEW_AR_KEEP, wxT("Keep Original\tCtrl+1"), wxT("Keep original aspect ratio"), wxITEM_CHECK);
- smenu->Append(VIEW_AR_FILL, wxT("Fill Screen\tCtrl+2"), wxT("Stretch presentation to fill screen"), wxITEM_CHECK);
- smenu->Append(VIEW_AR_43, wxT("Ratio 4/3\tCtrl+3"), wxT("Force aspect ratio to 4/3"), wxITEM_CHECK);
- smenu->Append(VIEW_AR_169, wxT("Ratio 16/9\tCtrl+4"), wxT("Force aspect ratio to 16/9"), wxITEM_CHECK);
- menu->Append(0, wxT("&Aspect Ratio"), smenu);
- smenu->Check(VIEW_AR_KEEP, 1);
- menu->AppendSeparator();
- menu->Append(VIEW_OPTIONS, wxT("&Options"), wxT("View Options"));
- menu->AppendSeparator();
- menu->Append(VIEW_RTI, wxT("&Resource Usage"), wxT("View Resource Usage"), wxITEM_CHECK);
- menu->Append(VIEW_LOGS, wxT("&Logs"), wxT("View GPAC logs"));
- b->Append(menu, wxT("&View"));
-
- /*play*/
- menu = new wxMenu();
- sel_menu = new wxMenu();
- sel_menu->Append(0, wxT("&Audio"), new wxMenu());
- sel_menu->Append(0, wxT("&Video"), new wxMenu());
- sel_menu->Append(0, wxT("&Subtitles"), new wxMenu());
- sel_menu->AppendSeparator();
- sel_menu->Append(ID_ADD_SUB, wxT("&Add Subtitle"), wxT("Adds subtitle"));
- menu->Append(ID_STREAM_MENU, wxT("&Streams Selection"), sel_menu);
- chap_menu = new wxMenu();
- menu->Append(ID_CHAPTER_MENU, wxT("&Chapters"), chap_menu);
-
- menu->AppendSeparator();
- menu->Append(VIEW_PLAYLIST, wxT("&Playlist\tCtrl+L"), wxT("Show navigation history as playlist"), wxITEM_CHECK);
- menu->Append(ID_CLEAR_NAV, wxT("&Clear History"), wxT("Clear navigation history"));
- menu->AppendSeparator();
- menu->Append(FILE_PLAY, wxT("&Play/Pause\tCtrl+P"), wxT("Play/Pause/Resume Presentation"));
- menu->Append(FILE_STEP, wxT("&Step-by-Step\tCtrl+S"), wxT("Play/Pause/Resume Presentation"));
- menu->Append(FILE_STOP, wxT("&Stop"), wxT("Stop Presentation"));
- menu->AppendSeparator();
- menu->Append(FILE_RELOAD_CONFIG, wxT("&Reload Config\tCtrl+R"), wxT("Reload Configuration File"));
- menu->Append(FILE_RELOAD, wxT("&Reload File\tCtrl+R"), wxT("Reload Presentation"));
- b->Append(menu, wxT("&Play"));
-
- menu = new wxMenu();
- menu->Append(APP_SHORTCUTS, wxT("&Shortcuts"), wxT("Show keyboard shortcuts"));
- menu->Append(APP_NAV_KEYS, wxT("&Navigation Keys"), wxT("Show navigation keys"));
- menu->AppendSeparator();
- menu->Append(APP_ABOUT, wxT("&About"), wxT("Display information and copyright"));
- b->Append(menu, wxT("&?"));
-
- SetMenuBar(b);
-
- m_pStatusbar = CreateStatusBar(1, 0, -1, wxT("statusBar"));
- ws[0] = 60;
- ws[1] = 70;
- ws[2] = -1;
- m_pStatusbar->SetFieldsCount(3, ws);
-
- SetStatusBarPane(2);
- wxColour foreCol = m_pStatusbar->GetBackgroundColour();
- SetBackgroundColour(foreCol);
-
-
- m_pTimer = new wxTimer();
- m_pTimer->SetOwner(this, ID_CTRL_TIMER);
- m_bGrabbed = 0;
-
- /*create toolbar*/
- m_pToolBar = CreateToolBar(wxTB_FLAT|wxTB_HORIZONTAL);
- m_pOpenFile = new wxBitmap(tool_open_file);
- m_pPrev = new wxBitmap(tool_prev);
- m_pNext = new wxBitmap(tool_next);
- m_pPlay = new wxBitmap(tool_play);
- m_pPause = new wxBitmap(tool_pause);
- m_pStep = new wxBitmap(tool_step);
- m_pStop = new wxBitmap(tool_stop);
- m_pInfo = new wxBitmap(tool_info);
- m_pConfig = new wxBitmap(tool_config);
- m_pSW2D = new wxBitmap(tool_sw_2d);
- m_pSW3D = new wxBitmap(tool_sw_3d);
-
- m_pToolBar->AddTool(GWX_FILE_OPEN, wxT(""), *m_pOpenFile, wxT("Open File"));
- m_pToolBar->AddSeparator();
- m_pPrevBut = new wxMenuButton(m_pToolBar, FILE_PREV, *m_pPrev);
- m_pPrevBut->SetToolTip(wxT("Previous Location"));
- m_pToolBar->AddControl(m_pPrevBut);
- m_pNextBut = new wxMenuButton(m_pToolBar, FILE_NEXT, *m_pNext);
- m_pNextBut->SetToolTip(wxT("Next Location"));
- m_pToolBar->AddControl(m_pNextBut);
-
- m_pToolBar->AddSeparator();
- m_pToolBar->AddTool(FILE_PLAY, wxT(""), *m_pPlay, wxT("Play/Pause File"));
- m_pToolBar->AddTool(FILE_STEP, wxT(""), *m_pStep, wxT("Step-by-Step Mode"));
- m_pToolBar->AddTool(FILE_STOP, wxT(""), *m_pStop, wxT("Stop File"));
- m_pToolBar->AddSeparator();
- m_pToolBar->AddTool(FILE_PROPERTIES, wxT(""), *m_pInfo, wxT("Show File Information"));
- m_pToolBar->AddSeparator();
- m_pToolBar->AddTool(VIEW_OPTIONS, wxT(""), *m_pConfig, wxT("GPAC Configuration"));
- m_pToolBar->AddTool(SWITCH_RENDER, wxT(""), *m_pSW3D, wxT("Switch 2D/3D Renderers"));
-
- m_pToolBar->Realize();
-
- m_Address = new wxMyComboBox(this, ID_ADDRESS, wxT(""), wxPoint(50, 0), wxSize(80, 20));
- wxStaticText *add_text = new wxStaticText(this, -1, wxT("URL"), wxPoint(0, 0), wxSize(40, 20));
- add_text->SetBackgroundColour(foreCol);
-
- m_pAddBar = new wxBoxSizer(wxHORIZONTAL);
- m_pAddBar->Add(add_text, 0, wxALIGN_TOP);
- m_pAddBar->Add(m_Address, 2, wxALIGN_CENTER|wxEXPAND|wxADJUST_MINSIZE);
- m_pAddBar->SetMinSize(80, 32);
- m_pAddBar->Layout();
-
- m_pProg = new wxSlider(this, ID_SLIDER, 0, 0, 1000, wxPoint(0, 22), wxSize(80, 22), wxSL_HORIZONTAL|wxSUNKEN_BORDER);
- m_pProg->Enable(0);
- m_pProg->Show();
- m_pProg->SetBackgroundColour(foreCol);
-
- m_pView = new wxWindow(this, -1, wxDefaultPosition, wxDefaultSize, wxNO_BORDER);
- m_pView->SetBackgroundColour(wxColour(wxT("BLACK")));
-#ifdef __WXGTK__
- m_pVisual = new wxWindow(m_pView, -1, wxDefaultPosition, wxDefaultSize, wxNO_BORDER);
- m_pVisual->SetBackgroundColour(wxColour(wxT("BLACK")));
-#endif
-
- m_pPlayList = new wxPlaylist(this);
- m_pPlayList->SetIcon(wxIcon(osmo4));
- m_pPlayList->Hide();
- Raise();
- Show();
-
- m_connected = 0;
- if (!LoadTerminal()) {
- Close(TRUE);
- return;
- }
-
-
-
- if (m_bExternalView) SetWindowStyle(wxDEFAULT_FRAME_STYLE & ~(wxMAXIMIZE_BOX | wxRESIZE_BORDER));
- DoLayout(320, 240);
- UpdateRenderSwitch();
-
- const char *sOpt = gf_cfg_get_key(m_user.config, "General", "ConsoleOff");
- m_console_off = (sOpt && !stricmp(sOpt, "yes")) ? 1 : 0;
- sOpt = gf_cfg_get_key(m_user.config, "General", "Loop");
- m_loop = (sOpt && !stricmp(sOpt, "yes")) ? 1 : 0;
- sOpt = gf_cfg_get_key(m_user.config, "General", "LookForSubtitles");
- m_lookforsubs = (sOpt && !stricmp(sOpt, "yes")) ? 1 : 0;
- gf_term_set_option(m_term, GF_OPT_AUDIO_VOLUME, 100);
-
- ReloadURLs();
- Raise();
- m_pStatusbar->SetStatusText(wxT("Ready"), 2);
- m_LastStatusTime = 0;
-
- m_pPrevBut->Refresh();
- m_pNextBut->Refresh();
-
- wxOsmo4App &app = wxGetApp();
- if (app.argc>1) {
- m_pPlayList->QueueURL(wxString(app.argv[1]));
- m_pPlayList->RefreshList();
- m_pPlayList->PlayNext();
- } else {
- char sPL[GF_MAX_PATH];
- strcpy((char *) sPL, szAppPath);
-#ifdef WIN32
- strcat(sPL, "gpac_pl.m3u");
-#else
- strcat(sPL, ".gpac_pl.m3u");
-#endif
- m_pPlayList->OpenPlaylist(wxString(sPL, wxConvUTF8) );
- const char *sOpt = gf_cfg_get_key(m_user.config, "General", "PLEntry");
- if (sOpt) {
- m_pPlayList->m_cur_entry = atoi(sOpt);
- if (m_pPlayList->m_cur_entry>=(s32)gf_list_count(m_pPlayList->m_entries))
- m_pPlayList->m_cur_entry = -1;
- }
-
- sOpt = gf_cfg_get_key(m_user.config, "General", "StartupFile");
- if (sOpt) {
- gf_term_connect(m_term, sOpt);
- m_bStartupFile = 1;
- }
- }
-
- sOpt = gf_cfg_get_key(m_user.config, "Audio", "DriverName");
-
- if (!strcmp(sOpt, "No Audio Output Available")) {
- ::wxLogMessage(wxT("WARNING: no audio output availble - make sure no other program is locking the sound card"));
- SetStatus(wxT("No audio ouput available"));
-
- } else {
- SetStatus(wxT("Ready"));
- }
-}
-
-wxOsmo4Frame::~wxOsmo4Frame()
-{
- vp_list = NULL;
- sel_menu = NULL;
-
- if (m_user.modules) gf_modules_del(m_user.modules);
- gf_sys_close();
- if (m_user.config) gf_cfg_del(m_user.config);
-
- if (m_chapters_start) gf_free(m_chapters_start);
- if (m_pView) delete m_pView;
-
- //m_pToolBar->RemoveTool(FILE_PREV);
- //m_pToolBar->RemoveTool(FILE_NEXT);
-
- delete m_pPrevBut;
- delete m_pNextBut;
- delete m_pPlayList;
- delete m_pTimer;
- delete m_pOpenFile;
- delete m_pPrev;
- delete m_pNext;
- delete m_pPlay;
- delete m_pPause;
- delete m_pStep;
- delete m_pStop;
- delete m_pInfo;
- delete m_pConfig;
- delete m_pSW2D;
- delete m_pSW3D;
-}
-
-
-BEGIN_EVENT_TABLE(wxOsmo4Frame, wxFrame)
- EVT_CLOSE(wxOsmo4Frame::OnCloseApp)
- EVT_MENU(GWX_FILE_OPEN, wxOsmo4Frame::OnFileOpen)
- EVT_MENU(GWX_FILE_OPEN_URL, wxOsmo4Frame::OnFileOpenURL)
- EVT_MENU(FILE_RELOAD_CONFIG, wxOsmo4Frame::OnFileReloadConfig)
- EVT_MENU(FILE_RELOAD, wxOsmo4Frame::OnFileReload)
- EVT_MENU(FILE_PROPERTIES, wxOsmo4Frame::OnFileProperties)
- EVT_MENU(FILE_QUIT, wxOsmo4Frame::OnFileQuit)
- EVT_MENU(VIEW_FULLSCREEN, wxOsmo4Frame::OnFullScreen)
- EVT_MENU(VIEW_OPTIONS, wxOsmo4Frame::OnOptions)
- EVT_MENU(VIEW_AR_KEEP, wxOsmo4Frame::OnViewARKeep)
- EVT_MENU(VIEW_AR_FILL, wxOsmo4Frame::OnViewARFill)
- EVT_MENU(VIEW_AR_169, wxOsmo4Frame::OnViewAR169)
- EVT_MENU(VIEW_AR_43, wxOsmo4Frame::OnViewAR43)
- EVT_MENU(VIEW_ORIGINAL, wxOsmo4Frame::OnViewOriginal)
- EVT_MENU(VIEW_PLAYLIST, wxOsmo4Frame::OnPlaylist)
- EVT_UPDATE_UI(VIEW_PLAYLIST, wxOsmo4Frame::OnUpdatePlayList)
- EVT_MENU(FILE_COPY, wxOsmo4Frame::OnFileCopy)
- EVT_UPDATE_UI(FILE_COPY, wxOsmo4Frame::OnUpdateFileCopy)
- EVT_MENU(FILE_PASTE, wxOsmo4Frame::OnFilePaste)
- EVT_UPDATE_UI(FILE_PASTE, wxOsmo4Frame::OnUpdateFilePaste)
-
- EVT_MENU(ID_CLEAR_NAV, wxOsmo4Frame::OnClearNav)
- EVT_UPDATE_UI(ID_STREAM_MENU, wxOsmo4Frame::OnUpdateStreamMenu)
- EVT_UPDATE_UI(ID_CHAPTER_MENU, wxOsmo4Frame::OnUpdateChapterMenu)
- EVT_MENU(ID_ADD_SUB, wxOsmo4Frame::OnAddSub)
-
- EVT_MENU(ID_MCACHE_ENABLE, wxOsmo4Frame::OnCacheEnable)
- EVT_UPDATE_UI(ID_MCACHE_ENABLE, wxOsmo4Frame::OnUpdateCacheEnable)
- EVT_MENU(ID_MCACHE_STOP, wxOsmo4Frame::OnCacheStop)
- EVT_MENU(ID_MCACHE_ABORT, wxOsmo4Frame::OnCacheAbort)
- EVT_UPDATE_UI(ID_MCACHE_STOP, wxOsmo4Frame::OnUpdateCacheAbort)
- EVT_UPDATE_UI(ID_MCACHE_ABORT, wxOsmo4Frame::OnUpdateCacheAbort)
-
-
- EVT_MENU(APP_SHORTCUTS, wxOsmo4Frame::OnShortcuts)
- EVT_MENU(APP_NAV_KEYS, wxOsmo4Frame::OnNavInfo)
- EVT_MENU(APP_ABOUT, wxOsmo4Frame::OnAbout)
- EVT_GPACEVENT(wxOsmo4Frame::OnGPACEvent)
- EVT_TIMER(ID_CTRL_TIMER, wxOsmo4Frame::OnTimer)
- EVT_COMMAND_SCROLL(ID_SLIDER, wxOsmo4Frame::OnSlide)
- EVT_MENU(VIEW_LOGS, wxOsmo4Frame::OnLogs)
- EVT_MENU(VIEW_RTI, wxOsmo4Frame::OnRTI)
-
- EVT_MENUBUTTON_OPEN(FILE_PREV, wxOsmo4Frame::OnFilePrevOpen)
- EVT_MENUBUTTON_OPEN(FILE_NEXT, wxOsmo4Frame::OnFileNextOpen)
- EVT_MENU(FILE_PREV, wxOsmo4Frame::OnNavPrev)
- EVT_UPDATE_UI(FILE_PREV, wxOsmo4Frame::OnUpdateNavPrev)
- EVT_MENU_RANGE(ID_NAV_PREV_0, ID_NAV_PREV_9, wxOsmo4Frame::OnNavPrevMenu)
- EVT_MENU(FILE_NEXT, wxOsmo4Frame::OnNavNext)
- EVT_UPDATE_UI(FILE_NEXT, wxOsmo4Frame::OnUpdateNavNext)
- EVT_MENU_RANGE(ID_NAV_NEXT_0, ID_NAV_NEXT_9, wxOsmo4Frame::OnNavNextMenu)
-
- EVT_TOOL(FILE_PLAY, wxOsmo4Frame::OnFilePlay)
- EVT_TOOL(FILE_STEP, wxOsmo4Frame::OnFileStep)
- EVT_TOOL(FILE_STOP, wxOsmo4Frame::OnFileStop)
- EVT_TOOL(SWITCH_RENDER, wxOsmo4Frame::OnRenderSwitch)
-
- EVT_COMBOBOX(ID_ADDRESS, wxOsmo4Frame::OnURLSelect)
-
- EVT_MENU_RANGE(ID_SELSTREAM_0, ID_SELSTREAM_9, wxOsmo4Frame::OnStreamSel)
- EVT_UPDATE_UI_RANGE(ID_SELSTREAM_0, ID_SELSTREAM_9, wxOsmo4Frame::OnUpdateStreamSel)
-
- EVT_MENU_RANGE(ID_SETCHAP_FIRST, ID_SETCHAP_LAST, wxOsmo4Frame::OnChapterSel)
- EVT_UPDATE_UI_RANGE(ID_SETCHAP_FIRST, ID_SETCHAP_LAST, wxOsmo4Frame::OnUpdateChapterSel)
-
- EVT_MENU_RANGE(ID_VIEWPOINT_FIRST, ID_VIEWPOINT_LAST, wxOsmo4Frame::OnViewport)
- EVT_UPDATE_UI_RANGE(ID_VIEWPOINT_FIRST, ID_VIEWPOINT_LAST, wxOsmo4Frame::OnUpdateViewport)
-
- EVT_MENU_RANGE(ID_NAVIGATE_NONE, ID_NAVIGATE_GAME, wxOsmo4Frame::OnNavigate)
- EVT_UPDATE_UI_RANGE(ID_NAVIGATE_NONE, ID_NAVIGATE_GAME, wxOsmo4Frame::OnUpdateNavigation)
- EVT_MENU(ID_NAVIGATE_RESET, wxOsmo4Frame::OnNavigateReset)
-
- EVT_MENU_RANGE(ID_COLLIDE_NONE, ID_COLLIDE_DISP, wxOsmo4Frame::OnCollide)
- EVT_UPDATE_UI_RANGE(ID_COLLIDE_NONE, ID_COLLIDE_DISP, wxOsmo4Frame::OnUpdateCollide)
-
- EVT_MENU(ID_HEADLIGHT, wxOsmo4Frame::OnHeadlight)
- EVT_UPDATE_UI(ID_HEADLIGHT, wxOsmo4Frame::OnUpdateHeadlight)
- EVT_MENU(ID_GRAVITY, wxOsmo4Frame::OnGravity)
- EVT_UPDATE_UI(ID_GRAVITY, wxOsmo4Frame::OnUpdateGravity)
-
- EVT_UPDATE_UI(FILE_PROPERTIES, wxOsmo4Frame::OnUpdateNeedsConnect)
- EVT_UPDATE_UI(FILE_RELOAD, wxOsmo4Frame::OnUpdateNeedsConnect)
- EVT_UPDATE_UI(FILE_PLAY, wxOsmo4Frame::OnUpdatePlay)
- EVT_UPDATE_UI(FILE_STOP, wxOsmo4Frame::OnUpdateNeedsConnect)
- EVT_UPDATE_UI(FILE_STEP, wxOsmo4Frame::OnUpdateNeedsConnect)
- EVT_UPDATE_UI(VIEW_ORIGINAL, wxOsmo4Frame::OnUpdateNeedsConnect)
- EVT_UPDATE_UI(VIEW_FULLSCREEN, wxOsmo4Frame::OnUpdateFullScreen)
- EVT_UPDATE_UI(VIEW_AR_KEEP, wxOsmo4Frame::OnUpdateAR)
- EVT_UPDATE_UI(VIEW_AR_FILL, wxOsmo4Frame::OnUpdateAR)
- EVT_UPDATE_UI(VIEW_AR_169, wxOsmo4Frame::OnUpdateAR)
- EVT_UPDATE_UI(VIEW_AR_43, wxOsmo4Frame::OnUpdateAR)
-
- EVT_SIZE(wxOsmo4Frame::OnSize)
-END_EVENT_TABLE()
-
-void wxOsmo4Frame::DoLayout(u32 v_width, u32 v_height)
-{
- wxPoint pos;
- if (!m_Address || !m_pProg) return;
-
- int t_h = m_pToolBar->GetSize().y;
- int a_h = m_pAddBar->GetSize().y;
- int p_h = m_pProg->GetSize().y;
-
- if (m_bExternalView) {
- if (v_width && v_height) {
- m_orig_width = v_width;
- m_orig_height = v_height;
- }
- SetClientSize(320, a_h+p_h+t_h);
- m_pAddBar->SetDimension(0,0, 320, a_h);
- m_pProg->SetSize(0, t_h+a_h, 320, p_h, 0);
- return;
- }
-
- if (v_width && v_height) {
- m_orig_width = v_width;
- m_orig_height = v_height;
- v_height += a_h + p_h + t_h;
- SetClientSize(v_width, v_height);
- m_pView->SetSize(0, a_h+t_h, v_width, v_height, 0);
- m_pAddBar->SetDimension(0, t_h, v_width, a_h);
- m_pProg->SetSize(0, v_height - p_h, v_width, p_h, 0);
- }
- wxSize s = GetClientSize();
- s.y -= a_h + p_h + t_h;
- if (m_pView) {
- m_pView->SetSize(0, a_h+t_h, s.x, s.y, 0);
- m_pAddBar->SetDimension(0, 0, s.x, a_h);
- m_pAddBar->SetDimension(0, 0, s.x, a_h);
- m_pAddBar->Layout();
- m_pProg->SetSize(0, s.y+t_h+a_h, s.x, p_h, 0);
- if (m_term) gf_term_set_size(m_term, s.x, s.y);
- }
-}
-
-void wxOsmo4Frame::OnSize(wxSizeEvent &event)
-{
- DoLayout();
-}
-
-void wxOsmo4Frame::OnCloseApp(wxCloseEvent &WXUNUSED(event))
-{
- if (m_term) gf_term_del(m_term);
- m_term = NULL;
- Destroy();
-}
-
-
-wxString wxOsmo4Frame::GetFileFilter()
-{
- u32 keyCount, i;
- wxString sFiles, sSupportedFiles, sExts;
-
- /*force MP4 and 3GP files at beginning to make sure they are selected (Win32 bug with too large filters)*/
- sSupportedFiles = wxT("All Known Files|*.m3u;*.pls;*.mp4;*.3gp;*.3g2");
- sExts = wxT("");
- sFiles = wxT("");
- keyCount = gf_cfg_get_key_count(m_user.config, "MimeTypes");
- for (i=0; i<keyCount; i++) {
- Bool first = 1;
- const char *sMime;
- char *sKey;
- const char *opt;
- char szKeyList[1000], sDesc[1000];
- sMime = gf_cfg_get_key_name(m_user.config, "MimeTypes", i);
- if (!sMime) continue;
- opt = gf_cfg_get_key(m_user.config, "MimeTypes", sMime);
- /*remove module name*/
- strcpy(szKeyList, opt+1);
- sKey = strrchr(szKeyList, '\"');
- if (!sKey) continue;
- sKey[0] = 0;
- /*get description*/
- sKey = strrchr(szKeyList, '\"');
- if (!sKey) continue;
- strcpy(sDesc, sKey+1);
- sKey[0] = 0;
- sKey = strrchr(szKeyList, '\"');
- if (!sKey) continue;
- sKey[0] = 0;
-
- /*if same description for # mime types skip (means an old mime syntax)*/
- if (sFiles.Find(wxString(sDesc, wxConvUTF8) )>=0) continue;
- /*if same extensions for # mime types skip (don't polluate the file list)*/
- if (sExts.Find(wxString(szKeyList, wxConvUTF8) )>=0) continue;
-
- sExts += wxString(szKeyList, wxConvUTF8);
- sExts += wxT(" ");
- sFiles += wxString(sDesc, wxConvUTF8);
- sFiles += wxT("|");
-
- wxString sOpt = wxString(szKeyList, wxConvUTF8);
- while (1) {
- wxString ext = sOpt.BeforeFirst(' ');
- if (ext.Find('.')<0) {
- if (first) first = 0;
- else sFiles += wxT(";");
- sFiles += wxT("*.");
- sFiles += ext;
- wxString sext = ext;
- sext += wxT(";");
- if (sSupportedFiles.Find(sext)<0) {
- sSupportedFiles += wxT(";*.");
- sSupportedFiles += ext;
- }
- }
- if (sOpt==ext) break;
- wxString rem = ext + wxT(" ");
- sOpt.Replace(rem, wxT(""), TRUE);
- }
- sFiles += wxT("|");
- }
- sSupportedFiles += wxT("|");
- sSupportedFiles += sFiles;
- sSupportedFiles += wxT("M3U Playlists|*.m3u|ShoutCast Playlists|*.pls|All Files|*.*||");
- return sSupportedFiles;
-}
-
-void wxOsmo4Frame::OnFileOpen(wxCommandEvent & WXUNUSED(event))
-{
- wxFileDialog dlg(this, wxT("Select file(s)"), wxT(""), wxT(""), GetFileFilter(), wxOPEN | wxMULTIPLE | wxCHANGE_DIR /*| wxHIDE_READONLY*/);
-
- if (dlg.ShowModal() != wxID_OK) return;
-
- wxArrayString stra;
- dlg.GetPaths(stra);
- if (stra.GetCount() == 1) {
- m_pPlayList->Truncate();
- } else {
- m_pPlayList->Clear();
- }
- for (u32 i=0; i<stra.GetCount(); i++)
- m_pPlayList->QueueURL(stra[i]);
-
- m_pPlayList->RefreshList();
- m_pPlayList->PlayNext();
-}
-
-void wxOsmo4Frame::OnFileOpenURL(wxCommandEvent & WXUNUSED(event))
-{
- OpenURLDlg dlg(this, m_user.config);
- if (dlg.ShowModal()==wxID_OK) {
- m_pPlayList->Truncate();
- m_pPlayList->QueueURL(dlg.m_urlVal);
- m_pPlayList->RefreshList();
- m_pPlayList->PlayNext();
- }
-}
-
-void wxOsmo4Frame::OnFileProperties(wxCommandEvent & WXUNUSED(event))
-{
- wxFileProps dlg(this);
- dlg.SetIcon(wxIcon(osmo4));
- dlg.ShowModal();
-}
-
-void wxOsmo4Frame::OnFileReload(wxCommandEvent & WXUNUSED(event))
-{
- gf_term_disconnect(m_term);
- m_connected = 0;
- DoConnect();
-}
-
-void wxOsmo4Frame::OnFileReloadConfig(wxCommandEvent & WXUNUSED(event))
-{
- gf_term_set_option(m_term, GF_OPT_RELOAD_CONFIG, 1);
-}
-
-void wxOsmo4Frame::OnFileQuit(wxCommandEvent & WXUNUSED(event))
-{
- Close(FALSE);
-}
-
-void wxOsmo4Frame::OnViewOriginal(wxCommandEvent & WXUNUSED(event))
-{
- if (!m_bExternalView) {
- DoLayout(m_orig_width, m_orig_height);
- } else {
- gf_term_set_option(m_term, GF_OPT_ORIGINAL_VIEW, 1);
- }
-}
-
-void wxOsmo4Frame::OnOptions(wxCommandEvent & WXUNUSED(event))
-{
- wxGPACControl dlg(this);
- dlg.SetIcon(wxIcon(osmo4));
- dlg.ShowModal();
-}
-
-void wxOsmo4Frame::DoConnect()
-{
- //if (m_connected) { gf_term_disconnect(m_term); m_connected = 0; }
-
- wxString url = m_pPlayList->GetURL();
- m_Address->SetValue(url);
-#ifdef __WXGTK__
- m_pVisual->SetFocus();
-#else
- m_pView->SetFocus();
-#endif
- wxString txt = wxT("Osmo4 - ");
- txt += m_pPlayList->GetDisplayName();
- SetTitle(txt);
- m_bStartupFile = 0;
- gf_term_connect(m_term, url.mb_str(wxConvUTF8));
-}
-
-void wxOsmo4Frame::OnLogs(wxCommandEvent & WXUNUSED(event))
-{
- m_pLogs->Show();
-}
-
-void wxOsmo4Frame::OnUpdateNeedsConnect(wxUpdateUIEvent &event)
-{
- event.Enable(m_connected ? 1 : 0);
-}
-
-void wxOsmo4Frame::OnUpdatePlay(wxUpdateUIEvent &event)
-{
- event.Enable( (m_connected || m_pPlayList->HasValidEntries()) ? 1 : 0);
-}
-
-void wxOsmo4Frame::OnUpdateFullScreen(wxUpdateUIEvent &event)
-{
- if (m_connected) {
- event.Enable(1);
- event.Check(gf_term_get_option(m_term, GF_OPT_FULLSCREEN) ? 1 : 0);
- } else {
- event.Enable(0);
- }
-}
-
-void wxOsmo4Frame::OnFullScreen(wxCommandEvent & WXUNUSED(event))
-{
- Bool isFS = gf_term_get_option(m_term, GF_OPT_FULLSCREEN) ? 1 : 0;
- gf_term_set_option(m_term, GF_OPT_FULLSCREEN, isFS ? 0 : 1);
-}
-
-void wxOsmo4Frame::OnViewARKeep(wxCommandEvent & WXUNUSED(event))
-{
- gf_term_set_option(m_term, GF_OPT_ASPECT_RATIO, GF_ASPECT_RATIO_KEEP);
-}
-void wxOsmo4Frame::OnViewARFill(wxCommandEvent & WXUNUSED(event))
-{
- gf_term_set_option(m_term, GF_OPT_ASPECT_RATIO, GF_ASPECT_RATIO_FILL_SCREEN);
-}
-void wxOsmo4Frame::OnViewAR169(wxCommandEvent & WXUNUSED(event))
-{
- gf_term_set_option(m_term, GF_OPT_ASPECT_RATIO, GF_ASPECT_RATIO_16_9);
-}
-void wxOsmo4Frame::OnViewAR43(wxCommandEvent & WXUNUSED(event))
-{
- gf_term_set_option(m_term, GF_OPT_ASPECT_RATIO, GF_ASPECT_RATIO_4_3);
-}
-
-void wxOsmo4Frame::OnUpdateAR(wxUpdateUIEvent &event)
-{
- if (!m_connected) {
- event.Enable(0);
- return;
- }
- event.Enable(1);
- u32 val = gf_term_get_option(m_term, GF_OPT_ASPECT_RATIO);
- if ((event.GetId() == VIEW_AR_FILL) && (val==GF_ASPECT_RATIO_FILL_SCREEN))
- event.Check(1);
- else if ((event.GetId() == VIEW_AR_KEEP) && (val==GF_ASPECT_RATIO_KEEP))
- event.Check(1);
- else if ((event.GetId() == VIEW_AR_169) && (val==GF_ASPECT_RATIO_16_9))
- event.Check(1);
- else if ((event.GetId() == VIEW_AR_43) && (val==GF_ASPECT_RATIO_4_3))
- event.Check(1);
- else event.Check(0);
-}
-
-void wxOsmo4Frame::OnShortcuts(wxCommandEvent & WXUNUSED(event))
-{
- wxMessageDialog dlg(this,
- wxT("Shortcuts with focus on main frame:\n")
- wxT("Open File: Ctrl + O\n")
- wxT("Show File Information: Ctrl + I\n")
- wxT("Reload File: Ctrl + R\n")
- wxT("Pause/Resume File: Ctrl + P\n")
- wxT("Step by Step: Ctrl + S\n")
- wxT("Fullscreen On/Off: Alt + Return\n")
- wxT("View Playlist: Ctrl + L\n")
- wxT("Aspect Ratio Normal: Ctrl + 1\n")
- wxT("Aspect Ratio Fill: Ctrl + 2\n")
- wxT("Aspect Ratio 4/3: Ctrl + 3\n")
- wxT("Aspect Ratio 16/9: Ctrl + 4\n")
- wxT("\n")
- wxT("Shortcuts with focus on video frame:\n")
- wxT("Seek +5% into presentation: Alt + right arrow\n")
- wxT("Seek -5% into presentation: Alt + left arrow\n")
- wxT("Seek +1min into presentation: Alt + up arrow\n")
- wxT("Seek -1min into presentation: Alt + down arrow\n")
- wxT("Next Playlist Entry: Ctrl + right arrow\n")
- wxT("Prev Playlist Entry: Ctrl + left arrow\n")
-
- , wxT("Shortcuts Available on Osmo4")
- , wxOK);
-
- dlg.ShowModal();
-}
-
-void wxOsmo4Frame::OnNavInfo(wxCommandEvent & WXUNUSED(event))
-{
- wxMessageDialog dlg(this,
- wxT("* Walk & Fly modes:\n")
- wxT("\tH move: H pan - V move: Z-translate - V move+CTRL or Wheel: V pan - Right Click (Walk only): Jump\n")
- wxT("\tleft/right: H pan - left/right+CTRL: H translate - up/down: Z-translate - up/down+CTRL: V pan\n")
- wxT("* Pan mode:\n")
- wxT("\tH move: H pan - V move: V pan - V move+CTRL or Wheel: Z-translate\n")
- wxT("\tleft/right: H pan - left/right+CTRL: H translate - up/down: V pan - up/down+CTRL: Z-translate\n")
- wxT("* Slide mode:\n")
- wxT("\tH move: H translate - V move: V translate - V move+CTRL or Wheel: Z-translate\n")
- wxT("\tleft/right: H translate - left/right+CTRL: H pan - up/down: V translate - up/down+CTRL: Z-translate\n")
- wxT("* Examine & Orbit mode:\n")
- wxT("\tH move: Y-Axis rotate - H move+CTRL: No move - V move: X-Axis rotate - V move+CTRL or Wheel: Z-translate\n")
- wxT("\tleft/right: Y-Axis rotate - left/right+CTRL: H translate - up/down: X-Axis rotate - up/down+CTRL: Y-translate\n")
- wxT("* VR mode:\n")
- wxT("\tH move: H pan - V move: V pan - V move+CTRL or Wheel: Camera Zoom\n")
- wxT("\tleft/right: H pan - up/down: V pan - up/down+CTRL: Camera Zoom\n")
- wxT("* Game mode (press END to escape):\n")
- wxT("\tH move: H pan - V move: V pan\n")
- wxT("\tleft/right: H translate - up/down: Z-translate\n")
- wxT("\n")
- wxT("* All 3D modes: CTRL+PGUP/PGDOWN will zoom in/out camera (field of view) \n")
- wxT("\n")
- wxT("*Slide Mode in 2D:\n")
- wxT("\tH move: H translate - V move: V translate - V move+CTRL: zoom\n")
- wxT("\tleft/right: H translate - up/down: V translate - up/down+CTRL: zoom\n")
- wxT("*Examine Mode in 2D (3D renderer only):\n")
- wxT("\tH move: Y-Axis rotate - V move: X-Axis rotate\n")
- wxT("\tleft/right: Y-Axis rotate - up/down: X-Axis rotate\n")
- wxT("\n")
- wxT("HOME: reset navigation to last viewpoint (2D or 3D navigation)\n")
- wxT("SHIFT key in all modes: fast movement\n")
-
- , wxT("3D navigation keys (\'H\'orizontal and \'V\'ertical) used in GPAC")
- , wxOK );
- dlg.ShowModal();
-}
-
-
-/*open file dlg*/
-class AboutDlg : public wxDialog {
-public:
- AboutDlg(wxWindow *parent);
-
-private:
- wxStaticText *m_info;
- wxButton *m_close;
- void OnClose(wxCommandEvent& event);
- DECLARE_EVENT_TABLE()
-};
-
-BEGIN_EVENT_TABLE(AboutDlg, wxDialog)
- EVT_BUTTON(ID_ABOUT_CLOSE, AboutDlg::OnClose)
-END_EVENT_TABLE()
-
-AboutDlg::AboutDlg(wxWindow *parent)
- : wxDialog(parent, -1, wxString(wxT("GPAC/Osmo4 V ")wxT(GPAC_FULL_VERSION)))
-{
- SetSize(220, 320);
- Centre();
- wxBoxSizer *sizer = new wxBoxSizer(wxVERTICAL);
-
- m_info = new wxStaticText(this, -1, wxT("http://gpac.sourceforge.net"), wxDefaultPosition, wxDefaultSize, wxALIGN_CENTRE);
- sizer->Add(m_info, 1, wxEXPAND|wxADJUST_MINSIZE, 0);
- m_close = new wxButton(this, ID_ABOUT_CLOSE, wxT("Close"), wxDefaultPosition, wxSize(120, 20));
- sizer->Add(m_close, 0, wxEXPAND, 0);
-
- SetIcon(wxIcon(osmo4));
- m_info->SetLabel(
- wxT("Osmo4 Player\n")
- wxT("GPAC Multimedia Framework\n")
- wxT("\n")
- wxT("This program is gf_free software and may\n")
- wxT("be distributed according to the terms\n")
- wxT("of the GNU Lesser General Public License\n")
- wxT("\n")
- wxT("Copyright (c) Jean Le Feuvre 2000-2005\n")
- wxT("(c) ENST 2005-200X\n")
- wxT("All Rights Reserved\n")
- wxT("http://gpac.sourceforge.net\n")
- wxT("\n")
- wxT(" ** With Many Thanks To ** \n\n")
- wxT("Mozilla SpiderMonkey (JavaScript)\n")
- wxT("The FreeType Project\n")
- wxT("The PNG Group, The I.J.G.\n")
- wxT("FFMPEG, FAAD, XVID, MAD\n")
- );
-
- SetSizer(sizer);
- sizer->Fit(this);
-}
-void AboutDlg::OnClose(wxCommandEvent& WXUNUSED(event))
-{
- Close(FALSE);
-}
-
-void wxOsmo4Frame::OnAbout(wxCommandEvent & WXUNUSED(event))
-{
- AboutDlg dlg(this);
- dlg.ShowModal();
-}
-
-
-void wxOsmo4Frame::OnGPACEvent(wxGPACEvent &event)
-{
- wxString cmd;
- wxCommandEvent evt;
- if (!m_term) return;
-
- switch (event.gpac_evt.type) {
- case GF_EVENT_NAVIGATE:
- if (gf_term_is_supported_url(m_term, event.to_url.mb_str(wxConvUTF8), 1, 0)) {
- char *str = gf_url_concatenate(m_pPlayList->GetURL().mb_str(wxConvUTF8), event.to_url.mb_str(wxConvUTF8));
- if (str) {
- m_pPlayList->Truncate();
- m_pPlayList->QueueURL(wxString(str, wxConvUTF8));
- m_pPlayList->RefreshList();
- gf_free(str);
- m_pPlayList->PlayNext();
- }
- return;
- }
- cmd = get_pref_browser(m_user.config);
- if (cmd.IsEmpty()){
- cmd += wxT(" ");
- cmd += event.to_url;
- wxExecute(cmd);
- } else {
-#ifdef wxLaunchDefaultBrowser
- wxLaunchDefaultBrowser(event.to_url);
-#endif
- }
- break;
- case GF_EVENT_QUIT:
- Close(TRUE);
- break;
- case GF_EVENT_SET_CAPTION:
- SetTitle(event.to_url);
- break;
- case GF_EVENT_CONNECT:
- BuildStreamList(0);
- ConnectAcknowledged(event.gpac_evt.connect.is_connected);
- break;
- case GF_EVENT_KEYDOWN:
- if (!(event.gpac_evt.key.flags & GF_KEY_MOD_CTRL)) return;
- switch (event.gpac_evt.key.key_code) {
- case GF_KEY_R:
- gf_term_set_option(m_term, GF_OPT_REFRESH, 1);
- break;
- case GF_KEY_P:
- OnFilePlay(evt);
- break;
- case GF_KEY_S:
- OnFileStep(evt);
- break;
- }
- break;
- case GF_EVENT_SCENE_SIZE:
- m_orig_width = event.gpac_evt.size.width;
- m_orig_height = event.gpac_evt.size.height;
- case GF_EVENT_SIZE:
- if (! gf_term_get_option(m_term, GF_OPT_FULLSCREEN)) {
- DoLayout(event.gpac_evt.size.width, event.gpac_evt.size.height);
- }
- break;
- case GF_EVENT_VIEWPOINTS:
- BuildViewList();
- break;
- case GF_EVENT_STREAMLIST:
- BuildStreamList(0);
- break;
- }
-}
-
-
-static wxString format_time(u32 duration, u32 timescale)
-{
- u32 h, m, s;
- Float time = duration;
- time /= timescale;
- time *= 1000;
- h = (u32) (time / 1000 / 3600);
- m = (u32) (time / 1000 / 60 - h*60);
- s = (u32) (time / 1000 - h*3600 - m*60);
- return wxString::Format(wxT("%02d:%02d:%02d"), h, m, s);
-}
-
-void wxOsmo4Frame::SetStatus(wxString str)
-{
- //m_pStatusbar->SetStatusText(str, 2);
- m_LastStatusTime = gf_sys_clock();
-}
-
-#define RTI_REFRESH_MS 500
-void wxOsmo4Frame::OnRTI(wxCommandEvent & event)
-{
- m_bViewRTI = event.IsChecked();
- if (m_bViewRTI) {
- if (!m_pTimer->IsRunning()) m_pTimer->Start(RTI_REFRESH_MS, 0);
- } else if (!m_connected && m_pTimer->IsRunning()) {
- m_LastStatusTime = 0;
- m_pStatusbar->SetStatusText(wxT("Ready"), 2);
- m_pTimer->Stop();
- }
-}
-
-void wxOsmo4Frame::OnTimer(wxTimerEvent& WXUNUSED(event))
-{
- wxString str;
- u32 now;
- if (m_LastStatusTime) {
- now = gf_sys_clock();
- if (now > 1000+m_LastStatusTime) {
- m_LastStatusTime = 0;
- m_pStatusbar->SetStatusText(wxT("Ready"), 2);
- }
- }
-
- if (m_bViewRTI) {
- GF_SystemRTInfo rti;
- if (!gf_sys_get_rti(RTI_REFRESH_MS, &rti, 0)) return;
- if (rti.gpac_memory) rti.process_memory = rti.gpac_memory;
-
- str = wxString::Format(wxT("CPU %02d (%02d) - Mem %d kB" ),
- rti.total_cpu_usage, rti.process_cpu_usage, rti.gpac_memory/1024);
-
- m_pStatusbar->SetStatusText(str, 2);
- }
- if (!m_connected) return;
-
- now = gf_term_get_time_in_ms(m_term);
- if (!now) return;
-
- if (!m_duration) {
- str = format_time(now, 1000);
- m_pStatusbar->SetStatusText(str);
- str = wxString::Format(wxT("FPS %.2f"), gf_term_get_framerate(m_term, 0));
- m_pStatusbar->SetStatusText(str, 1);
- return;
- }
-#ifdef __WXGTK__
- if (m_bGrabbed) {
- u32 now = gf_sys_clock() - m_last_grab_time;
- if (now>200) {
- m_bGrabbed = 0;
- Double res = (Double) m_last_grab_pos;
- res /= 1000;
- res *= m_duration;
- if (gf_term_get_option(m_term, GF_OPT_PLAY_STATE)==GF_STATE_PAUSED) {
- gf_term_set_option(m_term, GF_OPT_PLAY_STATE, GF_STATE_PLAYING);
- m_bToReset = 0;
- }
- gf_term_play_from_time(m_term, (u32) res, 0);
- return;
- }
- }
-#endif
-
- if (!m_bGrabbed) {
- if ((now >= m_duration + 500) && gf_term_get_option(m_term, GF_OPT_IS_FINISHED)) {
- m_pPlayList->PlayNext();
- } else {
- Double val = now * 1000;
- val /= m_duration;
- m_pProg->SetValue((val<=1000) ? (u32) val : 1000);
-
- if (0) {
- str = format_time(m_duration-now, 1000);
- } else {
- str = format_time(now, 1000);
- }
- m_pStatusbar->SetStatusText(str);
- str = wxString::Format(wxT("FPS %.2f"), gf_term_get_framerate(m_term, 0));
- m_pStatusbar->SetStatusText(str, 1);
- }
- }
-}
-
-void wxOsmo4Frame::ConnectAcknowledged(Bool bOk)
-{
- if (bOk) {
- m_pTimer->Start(RTI_REFRESH_MS, 0);
- m_connected = 1;
- m_bToReset = 0;
- UpdatePlay();
- BuildChapterList(0);
- } else {
- BuildChapterList(1);
- if (!m_connected) {
- UpdatePlay();
- m_pTimer->Stop();
- //m_pProg->Enable(0);
- }
- }
-}
-
-void wxOsmo4Frame::OnFilePlay(wxCommandEvent & WXUNUSED(event))
-{
- wxCommandEvent evt;
- if (m_connected) {
- if (gf_term_get_option(m_term, GF_OPT_PLAY_STATE)==GF_STATE_PAUSED) {
- gf_term_set_option(m_term, GF_OPT_PLAY_STATE, GF_STATE_PLAYING);
- if (m_bToReset) {
- m_pTimer->Start(100, 0);
- gf_term_play_from_time(m_term, 0, 0);
- }
- m_bToReset = 0;
- UpdatePlay();
- } else {
- gf_term_set_option(m_term, GF_OPT_PLAY_STATE, GF_STATE_PAUSED);
- UpdatePlay();
- }
- } else {
- m_pPlayList->Play();
- }
-}
-
-void wxOsmo4Frame::OnFileStep(wxCommandEvent & WXUNUSED(event))
-{
- wxCommandEvent evt;
- gf_term_set_option(m_term, GF_OPT_PLAY_STATE, GF_STATE_STEP_PAUSE);
- UpdatePlay();
-}
-
-void wxOsmo4Frame::OnFileStop(wxCommandEvent &WXUNUSED(event))
-{
- Stop();
-}
-
-void wxOsmo4Frame::Stop()
-{
- if (gf_term_get_option(m_term, GF_OPT_PLAY_STATE)==GF_STATE_PLAYING) {
- gf_term_set_option(m_term, GF_OPT_PLAY_STATE, GF_STATE_PAUSED);
- }
- m_bToReset = 1;
- m_pTimer->Stop();
- m_pProg->SetValue(0);
- UpdatePlay();
-}
-
-void wxOsmo4Frame::OnSlide(wxScrollEvent &event)
-{
- if (!m_duration) return;
-
- /*wxSlider on GTK is buggy, so track a release timeout*/
-#ifdef __WXGTK__
- m_last_grab_time = gf_sys_clock();
- m_bGrabbed = 1;
- m_last_grab_pos = event.GetPosition();
- Double now = (Double) m_last_grab_pos;
- now /= 1000;
- now *= m_duration;
- wxString str = format_time((u32) (now), 1000);
- m_pStatusbar->SetStatusText(str);
- if (!m_pTimer->IsRunning()) m_pTimer->Start(100, 0);
-#else
- s32 type = event.GetEventType();
- if (type == wxEVT_SCROLL_THUMBTRACK) {
- m_bGrabbed = 1;
- Double now = (Double) event.GetPosition();
- now /= 1000;
- now *= m_duration;
- wxString str = format_time((u32) (now), 1000);
- m_pStatusbar->SetStatusText(str);
- }
- else if (m_bGrabbed){
- m_bGrabbed = 0;
- Double res = (Double) m_pProg->GetValue();
- res /= 1000;
- res *= m_duration;
- if (gf_term_get_option(m_term, GF_OPT_PLAY_STATE)==GF_STATE_PAUSED) {
- gf_term_set_option(m_term, GF_OPT_PLAY_STATE, GF_STATE_PLAYING);
- m_bToReset = 0;
- if (!m_pTimer->IsRunning()) m_pTimer->Start(100, 0);
- }
- gf_term_play_from_time(m_term, (u32) res, 0);
- }
-#endif
-}
-
-
-void wxOsmo4Frame::BuildViewList()
-{
- if (!vp_list || !m_connected) return;
-
- while (vp_list->GetMenuItemCount()) {
- wxMenuItem* it = vp_list->FindItemByPosition(0);
- vp_list->Delete(it);
- }
-
- s32 id = ID_VIEWPOINT_FIRST;
- nb_viewpoints = 0;
- while (1) {
- const char *szName;
- Bool bound;
- GF_Err e = gf_term_get_viewpoint(m_term, nb_viewpoints+1, &szName, &bound);
- if (e) break;
- if (szName) {
- vp_list->AppendCheckItem(id+nb_viewpoints, wxString(szName, wxConvUTF8) );
- } else {
- vp_list->AppendCheckItem(id+nb_viewpoints, wxString::Format(wxT("Viewpoint #%d"), nb_viewpoints+1) );
- }
- nb_viewpoints++;
- }
-}
-
-void wxOsmo4Frame::OnViewport(wxCommandEvent & event)
-{
- u32 ID = event.GetId() - ID_VIEWPOINT_FIRST;
- gf_term_set_viewpoint(m_term, ID+1, NULL);
-}
-
-void wxOsmo4Frame::OnUpdateViewport(wxUpdateUIEvent & event)
-{
- u32 ID = event.GetId() - ID_VIEWPOINT_FIRST;
- const char *szName;
- Bool bound;
- gf_term_get_viewpoint(m_term, ID+1, &szName, &bound);
- event.Enable(1);
- if (bound) event.Check(1);
-}
-
-void wxOsmo4Frame::OnNavigate(wxCommandEvent & event)
-{
- switch (event.GetId()) {
- case ID_NAVIGATE_NONE: gf_term_set_option(m_term, GF_OPT_NAVIGATION, GF_NAVIGATE_NONE); break;
- case ID_NAVIGATE_WALK: gf_term_set_option(m_term, GF_OPT_NAVIGATION, GF_NAVIGATE_WALK); break;
- case ID_NAVIGATE_FLY: gf_term_set_option(m_term, GF_OPT_NAVIGATION, GF_NAVIGATE_FLY); break;
- case ID_NAVIGATE_EXAMINE: gf_term_set_option(m_term, GF_OPT_NAVIGATION, GF_NAVIGATE_EXAMINE); break;
- case ID_NAVIGATE_PAN: gf_term_set_option(m_term, GF_OPT_NAVIGATION, GF_NAVIGATE_PAN); break;
- case ID_NAVIGATE_SLIDE: gf_term_set_option(m_term, GF_OPT_NAVIGATION, GF_NAVIGATE_SLIDE); break;
- case ID_NAVIGATE_ORBIT: gf_term_set_option(m_term, GF_OPT_NAVIGATION, GF_NAVIGATE_ORBIT); break;
- case ID_NAVIGATE_GAME: gf_term_set_option(m_term, GF_OPT_NAVIGATION, GF_NAVIGATE_GAME); break;
- }
-}
-void wxOsmo4Frame::OnNavigateReset(wxCommandEvent & WXUNUSED(event))
-{
- gf_term_set_option(m_term, GF_OPT_NAVIGATION_TYPE, 0);
-}
-void wxOsmo4Frame::OnUpdateNavigation(wxUpdateUIEvent & event)
-{
- u32 ID = event.GetId();
- event.Enable(0);
- if (!m_connected) return;
- u32 type = gf_term_get_option(m_term, GF_OPT_NAVIGATION_TYPE);
- bool enable = type ? 1 : 0;
-
- u32 mode = gf_term_get_option(m_term, GF_OPT_NAVIGATION);
- /*common 2D/3D modes*/
- if (ID==ID_NAVIGATE_NONE) { event.Enable(enable); event.Check(mode ? 0 : 1); }
- else if (ID==ID_NAVIGATE_EXAMINE) { event.Enable(enable); event.Check((mode==GF_NAVIGATE_EXAMINE) ? 1 : 0); }
- else if (ID==ID_NAVIGATE_SLIDE) { event.Enable(enable); event.Check((mode==GF_NAVIGATE_SLIDE) ? 1 : 0); }
-
- if (type==GF_NAVIGATE_TYPE_2D) return;
- event.Enable(enable);
- if (ID==ID_NAVIGATE_WALK) event.Check((mode==GF_NAVIGATE_WALK) ? 1 : 0);
- else if (ID==ID_NAVIGATE_FLY) event.Check((mode==GF_NAVIGATE_FLY) ? 1 : 0);
- else if (ID==ID_NAVIGATE_PAN) event.Check((mode==GF_NAVIGATE_PAN) ? 1 : 0);
- else if (ID==ID_NAVIGATE_ORBIT) event.Check((mode==GF_NAVIGATE_ORBIT) ? 1 : 0);
- else if (ID==ID_NAVIGATE_GAME) event.Check((mode==GF_NAVIGATE_GAME) ? 1 : 0);
-}
-
-void wxOsmo4Frame::OnRenderSwitch(wxCommandEvent &WXUNUSED(event))
-{
- const char *opt = gf_cfg_get_key(m_user.config, "Compositor", "ForceOpenGL");
- Bool use_gl = (opt && !stricmp(opt, "yes")) ? 1 : 0;
- gf_cfg_set_key(m_user.config, "Compositor", "ForceOpenGL", use_gl ? "no" : "yes");
-
- gf_term_set_option(m_term, GF_OPT_USE_OPENGL, !use_gl);
-
- UpdateRenderSwitch();
-}
-
-void wxOsmo4Frame::UpdateRenderSwitch()
-{
- const char *opt = gf_cfg_get_key(m_user.config, "Compositor", "ForceOpenGL");
- m_pToolBar->RemoveTool(SWITCH_RENDER);
- if (opt && !stricmp(opt, "yes"))
- m_pToolBar->InsertTool(12, SWITCH_RENDER, *m_pSW2D, wxNullBitmap, FALSE, NULL, wxT("2D Rasterizer"));
- else
- m_pToolBar->InsertTool(12, SWITCH_RENDER, *m_pSW3D, wxNullBitmap, FALSE, NULL, wxT("OpenGL Rendering"));
-
-#ifdef WIN32
- /*there's a display bug with the menubtn, remove and reinsert*/
- m_pToolBar->RemoveTool(FILE_PREV);
- m_pToolBar->RemoveTool(FILE_NEXT);
- m_pToolBar->InsertControl(2, m_pPrevBut);
- m_pToolBar->InsertControl(3, m_pNextBut);
-#endif
- m_pToolBar->Realize();
-}
-
-void wxOsmo4Frame::UpdatePlay()
-{
- m_pToolBar->RemoveTool(FILE_PLAY);
- if (m_connected) {
- if (gf_term_get_option(m_term, GF_OPT_PLAY_STATE)==GF_STATE_PAUSED)
- m_pToolBar->InsertTool(5, FILE_PLAY, *m_pPlay, wxNullBitmap, FALSE, NULL, wxT("Pause File"));
- else
- m_pToolBar->InsertTool(5, FILE_PLAY, *m_pPause, wxNullBitmap, FALSE, NULL, wxT("Play File"));
- } else {
- m_pToolBar->InsertTool(5, FILE_PLAY, *m_pPlay, wxNullBitmap, FALSE, NULL, wxT("Pause File"));
- }
-
-#ifdef WIN32
- /*there's a display bug with the menubtn, remove and reinsert*/
- m_pToolBar->RemoveTool(FILE_PREV);
- m_pToolBar->RemoveTool(FILE_NEXT);
- m_pToolBar->InsertControl(2, m_pPrevBut);
- m_pToolBar->InsertControl(3, m_pNextBut);
-#endif
- m_pToolBar->Realize();
-}
-
-void wxOsmo4Frame::OnCollide(wxCommandEvent & event)
-{
- u32 ID = event.GetId();
- if (ID==ID_COLLIDE_NONE) gf_term_set_option(m_term, GF_OPT_COLLISION, GF_COLLISION_NONE);
- else if (ID==ID_COLLIDE_REG) gf_term_set_option(m_term, GF_OPT_COLLISION, GF_COLLISION_NORMAL);
- else if (ID==ID_COLLIDE_DISP) gf_term_set_option(m_term, GF_OPT_COLLISION, GF_COLLISION_DISPLACEMENT);
-}
-void wxOsmo4Frame::OnUpdateCollide(wxUpdateUIEvent & event)
-{
- u32 ID = event.GetId();
- event.Enable(0);
- if (!m_connected) return;
- event.Enable(1);
- u32 mode = gf_term_get_option(m_term, GF_OPT_COLLISION);
- if (ID==ID_COLLIDE_NONE) { event.Check((mode==GF_COLLISION_NONE) ? 1 : 0); }
- else if (ID==ID_COLLIDE_REG) { event.Check((mode==GF_COLLISION_NORMAL) ? 1 : 0); }
- else if (ID==ID_COLLIDE_DISP) { event.Check((mode==GF_COLLISION_DISPLACEMENT) ? 1 : 0); }
-}
-
-void wxOsmo4Frame::OnHeadlight(wxCommandEvent &WXUNUSED(event))
-{
- Bool val = !gf_term_get_option(m_term, GF_OPT_HEADLIGHT);
- gf_term_set_option(m_term, GF_OPT_HEADLIGHT, val);
-}
-void wxOsmo4Frame::OnUpdateHeadlight(wxUpdateUIEvent & event)
-{
- event.Enable(0);
- if (!m_connected) return;
- u32 type = gf_term_get_option(m_term, GF_OPT_NAVIGATION_TYPE);
- if (type!=GF_NAVIGATE_TYPE_3D) return;
-
- event.Enable(1);
- event.Check(gf_term_get_option(m_term, GF_OPT_HEADLIGHT) ? 1 : 0);
-}
-void wxOsmo4Frame::OnGravity(wxCommandEvent & WXUNUSED(event))
-{
- Bool val = gf_term_get_option(m_term, GF_OPT_GRAVITY) ? 0 : 1;
- gf_term_set_option(m_term, GF_OPT_GRAVITY, val);
-}
-void wxOsmo4Frame::OnUpdateGravity(wxUpdateUIEvent & event)
-{
- event.Enable(0);
- if (!m_connected) return;
- u32 type = gf_term_get_option(m_term, GF_OPT_NAVIGATION_TYPE);
- if (type!=GF_NAVIGATE_TYPE_3D) return;
- type = gf_term_get_option(m_term, GF_OPT_NAVIGATION);
- if (type != GF_NAVIGATE_WALK) return;
- event.Enable(1);
- event.Check(gf_term_get_option(m_term, GF_OPT_GRAVITY) ? 1 : 0);
-}
-
-
-BEGIN_EVENT_TABLE(wxMyComboBox, wxComboBox)
- EVT_KEY_UP(wxMyComboBox::OnKeyUp)
-END_EVENT_TABLE()
-
-void wxMyComboBox::OnKeyUp(wxKeyEvent &event)
-{
- if (event.GetKeyCode()==WXK_RETURN) {
- event.Skip();
- wxCommandEvent evt;
- evt.SetEventType(wxEVT_COMMAND_COMBOBOX_SELECTED);
- evt.SetEventObject(this);
- evt.SetId(GetId());
- GetParent()->AddPendingEvent(evt);
- }
-}
-
-
-void wxOsmo4Frame::ReloadURLs()
-{
- const char *sOpt;
- u32 i=0;
-
- m_Address->Clear();
- while (1) {
- sOpt = gf_cfg_get_key_name(m_user.config, "RecentFiles", i);
- if (!sOpt) break;
- m_Address->Append(wxString(sOpt, wxConvUTF8) );
- i++;
- }
-}
-
-void wxOsmo4Frame::SelectionReady()
-{
- wxString urlVal = m_Address->GetValue();
- if (urlVal.Find(wxT("://"))>0) {
- UpdateLastFiles(m_user.config, urlVal.mb_str(wxConvUTF8));
- ReloadURLs();
- }
- m_pPlayList->Truncate();
- m_pPlayList->QueueURL(urlVal);
- m_pPlayList->RefreshList();
- m_pPlayList->PlayNext();
-}
-
-void wxOsmo4Frame::OnURLSelect(wxCommandEvent &WXUNUSED(event))
-{
- SelectionReady();
-}
-
-void wxOsmo4Frame::OnPlaylist(wxCommandEvent &WXUNUSED(event))
-{
- assert(m_pPlayList);
- m_pPlayList->Show(m_pPlayList->IsShown() ? 0 : 1);
-}
-
-void wxOsmo4Frame::OnUpdatePlayList(wxUpdateUIEvent & event)
-{
- event.Enable(1);
- event.Check(m_pPlayList->IsShown() ? 1 : 0);
-}
-
-void wxOsmo4Frame::OnFilePrevOpen(wxNotifyEvent & event)
-{
- u32 count = gf_list_count(m_pPlayList->m_entries);
- u32 start = m_pPlayList->m_cur_entry - 1;
- wxMenu *popup = new wxMenu();
-
- for (u32 i=0; i<10; i++) {
- if (i > start) break;
- if (start - i >= count) break;
- PLEntry *ple = (PLEntry *) gf_list_get(m_pPlayList->m_entries, start - i);
- popup->Append(ID_NAV_PREV_0 + i, wxString(ple->m_disp_name, wxConvUTF8) );
- }
- m_pPrevBut->AssignMenu(popup);
-}
-
-void wxOsmo4Frame::OnFileNextOpen(wxNotifyEvent & event)
-{
- u32 count = gf_list_count(m_pPlayList->m_entries);
- wxMenu *popup = new wxMenu();
- u32 start = m_pPlayList->m_cur_entry + 1;
- for (u32 i=0; i<10; i++) {
- if (start + i >= count) break;
- PLEntry *ple = (PLEntry *) gf_list_get(m_pPlayList->m_entries, start + i);
- popup->Append(ID_NAV_NEXT_0 + i, wxString(ple->m_disp_name, wxConvUTF8) );
- }
- m_pNextBut->AssignMenu(popup);
-}
-
-void wxOsmo4Frame::OnNavPrev(wxCommandEvent &WXUNUSED(event))
-{
- if (m_pPlayList->m_cur_entry<=0) return;
- m_pPlayList->PlayPrev();
-}
-void wxOsmo4Frame::OnUpdateNavPrev(wxUpdateUIEvent & event)
-{
- if (m_pPlayList->m_cur_entry<=0) event.Enable(0);
- else event.Enable(TRUE);
-}
-void wxOsmo4Frame::OnNavPrevMenu(wxCommandEvent &event)
-{
- u32 ID = event.GetId() - ID_NAV_PREV_0;
- s32 prev = m_pPlayList->m_cur_entry - ID;
- if (prev>=0) {
- m_pPlayList->m_cur_entry = prev;
- m_pPlayList->PlayPrev();
- }
-}
-void wxOsmo4Frame::OnNavNext(wxCommandEvent &WXUNUSED(event))
-{
- /*don't play if last could trigger playlist loop*/
- if ((m_pPlayList->m_cur_entry<0) || (gf_list_count(m_pPlayList->m_entries) == 1 + (u32) m_pPlayList->m_cur_entry)) return;
- m_pPlayList->PlayNext();
-}
-void wxOsmo4Frame::OnUpdateNavNext(wxUpdateUIEvent & event)
-{
- if (m_pPlayList->m_cur_entry<0) event.Enable(0);
- else if ((u32) m_pPlayList->m_cur_entry + 1 == gf_list_count(m_pPlayList->m_entries) ) event.Enable(0);
- else event.Enable(1);
-}
-
-void wxOsmo4Frame::OnNavNextMenu(wxCommandEvent &event)
-{
- u32 ID = event.GetId() - ID_NAV_NEXT_0;
- s32 next = m_pPlayList->m_cur_entry + ID;
- if (next < (s32) gf_list_count(m_pPlayList->m_entries) ) {
- m_pPlayList->m_cur_entry = next;
- m_pPlayList->PlayNext();
- }
-}
-
-void wxOsmo4Frame::OnClearNav(wxCommandEvent &WXUNUSED(event))
-{
- m_pPlayList->ClearButPlaying();
-}
-
-
-void wxOsmo4Frame::BuildStreamList(Bool reset_only)
-{
- u32 nb_subs;
- wxMenu *pMenu;
-
- pMenu = sel_menu->FindItemByPosition(0)->GetSubMenu();
- while (pMenu->GetMenuItemCount()) {
- wxMenuItem* it = pMenu->FindItemByPosition(0);
- pMenu->Delete(it);
- }
- pMenu = sel_menu->FindItemByPosition(1)->GetSubMenu();
- while (pMenu->GetMenuItemCount()) {
- wxMenuItem* it = pMenu->FindItemByPosition(0);
- pMenu->Delete(it);
- }
- pMenu = sel_menu->FindItemByPosition(2)->GetSubMenu();
- while (pMenu->GetMenuItemCount()) {
- wxMenuItem* it = pMenu->FindItemByPosition(0);
- pMenu->Delete(it);
- }
-
- if (reset_only) {
- m_bFirstStreamListBuild = 1;
- return;
- }
-
- if (!gf_term_get_option(m_term, GF_OPT_CAN_SELECT_STREAMS)) return;
-
- nb_subs = 0;
- GF_ObjectManager *root_od = gf_term_get_root_object(m_term);
- if (!root_od) return;
- u32 count = gf_term_get_object_count(m_term, root_od);
-
- for (u32 i=0; i<count; i++) {
- char szLabel[1024];
- GF_MediaInfo info;
- GF_ObjectManager *odm = gf_term_get_object(m_term, root_od, i);
- if (!odm) return;
-
- if (gf_term_get_object_info(m_term, odm, &info) != GF_OK) break;
-
- if (info.owns_service) {
- char *szName = (char *) strrchr(info.service_url, '\\');
- if (!szName) szName = (char *) strrchr(info.service_url, '/');
- if (!szName) szName = (char *) info.service_url;
- else szName += 1;
- strcpy(szLabel, szName);
- szName = strrchr(szLabel, '.');
- if (szName) szName[0] = '\0';
- }
- switch (info.od_type) {
- case GF_STREAM_AUDIO:
- pMenu = sel_menu->FindItemByPosition(0)->GetSubMenu();
- if (!info.owns_service) sprintf(szLabel, "Audio #"LLU, (u64)pMenu->GetMenuItemCount() + 1);
- pMenu->AppendCheckItem(ID_SELSTREAM_0 +i, wxString(szLabel, wxConvUTF8));
- break;
- case GF_STREAM_VISUAL:
- pMenu = sel_menu->FindItemByPosition(1)->GetSubMenu();
- if (!info.owns_service) sprintf(szLabel, "Video #"LLU, (u64)pMenu->GetMenuItemCount() + 1);
- pMenu->AppendCheckItem(ID_SELSTREAM_0 +i, wxString(szLabel, wxConvUTF8));
- break;
- case GF_STREAM_TEXT:
- nb_subs ++;
- pMenu = sel_menu->FindItemByPosition(2)->GetSubMenu();
- if (!info.owns_service) sprintf(szLabel, "Subtitle #"LLU, (u64)pMenu->GetMenuItemCount() + 1);
- pMenu->AppendCheckItem(ID_SELSTREAM_0 +i, wxString(szLabel, wxConvUTF8));
- break;
- }
- }
- if (m_bFirstStreamListBuild) {
- m_bFirstStreamListBuild = 0;
- if (!nb_subs && m_lookforsubs) LookForSubtitles();
- }
-}
-
-void wxOsmo4Frame::OnStreamSel(wxCommandEvent & event)
-{
- GF_ObjectManager *root_od = gf_term_get_root_object(m_term);
- if (!root_od) return;
- u32 ID = event.GetId() - ID_SELSTREAM_0;
- GF_ObjectManager *odm = gf_term_get_object(m_term, root_od, ID);
- gf_term_select_object(m_term, odm);
-}
-
-void wxOsmo4Frame::OnUpdateStreamSel(wxUpdateUIEvent & event)
-{
- GF_ObjectManager *root_od = gf_term_get_root_object(m_term);
- if (!root_od) return;
- u32 ID = event.GetId() - ID_SELSTREAM_0;
-
- GF_ObjectManager *odm = gf_term_get_object(m_term, root_od, ID);
- if (!odm) return;
-
- GF_MediaInfo info;
- gf_term_get_object_info(m_term, odm, &info);
- event.Enable(1);
- event.Check(info.status ? 1 : 0);
-}
-
-void wxOsmo4Frame::OnUpdateStreamMenu(wxUpdateUIEvent & event)
-{
- if (!m_connected || !gf_term_get_option(m_term, GF_OPT_CAN_SELECT_STREAMS)) {
- event.Enable(0);
- } else {
- event.Enable(1);
- }
-}
-
-void wxOsmo4Frame::OnAddSub(wxCommandEvent &WXUNUSED(event))
-{
- wxFileDialog dlg(this, wxT("Add Subtitle"), wxT(""), wxT(""), wxT("All Subtitles|*.srt;*.ttxt|SRT Subtitles|*.srt|3GPP TimedText|*.ttxt|"), wxOPEN | wxCHANGE_DIR /* | wxHIDE_READONLY*/);
-
- if (dlg.ShowModal() == wxID_OK) {
- AddSubtitle(dlg.GetPath().mb_str(wxConvUTF8), 1);
- }
-
-}
-
-void wxOsmo4Frame::AddSubtitle(const char *fileName, Bool auto_play)
-{
- gf_term_add_object(m_term, fileName, auto_play);
-}
-
-static Bool subs_enum_dir_item(void *cbck, char *item_name, char *item_path)
-{
- wxOsmo4Frame *_this = (wxOsmo4Frame*)cbck;
- _this->AddSubtitle(item_path, 0);
- return 0;
-}
-
-void wxOsmo4Frame::LookForSubtitles()
-{
- char dir[GF_MAX_PATH];
- const char *url = m_pPlayList->GetURL().mb_str(wxConvUTF8);
- strcpy(dir, url);
- char *sep = strrchr(dir, '\\');
- if (!sep) strcpy(dir, ::wxGetCwd().mb_str(wxConvUTF8));
- else sep[0] = 0;
-
- gf_enum_directory(dir, 0, subs_enum_dir_item, this, "ttxt;srt");
-}
-
-void wxOsmo4Frame::OnCacheEnable(wxCommandEvent &WXUNUSED(event))
-{
- u32 state = gf_term_get_option(m_term, GF_OPT_MEDIA_CACHE);
- if (state==GF_MEDIA_CACHE_DISABLED) {
- gf_term_set_option(m_term, GF_OPT_MEDIA_CACHE, GF_MEDIA_CACHE_ENABLED);
- } else if (state==GF_MEDIA_CACHE_DISABLED) {
- gf_term_set_option(m_term, GF_OPT_MEDIA_CACHE, GF_MEDIA_CACHE_DISABLED);
- }
-}
-
-void wxOsmo4Frame::OnCacheStop(wxCommandEvent &WXUNUSED(event))
-{
- gf_term_set_option(m_term, GF_OPT_MEDIA_CACHE, GF_MEDIA_CACHE_DISABLED);
-}
-
-void wxOsmo4Frame::OnCacheAbort(wxCommandEvent &WXUNUSED(event))
-{
- gf_term_set_option(m_term, GF_OPT_MEDIA_CACHE, GF_MEDIA_CACHE_DISCARD);
-}
-
-void wxOsmo4Frame::OnUpdateCacheEnable(wxUpdateUIEvent & event)
-{
- u32 state = gf_term_get_option(m_term, GF_OPT_MEDIA_CACHE);
- switch (state) {
- case GF_MEDIA_CACHE_ENABLED:
- event.Enable(1);
- event.SetText(wxT("Enabled"));
- break;
- case GF_MEDIA_CACHE_RUNNING:
- event.SetText(wxT("Running"));
- event.Enable(0);
- break;
- case GF_MEDIA_CACHE_DISABLED:
- event.SetText(wxT("Disabled"));
- break;
- }
-}
-
-void wxOsmo4Frame::OnUpdateCacheAbort(wxUpdateUIEvent & event)
-{
- u32 state = gf_term_get_option(m_term, GF_OPT_MEDIA_CACHE);
- event.Enable( (state==GF_MEDIA_CACHE_RUNNING) ? 1 : 0);
-}
-
-
-
-void wxOsmo4Frame::BuildChapterList(Bool reset_only)
-{
- GF_MediaInfo odi;
-
- while (chap_menu->GetMenuItemCount()) {
- wxMenuItem* it = chap_menu->FindItemByPosition(0);
- chap_menu->Delete(it);
- }
- if (m_chapters_start) gf_free(m_chapters_start);
- m_chapters_start = NULL;
- m_num_chapters = 0;
- if (reset_only) return;
-
- GF_ObjectManager *root_od = gf_term_get_root_object(m_term);
- if (!root_od) return;
- if (gf_term_get_object_info(m_term, root_od, &odi) != GF_OK) return;
-
- u32 count = gf_list_count(odi.od->OCIDescriptors);
- m_num_chapters = 0;
- for (u32 i=0; i<count; i++) {
- char szLabel[1024];
- GF_Segment *seg = (GF_Segment *) gf_list_get(odi.od->OCIDescriptors, i);
- if (seg->tag != GF_ODF_SEGMENT_TAG) continue;
-
- if (seg->SegmentName && strlen((const char *)seg->SegmentName)) {
- strcpy(szLabel, (const char *) seg->SegmentName);
- } else {
- sprintf(szLabel, "Chapter %02d", m_num_chapters+1);
- }
- chap_menu->AppendCheckItem(ID_SETCHAP_FIRST + m_num_chapters, wxString(szLabel, wxConvUTF8));
-
- m_chapters_start = (Double *) gf_realloc(m_chapters_start, sizeof(Double)*(m_num_chapters+1));
- m_chapters_start[m_num_chapters] = seg->startTime;
- m_num_chapters++;
- }
-
- /*get any service info*/
- NetInfoCommand com;
- if (!m_bStartupFile && gf_term_get_service_info(m_term, root_od, &com) == GF_OK) {
- wxString title = wxT("");
- if (com.track_info) { title.Format(wxT("%02d "), (u32) (com.track_info>>16) ); }
- if (com.artist) { title.Append(wxString(com.artist, wxConvUTF8)); title += wxT(" "); }
- if (com.name) { title.Append(wxString(com.name, wxConvUTF8)); title += wxT(" "); }
- if (com.album) { title += wxT("("); title.Append(wxString(com.album, wxConvUTF8)); title += wxT(")"); }
-
- if (title.length()) SetTitle(title);
- }
-
-}
-
-void wxOsmo4Frame::OnChapterSel(wxCommandEvent & event)
-{
- GF_ObjectManager *root_od = gf_term_get_root_object(m_term);
- if (!root_od) return;
- u32 ID = event.GetId() - ID_SETCHAP_FIRST;
- gf_term_play_from_time(m_term, (u32) (1000*m_chapters_start[ID]), 0);
-}
-
-void wxOsmo4Frame::OnUpdateChapterSel(wxUpdateUIEvent & event)
-{
- Double now;
- Bool is_current;
- u32 ID = event.GetId() - ID_SETCHAP_FIRST;
-
- now = gf_term_get_time_in_ms(m_term);
- now /= 1000;
-
- is_current = 0;
- if (m_chapters_start[ID]<=now) {
- if (ID+1<m_num_chapters) {
- if (m_chapters_start[ID+1]>now) is_current = 1;
- } else {
- is_current = 1;
- }
- }
- event.Enable(1);
- event.Check(is_current ? 1 : 0);
-}
-
-void wxOsmo4Frame::OnUpdateChapterMenu(wxUpdateUIEvent & event)
-{
- if (!m_connected || !m_num_chapters) {
- event.Enable(0);
- } else {
- event.Enable(1);
- }
-}
-
-void wxOsmo4Frame::OnFileCopy(wxCommandEvent &event)
-{
- const char *text = gf_term_get_text_selection(m_term, 0);
- if (!text) return;
- if (!wxTheClipboard->Open()) return;
-
- wxTheClipboard->SetData( new wxTextDataObject( wxString(text, wxConvUTF8)) );
- wxTheClipboard->Close();
-}
-
-void wxOsmo4Frame::OnUpdateFileCopy(wxUpdateUIEvent &event)
-{
- if (gf_term_get_text_selection(m_term, 1)!=NULL) {
- event.Enable(1);
- } else {
- event.Enable(0);
- }
-}
-
-void wxOsmo4Frame::OnFilePaste(wxCommandEvent &event)
-{
- if (!wxTheClipboard->Open()) return;
- if (wxTheClipboard->IsSupported( wxDF_TEXT )) {
- wxTextDataObject data;
- wxTheClipboard->GetData(data);
- gf_term_paste_text(m_term, data.GetText().mb_str(wxConvUTF8), 0);
- }
- wxTheClipboard->Close();
-}
-
-void wxOsmo4Frame::OnUpdateFilePaste(wxUpdateUIEvent &event)
-{
- Bool ok = 0;
- if (wxTheClipboard->Open()) {
- if (wxTheClipboard->IsSupported( wxDF_TEXT )) {
- if (gf_term_paste_text(m_term, NULL, 1)==GF_OK) {
- ok = 1;
- }
- }
- wxTheClipboard->Close();
- }
- event.Enable(ok ? 1 : 0);
-}
-
+++ /dev/null
-/*
- * GPAC - Multimedia Framework C SDK
- *
- * Copyright (c) Jean Le Feuvre 2000-2005
- * All rights reserved
- *
- * This file is part of GPAC / Osmo4 wxWidgets GUI
- *
- * GPAC is free software; you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation; either version 2, or (at your option)
- * any later version.
- *
- * GPAC is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; see the file COPYING. If not, write to
- * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
- *
- *
- */
-
-#ifndef _WXOSMO4_H
-#define _WXOSMO4_H
-
-/*
-we need to force X to work in sync mode when we use embedded view...
-include first to avoid Bool type redef between X11 and gpac
-*/
-#ifdef __WXGTK__
-#include <X11/Xlib.h>
-#endif
-
-#include "wx/wxprec.h"
-
-#ifndef WX_PRECOMP
-#include "wx/wx.h"
-#endif
-
-#include <wx/image.h>
-#include <wx/listctrl.h>
-#include <wx/event.h>
-#include "menubtn.h"
-
-/*include gpac AFTER wx in case we override malloc/realloc/free for mem tracking*/
-#include <gpac/terminal.h>
-#include <gpac/term_info.h>
-
-class wxOsmo4App : public wxApp
-{
-public:
- virtual bool OnInit();
-};
-
-DECLARE_APP(wxOsmo4App)
-
-class wxOsmo4Frame;
-class wxPlaylist;
-
-class GPACLogs : public wxLogWindow {
-public:
- GPACLogs(wxFrame *parent) : wxLogWindow(parent, wxT("GPAC Logs"), FALSE, FALSE) {
- m_pMain = (wxOsmo4Frame *) parent;
- }
- virtual bool OnFrameClose(wxFrame *frame);
-
-private:
- wxOsmo4Frame *m_pMain;
-};
-
-#define MAX_VIEWPOINTS 50
-
-// Menu commands
-enum
-{
- GWX_FILE_OPEN = wxID_HIGHEST,
- GWX_FILE_OPEN_URL,
- FILE_RELOAD,
- FILE_RELOAD_CONFIG,
- FILE_PLAY,
- FILE_STEP,
- FILE_STOP,
- FILE_PREV,
- FILE_NEXT,
- FILE_PROPERTIES,
- FILE_COPY,
- FILE_PASTE,
- TERM_RELOAD,
- FILE_QUIT,
- VIEW_FULLSCREEN,
- VIEW_ORIGINAL,
- VIEW_AR_KEEP,
- VIEW_AR_FILL,
- VIEW_AR_43,
- VIEW_AR_169,
- VIEW_OPTIONS,
- VIEW_LOGS,
- VIEW_RTI,
- VIEW_PLAYLIST,
- SWITCH_RENDER,
- APP_SHORTCUTS,
- APP_NAV_KEYS,
- APP_ABOUT,
- ID_ADDRESS,
- ID_URL_GO,
- ID_ABOUT_CLOSE,
- ID_CLEAR_NAV,
- ID_STREAM_MENU,
- ID_CHAPTER_MENU,
- ID_ADD_SUB,
-
- ID_MCACHE_ENABLE,
- ID_MCACHE_STOP,
- ID_MCACHE_ABORT,
-
- ID_CTRL_TIMER,
- ID_SLIDER,
-
- ID_TREE_VIEW,
- ID_OD_TIMER,
- ID_VIEW_SG,
- ID_VIEW_WI,
- ID_VIEW_SEL,
-
-
- ID_HEADLIGHT,
- ID_NAVIGATE_NONE,
- ID_NAVIGATE_WALK,
- ID_NAVIGATE_FLY,
- ID_NAVIGATE_EXAMINE,
- ID_NAVIGATE_SLIDE,
- ID_NAVIGATE_PAN,
- ID_NAVIGATE_ORBIT,
- ID_NAVIGATE_GAME,
- ID_NAVIGATE_RESET,
-
- ID_COLLIDE_NONE,
- ID_COLLIDE_REG,
- ID_COLLIDE_DISP,
- ID_GRAVITY,
-
- ID_PL_OPEN,
- ID_PL_SAVE,
- ID_PL_ADD_FILE,
- ID_PL_ADD_URL,
- ID_PL_ADD_DIR,
- ID_PL_ADD_DIR_REC,
- ID_PL_REM_FILE,
- ID_PL_REM_ALL,
- ID_PL_REM_DEAD,
- ID_PL_UP,
- ID_PL_DOWN,
- ID_PL_RANDOMIZE,
- ID_PL_REVERSE,
- ID_PL_SEL_REV,
- ID_PL_SORT_TITLE,
- ID_PL_SORT_FILE,
- ID_PL_SORT_DUR,
- ID_PL_PLAY,
-
-
- /*reserve IDs for viewpoint menu*/
- ID_VIEWPOINT_FIRST,
- ID_VIEWPOINT_LAST = ID_VIEWPOINT_FIRST + MAX_VIEWPOINTS,
-
- /*reserve IDs for navigation menus*/
- ID_NAV_PREV_0,
- ID_NAV_PREV_9 = ID_NAV_PREV_0 + 10,
- ID_NAV_NEXT_0,
- ID_NAV_NEXT_9 = ID_NAV_NEXT_0 + 10,
- /*reserve IDs for stream selection menus*/
- ID_SELSTREAM_0,
- ID_SELSTREAM_9 = ID_SELSTREAM_0 + 10,
-
- /*reserve IDs for chapter selection menus*/
- ID_SETCHAP_FIRST,
- ID_SETCHAP_LAST = ID_SELSTREAM_0 + 200,
-};
-
-wxString get_pref_browser(GF_Config *cfg);
-
-class wxGPACEvent : public wxEvent
-{
-public:
- wxGPACEvent( wxWindow* win = (wxWindow*) NULL );
- void CopyObject( wxObject& obj ) const;
- virtual wxEvent *Clone() const;
-
- wxString to_url;
- GF_Event gpac_evt;
-
- DECLARE_DYNAMIC_CLASS(wxGPACEvent)
-};
-typedef void (wxEvtHandler::*GPACEventFunction)(wxGPACEvent&);
-DEFINE_EVENT_TYPE(GPAC_EVENT)
-
-#define EVT_GPACEVENT(func) DECLARE_EVENT_TABLE_ENTRY(GPAC_EVENT, -1, -1, (wxObjectEventFunction) (wxEventFunction) (GPACEventFunction) & func, (wxObject*) NULL),
-
-class OpenURLDlg : public wxDialog {
-public:
- OpenURLDlg(wxWindow *parent, GF_Config *cfg);
- wxString m_urlVal;
-private:
- wxButton *m_go;
- wxComboBox *m_url;
- GF_Config *m_cfg;
- void OnGo(wxCommandEvent& event);
- DECLARE_EVENT_TABLE()
-};
-
-class wxMyComboBox : public wxComboBox
-{
-public:
- wxMyComboBox(wxWindow* parent, wxWindowID id, const wxString& value = wxT(""), const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize)
- : wxComboBox(parent, id, value, pos, size, 0, NULL, wxCB_DROPDOWN)
- {}
-
-private:
- DECLARE_EVENT_TABLE()
-
- void OnKeyUp(wxKeyEvent &event);
-};
-
-class wxOsmo4Frame : public wxFrame {
-public:
- wxOsmo4Frame();
- virtual ~wxOsmo4Frame();
-
- char szAppPath[GF_MAX_PATH];
-
- u32 m_duration;
- wxString the_next_url;
- GF_Terminal *m_term;
- GF_User m_user;
- Bool m_connected, m_can_seek, m_console_off, m_loop, m_lookforsubs;
-
- void DoConnect();
-
- void ConnectAcknowledged(Bool bOk);
- void SetStatus(wxString str);
-
- void OnFilePlay(wxCommandEvent &event);
- void OnFileStep(wxCommandEvent &event);
- void OnFileStop(wxCommandEvent &event);
- wxString GetFileFilter();
-
- void BuildViewList();
- void BuildStreamList(Bool reset_only);
- void BuildChapterList(Bool reset_only);
-
- void AddSubtitle(const char *fileName, Bool auto_play);
-
- wxWindow *m_pView;
-
-#ifdef __WXGTK__
- u32 m_last_grab_time, m_last_grab_pos;
- wxWindow *m_pVisual;
-#endif
- wxSlider *m_pProg;
- wxPlaylist *m_pPlayList;
-
- void DoLayout(u32 v_width = 0, u32 v_height = 0);
- s32 m_last_prog;
-
- FILE *m_logs;
- u32 m_log_level, m_log_tools;
- u32 m_LastStatusTime;
-
-protected:
-
-private:
- DECLARE_EVENT_TABLE()
-
- void OnCloseApp(wxCloseEvent &event);
- void OnSize(wxSizeEvent &event);
-
- void OnFileOpen(wxCommandEvent &event);
- void OnFileOpenURL(wxCommandEvent &event);
- void OnFileReload(wxCommandEvent &event);
- void OnFileReloadConfig(wxCommandEvent & event);
- void OnFileProperties(wxCommandEvent &event);
- void OnFileQuit(wxCommandEvent &event);
- void OnFullScreen(wxCommandEvent &event);
- void OnOptions(wxCommandEvent &event);
- void OnViewARKeep(wxCommandEvent &event);
- void OnViewARFill(wxCommandEvent &event);
- void OnViewAR169(wxCommandEvent &event);
- void OnViewAR43(wxCommandEvent &event);
- void OnViewOriginal(wxCommandEvent &event);
- void OnPlaylist(wxCommandEvent &event);
- void OnShortcuts(wxCommandEvent &event);
- void OnNavInfo(wxCommandEvent &event);
- void OnAddSub(wxCommandEvent &event);
- void OnAbout(wxCommandEvent &event);
- Bool LoadTerminal();
- void OnGPACEvent(wxGPACEvent &event);
- void OnTimer(wxTimerEvent& event);
- void OnSlide(wxScrollEvent &event);
- void OnRelease(wxScrollEvent &event);
- void OnLogs(wxCommandEvent & event);
- void OnRTI(wxCommandEvent & event);
- void OnUpdatePlay(wxUpdateUIEvent &event);
- void OnUpdateNeedsConnect(wxUpdateUIEvent &event);
- void OnUpdateFullScreen(wxUpdateUIEvent &event);
- void OnUpdateAR(wxUpdateUIEvent &event);
- void OnViewport(wxCommandEvent & event);
- void OnUpdateViewport(wxUpdateUIEvent & event);
- void OnNavigate(wxCommandEvent & event);
- void OnNavigateReset(wxCommandEvent & event);
- void OnUpdateNavigation(wxUpdateUIEvent & event);
- void OnRenderSwitch(wxCommandEvent &event);
- void OnCollide(wxCommandEvent & event);
- void OnUpdateCollide(wxUpdateUIEvent & event);
- void OnHeadlight(wxCommandEvent & event);
- void OnUpdateHeadlight(wxUpdateUIEvent & event);
- void OnGravity(wxCommandEvent & event);
- void OnUpdateGravity(wxUpdateUIEvent & event);
- void OnURLSelect(wxCommandEvent &event);
- void OnUpdatePlayList(wxUpdateUIEvent & event);
- void OnFilePrevOpen(wxNotifyEvent & event);
- void OnFileNextOpen(wxNotifyEvent & event);
- void OnNavPrev(wxCommandEvent &event);
- void OnUpdateNavPrev(wxUpdateUIEvent & event);
- void OnNavPrevMenu(wxCommandEvent &event);
- void OnNavNext(wxCommandEvent &event);
- void OnUpdateNavNext(wxUpdateUIEvent & event);
- void OnNavNextMenu(wxCommandEvent &event);
- void OnClearNav(wxCommandEvent &event);
- void OnStreamSel(wxCommandEvent &event);
- void OnUpdateStreamSel(wxUpdateUIEvent & event);
- void OnUpdateStreamMenu(wxUpdateUIEvent & event);
- void OnChapterSel(wxCommandEvent &event);
- void OnUpdateChapterSel(wxUpdateUIEvent & event);
- void OnUpdateChapterMenu(wxUpdateUIEvent & event);
-
- void SelectionReady();
- void ReloadURLs();
- void LookForSubtitles();
-
- void OnCacheEnable(wxCommandEvent &event);
- void OnCacheStop(wxCommandEvent &event);
- void OnCacheAbort(wxCommandEvent &event);
- void OnUpdateCacheEnable(wxUpdateUIEvent & event);
- void OnUpdateCacheAbort(wxUpdateUIEvent & event);
-
- void OnFileCopy(wxCommandEvent &event);
- void OnUpdateFileCopy(wxUpdateUIEvent &event);
- void OnFilePaste(wxCommandEvent &event);
- void OnUpdateFilePaste(wxUpdateUIEvent &event);
-
-
- void CheckVideoOut();
-
- wxMenuBar* m_pMenubar;
- wxStatusBar* m_pStatusbar;
- wxTimer *m_pTimer;
- GPACLogs *m_pLogs;
- wxBoxSizer *m_pAddBar;
-
- Bool m_bGrabbed, m_bToReset, m_bFirstStreamListBuild;
- wxBitmap *m_pOpenFile, *m_pPrev, *m_pNext, *m_pPlay, *m_pPause, *m_pStep, *m_pStop, *m_pInfo, *m_pConfig, *m_pSW2D, *m_pSW3D;
- wxMenuButton *m_pPrevBut, *m_pNextBut;
- wxToolBar *m_pToolBar;
- wxMyComboBox *m_Address;
-
- wxMenu *vp_list;
- wxMenu *sel_menu;
- wxMenu *chap_menu;
- void Stop();
-
- s32 nb_viewpoints;
-
- void UpdateRenderSwitch();
- void UpdatePlay();
-
- u32 m_orig_width, m_orig_height;
-
- u32 m_num_chapters;
- Double *m_chapters_start;
- Bool m_bExternalView, m_bViewRTI, m_bStartupFile;
-
- void ShowViewWindow(Bool do_show);
-};
-
-
-#endif //_WXOSMO4_H
-
+++ /dev/null
-//Microsoft Developer Studio generated resource script.
-//
-#include "resource.h"
-
-#define APSTUDIO_READONLY_SYMBOLS
-/////////////////////////////////////////////////////////////////////////////
-//
-// Generated from the TEXTINCLUDE 2 resource.
-//
-#include "afxres.h"
-
-/////////////////////////////////////////////////////////////////////////////
-#undef APSTUDIO_READONLY_SYMBOLS
-
-/////////////////////////////////////////////////////////////////////////////
-// French (France) resources
-
-#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_FRA)
-#ifdef _WIN32
-LANGUAGE LANG_FRENCH, SUBLANG_FRENCH
-#pragma code_page(1252)
-#endif //_WIN32
-
-#ifdef APSTUDIO_INVOKED
-/////////////////////////////////////////////////////////////////////////////
-//
-// TEXTINCLUDE
-//
-
-1 TEXTINCLUDE DISCARDABLE
-BEGIN
- "resource.h\0"
-END
-
-2 TEXTINCLUDE DISCARDABLE
-BEGIN
- "#include ""afxres.h""\r\n"
- "\0"
-END
-
-3 TEXTINCLUDE DISCARDABLE
-BEGIN
- "\r\n"
- "\0"
-END
-
-#endif // APSTUDIO_INVOKED
-
-
-/////////////////////////////////////////////////////////////////////////////
-//
-// Icon
-//
-
-// Icon with lowest ID value placed first to ensure application icon
-// remains consistent on all systems.
-IDI_OSMO_ICON ICON DISCARDABLE "../../doc/osmo4.ico"
-#endif // French (France) resources
-/////////////////////////////////////////////////////////////////////////////
-
-
-
-#ifndef APSTUDIO_INVOKED
-/////////////////////////////////////////////////////////////////////////////
-//
-// Generated from the TEXTINCLUDE 3 resource.
-//
-
-
-/////////////////////////////////////////////////////////////////////////////
-#endif // not APSTUDIO_INVOKED
-
+++ /dev/null
-/*
- V4CommandPanel.cpp
-
- Panel allowing to choose an action for a given frame in the time line
-
-*/
-
-#include "safe_include.h"
-
-#include "V4CommandPanel.h"
-#include "V4StudioFrame.h"
-
-#include "V4Node.h"
-
-
-
-// !! order matters !!, index will become the command id
-// when command has no string, it is not available
-// see v4_scenegraph_vrml.h
-wxString cmdNames[] = { wxT(""), // GF_SG_SCENE_REPLACE
- wxT("Replace Node"), // GF_SG_NODE_REPLACE
- wxT("Replace Field"), // GF_SG_FIELD_REPLACE
- wxT(""), // GF_SG_INDEXED_REPLACE
- wxT(""), // GF_SG_ROUTE_REPLACE
- wxT("Delete Node"), // GF_SG_NODE_DELETE
- wxT(""), // GF_SG_INDEXED_DELETE
- wxT(""), // GF_SG_ROUTE_DELETE
- wxT("Insert Node"), // GF_SG_NODE_INSERT
- wxT("") // GF_SG_INDEXED_INSERT
- // TODO : to complete
- };
-
-
-// Events table
-BEGIN_EVENT_TABLE(V4CommandPanel, wxPanel)
- EVT_PAINT(V4CommandPanel::OnPaint)
- EVT_COMBOBOX(cmbCommandID, V4CommandPanel::OnCommandCombo)
- EVT_COMBOBOX(cmbFieldID, V4CommandPanel::OnFieldCombo)
- EVT_BUTTON(CreateID, V4CommandPanel::OnCreateCommand)
-END_EVENT_TABLE()
-
-
-
-// Constructor
-V4CommandPanel::V4CommandPanel(V4StudioFrame * parent_)
- : wxPanel(parent_, -1),
- // tabs
- tabs(this, -1),
- tabView(&tabs, -1),
- tabAdd(&tabs, -1),
-
- // add Page
- cmbCommands(&tabAdd, cmbCommandID, ""),
- lblCommands(&tabAdd, -1, "Action :"),
- cmbNodes(&tabAdd, -1, ""),
- lblNodes(&tabAdd, -1, "Node :"),
- cmbFields(&tabAdd ,cmbFieldID, ""),
- lblFields(&tabAdd, -1, "Field :"),
- txtField(&tabAdd, -1, ""),
- btnCreate(&tabAdd, CreateID, "Create"),
-
- // view Page
- cmbListCommands(&tabView, -1),
- txtDesc(&tabView, -1),
- btnDelete(&tabView, -1, "Delete")
-{
- parent = parent_;
-
- // disposition
-
- // global
- sizerTabs = new wxBoxSizer(wxHORIZONTAL);
- sizerTabs->Add(&tabs, 1, wxEXPAND);
-
- tabs.AddPage(&tabView, "View");
- tabs.AddPage(&tabAdd, "Add");
-
-
- // Add Page
- sizerAdd = new wxBoxSizer(wxVERTICAL); // up = combobox, middle = differs with the command, bottom = buttons
-
- sizerU = new wxBoxSizer(wxHORIZONTAL); // up
- sizerM = new wxBoxSizer(wxVERTICAL); // middle
- sizerD = new wxBoxSizer(wxHORIZONTAL); // bottom
-
- szSelectNode = new wxBoxSizer(wxHORIZONTAL);
- szSelectField = new wxBoxSizer(wxHORIZONTAL);
- szTxtField = new wxBoxSizer(wxHORIZONTAL);
-
- sizerAdd->Add(sizerU, 1, wxEXPAND);
- sizerAdd->Add(sizerM, 3, wxEXPAND);
- sizerAdd->Add(sizerD, 1, wxEXPAND);
-
- sizerU->Add(&lblCommands, 1, wxEXPAND | wxALL, 5);
- sizerU->Add(&cmbCommands, 3, wxEXPAND | wxALL, 2);
-
- szSelectField->Add(&lblFields, 1, wxEXPAND | wxALL, 5);
- szSelectField->Add(&cmbFields, 2, wxEXPAND | wxALL, 2);
-
- szSelectNode->Add(&lblNodes, 1, wxEXPAND | wxALL, 5);
- szSelectNode->Add(&cmbNodes, 2, wxEXPAND | wxALL, 2);
-
- szTxtField->Add(&txtField, 1, wxEXPAND | wxALL, 5);
-
- sizerD->Add(&btnCreate, 1, wxEXPAND | wxALL, 3);
-
- tabAdd.SetSizer(sizerAdd);
-
-
-
- // View Page
- sizerView = new wxBoxSizer(wxVERTICAL);
- sizerUp = new wxBoxSizer(wxHORIZONTAL);
- sizerDown = new wxBoxSizer(wxHORIZONTAL);
-
- sizerView->Add(sizerUp, 0, wxEXPAND);
- sizerView->Add(sizerDown, 4, wxEXPAND);
-
- sizerUp->Add(&cmbListCommands, 2, wxEXPAND | wxALL, 2);
- sizerUp->Add(&btnDelete, 1, wxEXPAND | wxALL, 2);
-
- sizerDown->Add(&txtDesc, 1, wxEXPAND);
-
- tabView.SetSizer(sizerView);
-
-
-
- // global
- SetSizer(sizerTabs);
-
- //Layout();
-
- ShowFieldSizer(false);
- ShowNodeSizer(false);
- txtField.Show(false);
-}
-
-// Destructor
-V4CommandPanel::~V4CommandPanel() {
- delete szSelectNode;
- delete szSelectField;
- delete szTxtField;
-};
-
-/************************/
-/* Events */
-/************************/
-
-// OnPaint event
-void V4CommandPanel::OnPaint(wxPaintEvent& event) {
- wxPaintDC dc(this);
-
- dc.BeginDrawing();
-
- // draws a seperator line on the left border
- int w,h;
- this->GetSize(&w, &h);
- dc.DrawLine(0, 0, 0, h);
-
- dc.EndDrawing();
-}
-
-
-// OnCommandCombo -- command combo box selection has changed
-void V4CommandPanel::OnCommandCombo(wxCommandEvent &event) {
- // retrieves the command id
- u32 command = (u32) cmbCommands.GetClientData(cmbCommands.GetSelection());
-
- // retrieves the current node
- GF_Node * node = GetCurrentNode();
-
- if (! IsCommandValidForNode(command, node)) {
- cmbCommands.SetSelection(-1);
- command = (u32) -1;
- }
-
- // shows or hides components
- switch (command) {
- case GF_SG_FIELD_REPLACE: {
- ShowNodeSizer(false);
- ShowFieldSizer(true);
- break;
- }
-
- case GF_SG_NODE_REPLACE:
- case GF_SG_NODE_INSERT: {
- ShowFieldSizer(false);
- ShowNodeSizer(true);
- break;
- }
-
- case GF_SG_NODE_DELETE:
- default : {
- ShowFieldSizer(false);
- ShowNodeSizer(false);
- }
- }
-}
-
-
-// OnFieldCombo -- field combo box selection has changed
-void V4CommandPanel::OnFieldCombo(wxCommandEvent &event) {
-
- // if no selection exits
- u32 sel = cmbFields.GetSelection();
- if (sel == wxNOT_FOUND) return;
-
-
- // gets selected node in the timeline
- GF_Node * node = GetCurrentNode();
- if (!node) return;
-
- GF_FieldInfo field;
- gf_node_get_field(node, sel, &field);
-
- // show or hides elements depending on the type of the field we will modify
- if ( (field.fieldType == GF_SG_VRML_SFNODE) || (field.fieldType == GF_SG_VRML_MFNODE) ) {
- sizerM->Detach(szTxtField);
- txtField.Show(false);
- ShowNodeSizer(true);
- } else {
- sizerM->Detach(szTxtField);
- sizerM->Add(szTxtField, 2, wxEXPAND);
- txtField.Show(true);
- }
-
-}
-
-
-// OnCreateCommand -- creates a command with the option from the UI
-void V4CommandPanel::OnCreateCommand(wxCommandEvent &event) {
-
- // verifies that there is a valid command value on cmbCommands
- u32 sel = cmbCommands.GetSelection();
- if (sel == wxNOT_FOUND) return;
-
- // gets data from the UI
- u32 tag = (u32) cmbCommands.GetClientData(sel);
- GF_Node * node = GetCurrentNode();
-
- // Creates the new command - REQUIRES registering the node
- GF_Command * c = gf_sg_command_new(parent->GetV4SceneManager()->GetSceneGraph(), tag);
- gf_node_register(node, NULL);
- c->node = node; // !! the node have to be registered if command is validated
-
- bool succeed = false;;
-
- // performs various initialization depending on the command tag
- switch (tag) {
- case GF_SG_NODE_REPLACE: {
- // TODO : not implemented yet because il would even replace the nodes in the dictionnary
- break;
- }
-
- case GF_SG_FIELD_REPLACE: {
- // verifies that a valid field is selected
- u32 selF = cmbFields.GetSelection();
- if (selF == wxNOT_FOUND) break;
-
- // gets the field
- GF_FieldInfo field;
- gf_node_get_field(node, (u32)cmbFields.GetClientData(selF), &field);
-
- GF_CommandField * cmdField = gf_sg_command_field_new(c); // if failure, will be freed with freeing the command
- cmdField->fieldIndex = field.fieldIndex;
- cmdField->fieldType = field.fieldType;
-
- // fills the GF_CommandField structures with data depending on the field type
- switch (field.fieldType) {
- case GF_SG_VRML_SFNODE: {
- // get the node we will use as a replacement
- u32 selN = cmbNodes.GetSelection();
- if (selN == wxNOT_FOUND) break;
-
- cmdField->new_node = (GF_Node *) cmbNodes.GetClientData(selN);
- // TODO : why is the 2nd line necessary ?
- cmdField->field_ptr = &cmdField->new_node;
-
- succeed = true;
- break;
- }
-
- case GF_SG_VRML_MFNODE: {
- break;
- }
-
- // field is not a node field
- default: {
-
- wxString s = txtField.GetValue();
- if (s.IsEmpty()) break;
-
- GF_FieldInfo dummy;
- dummy.far_ptr = gf_sg_vrml_field_pointer_new(field.fieldType);
- dummy.fieldType = field.fieldType;
- parent->GetFieldView()->SetFieldValue(dummy, &s, 0); // TODO : check the zero
-
- cmdField->field_ptr = dummy.far_ptr;
-
- succeed = true;
-
- break;
- }
-
- }
-
- break;
- }
-
- case GF_SG_NODE_INSERT: {
- break;
- }
-
- case GF_SG_NODE_DELETE: {
- break;
- }
- }
-
- if (!succeed) {
- gf_sg_command_del(c);
- return;
- }
-
-
- V4SceneManager * sm = parent->GetV4SceneManager();
-
- // The command is created, now searching for an AU to put it in
- GF_StreamContext * ctx = sm->GetBifsStream();
- u32 count = gf_list_count (ctx->AUs);
- GF_AUContext * au = NULL;
-
- for (u32 i = 0; i < count; i++) {
- au = (GF_AUContext *) gf_list_get(ctx->AUs, i);
- // V4Studio only uses timing
- // TODO : FPS is defined in V4SceneGraph.h, should change and become a property somewhere
- // TODO : units is a constant
- if ( au->timing == sm->GetUnits() / sm->GetFrameRate() * frame ) break;
- au = NULL;
- }
-
- // creates new AU at the right time if none found
- if (!au) au = gf_sm_stream_au_new(ctx, sm->GetUnits() / sm->GetFrameRate() * frame, 0, false);
-
- // adds command to AU and to the cell
- gf_list_add(au->commands, (void *) c);
- parent->GetTimeLine()->AddCommand(c);
-
- //gf_sg_command_apply(parent->GetV4Scene()->GetSceneGraph(), c, 0);
-
-
-/*
- // checks whether there is already a command for this object
- GF_List * chain = parent->timeLine->GetCommands();
-
- // if we can fuse the two commands together, we do it
- if (gf_list_count(chain) > 0) {
- GF_Command * old;
- old = (GF_Command *) gf_list_get(chain, gf_list_count(chain) - 1);
- if ( (old->tag =
- }
-*/
-
-
-}
-
-
-/************************/
-/* Refresh */
-/************************/
-
-// refresh -- refresh the node and the command combo boxes
-void V4CommandPanel::Refresh(u32 frame_) {
-
- frame = frame_;
-
- // update the GUI
- // cmbCommands updates in turns cmbNodes and/or cmbFields
- RefreshCommands();
-
- // update the list of the existing command for the cell currently selected
- RefreshListCommands();
-}
-
-
-// RefreshListCommands --
-void V4CommandPanel::RefreshListCommands() {
- // retrieves pointer to the node
- GF_Node * node = GetCurrentNode();
- if (!node) return;
-
- cmbListCommands.Clear();
-
- GF_Command * c;
- int i=0;
-
- while ( c = parent->GetTimeLine()->GetCommand(i) ) {
- cmbListCommands.Append(wxString(cmdNames[c->tag]), (void *) i);
- i++;
- }
-}
-
-
-// RefreshCommands -- lists the available commands for the selected node
-void V4CommandPanel::RefreshCommands() {
-
- // retrieves pointer to the node
- GF_Node * node = GetCurrentNode();
- if (!node) return;
-
- u32 oldSel = cmbCommands.GetSelection();
-
- // deletes all items from the combo box
- cmbCommands.Clear();
-
- // Prints the different possible commands, associates them with their id
- for (int i=0; i<sizeof(cmdNames)/sizeof(wxString); i++) {
- if ( cmdNames[i].CompareTo(wxT("")) )
- if (IsCommandValidForNode(i, node)) cmbCommands.Append(cmdNames[i], (void *)i);
- }
-
- // updates other controls by signaling a new selection on the command combo box
- cmbCommands.SetSelection(oldSel);
- OnCommandCombo(wxCommandEvent());
-}
-
-
-// RefreshNodes -- lists the available nodes for the given action
-void V4CommandPanel::RefreshNodes() {
-
- // retrieves pointer to the node
- GF_Node * node = GetCurrentNode();
- if (!node) return;
-
- // refresh the node combo box with the nodePool
- cmbNodes.Clear();
-
-
- // Adds nodes selectable for this frame and action (selectable nodes have a NodeID != 0)
- // associates in the comboBox each element with its pointer
-
- u32 command = (u32) cmbCommands.GetClientData(cmbCommands.GetSelection());
-
-
- // according to command type selets a node pool
- switch (command) {
-
- case GF_SG_NODE_REPLACE: {
- // we replace this node, so we need the node from the pool for its type
- V4NodePool &pool = parent->GetV4SceneManager()->pools.pool(gf_node_get_tag(node));
-
- // fills the combo box
- PopulateNodes(pool, node);
-
- break;
- }
-
- case GF_SG_FIELD_REPLACE: {
- // checks if the field combo box has a valid selection
- u32 index = cmbFields.GetSelection();
- if ( index == wxNOT_FOUND ) break;
-
- // get the field selected
- GF_FieldInfo field;
- gf_node_get_field(node, index, &field);
-
- // if field is not a node field then exits
- if ( (field.fieldType != GF_SG_VRML_SFNODE) && (field.fieldType != GF_SG_VRML_MFNODE) ) break;
-
- // get the pool corresponding to that field
- V4NodePool &pool = parent->GetV4SceneManager()->pools.poolFromFieldName(field.name);
-
- // fills the combo box
- PopulateNodes(pool, node);
-
- break;
- }
-
- case GF_SG_NODE_INSERT: {
- // we add a child, that is to say we can add any generic node, we use "shape" to find that pool
- V4NodePool &pool = parent->GetV4SceneManager()->pools.pool(TAG_MPEG4_Shape);
-
- // fills the combo box
- PopulateNodes(pool, node);
-
- break;
- }
-
- default: {
- return;
- }
- }
-
-}
-
-
-// RefreshFields -- lists the fields this nodes has
-void V4CommandPanel::RefreshFields() {
-
- // retrieves pointer to the node
- GF_Node * node = GetCurrentNode();
- if (!node) return;
-
- // clears the combo box
- cmbFields.Clear();
-
- int count = gf_node_get_field_count(node);
- GF_FieldInfo field;
-
- for (u32 i = 0; i < count; i++) {
- gf_node_get_field(node, i, &field);
- cmbFields.Append(field.name, (void *) i);
- }
-
- // TODO : are there some nodes with no fields ?
- cmbFields.SetSelection(0);
-
- OnFieldCombo(wxCommandEvent());
-
-}
-
-
-// ShowNodeSizer -- shows or hides controls in the szSelectNode sizer
-void V4CommandPanel::ShowNodeSizer(bool show) {
- cmbNodes.Show(show);
- lblNodes.Show(show);
-
- // always detaches to avoid accumulation of objects
- sizerM->Detach(szSelectNode);
-
- if (show) {
- sizerM->Add(szSelectNode, 1, wxEXPAND);
- RefreshNodes();
- }
-
- tabAdd.Layout();
-}
-
-
-
-// ShowFieldSizer -- shows or hides controls in the szSelectField sizer
-void V4CommandPanel::ShowFieldSizer(bool show) {
- cmbFields.Show(show);
- lblFields.Show(show);
- txtField.Show(false); // always hide, RefreshField may bring it back
-
- // always detaches to avoid accumulation of objects
- sizerM->Detach(szSelectField);
- sizerM->Detach(szTxtField);
-
- if (show) {
- // here order matters, RefreshFields may add szSelectNode, so we have to had ourselves before that
- sizerM->Add(szSelectField, 1, wxEXPAND);
- RefreshFields();
- }
-
- tabAdd.Layout();
-}
-
-
-/************************/
-/* Utils */
-/************************/
-
-// IsCommandValidForNode -- tells if we can apply this command to that node
-bool V4CommandPanel::IsCommandValidForNode(u32 command, GF_Node * node) {
- switch (command) {
- case GF_SG_FIELD_REPLACE:
- case GF_SG_NODE_DELETE:
- case GF_SG_NODE_REPLACE: {
- return true;
- break;
- }
-
- case GF_SG_NODE_INSERT: {
- // to insert a child, node must have a GF_SG_VRML_MFNODE field, other children are not "inserted"
- return parent->GetV4SceneManager()->pools.NodeHasField(node, GF_SG_VRML_MFNODE);
- break;
- }
-
- }
-
- return false;
-}
-
-
-// GetCurrentNode -- returns the node currently selected in the timeline
-GF_Node * V4CommandPanel::GetCurrentNode() {
- u32 id = parent->GetTimeLine()->GetSelectedID();
- if (!id) return NULL;
-
- return gf_sg_find_node(parent->GetV4SceneManager()->GetSceneGraph(), id);
-}
-
-
-
-// PopulateNodes -- fills the cmdNodes with nodes from pool, do not add the specified node if found
-void V4CommandPanel::PopulateNodes(V4NodePool& pool, GF_Node * node) {
- for (u32 i = 0; i != pool.GetNodesCount(); i++)
- if (pool.at(i).GetNode() != node)
- cmbNodes.Append(pool.at(i).GetName(), (void *) pool.at(i).GetNode());
-}
\ No newline at end of file
+++ /dev/null
-/*
- V4CommandPanel.h
-
- Header file for CommandPanel, the control alloing to create commands from the timeline
-*/
-
-#ifndef _V4CommandPanel_h_
-#define _V4CommandPanel_h_
-
-#include "safe_include.h"
-#include <wx/wx.h>
-#include <wx/notebook.h>
-
-// list of all commands
-#include <gpac/scenegraph_vrml.h>
-
-
-#define cmbCommandID wxID_HIGHEST+1
-#define cmbFieldID wxID_HIGHEST+2
-#define CreateID wxID_HIGHEST+3
-
-
-class V4StudioFrame;
-class V4NodePool;
-
-
-class V4CommandPanel : public wxPanel {
- public:
- // Constructor Destructor
- V4CommandPanel(V4StudioFrame * parent);
- ~V4CommandPanel();
-
- // Update
- void Refresh(u32 frame);
-
- private:
-
- u32 frame;
-
- // controls
-
- wxNotebook tabs;
- wxPanel tabView;
- wxPanel tabAdd;
-
- // add page
- wxComboBox cmbCommands;
- wxStaticText lblCommands;
-
- wxComboBox cmbNodes;
- wxStaticText lblNodes;
-
- wxComboBox cmbFields;
- wxStaticText lblFields;
-
- wxButton btnCreate;
-
- wxTextCtrl txtField;
-
-
- // view page
- wxComboBox cmbListCommands;
- wxTextCtrl txtDesc;
- wxButton btnDelete;
-
- //sizers
- // global
- wxBoxSizer * sizerTabs;
- // Add page
- wxBoxSizer * sizerAdd, * sizerU, * sizerM, * sizerD, * szSelectNode, * szSelectField, * szTxtField;
- // View page
- wxBoxSizer * sizerView, * sizerUp, * sizerDown;
-
-
- // UI -- show or hides part of the control
- void ShowNodeSizer(bool show);
- void ShowFieldSizer(bool show);
-
- // Refreshing of various comboboxes
- void RefreshCommands();
- void RefreshNodes();
- void RefreshFields();
- void RefreshListCommands();
-
- // fills the cmdNodes with nodes from pool, do not add the specified node if found
- void PopulateNodes(V4NodePool& pool, GF_Node * node);
-
- // events
- DECLARE_EVENT_TABLE()
- void OnPaint(wxPaintEvent& event);
- void OnCommandCombo(wxCommandEvent &event);
- void OnFieldCombo(wxCommandEvent &event);
- void OnCreateCommand(wxCommandEvent &event);
-
- bool IsCommandValidForNode(u32 command, GF_Node * node); // tells if we can apply this command to that node
- GF_Node * GetCurrentNode(); // returns the node currently selected in the timeline
-
- // All the component of the V4Studio Main Frame have a pointer to that Main Frame, called parent.
- V4StudioFrame * parent;
-
-};
-
-#endif
\ No newline at end of file
+++ /dev/null
-#include "safe_include.h"
-
-// For compilers that supports precompilation , includes "wx/wx.h"
-#include "wx/wxprec.h"
-
-#ifndef WX_PRECOMP
- #include "wx/wx.h"
-#endif
-
-#include <wx/colordlg.h>
-#include <wx/fontdlg.h>
-
-#include "V4FieldList.h"
-
-#include "V4StudioFrame.h"
-
-BEGIN_EVENT_TABLE(V4FieldList, wxGrid)
- EVT_GRID_CELL_CHANGE(V4FieldList::OnCellChanged)
- EVT_GRID_CELL_LEFT_CLICK(V4FieldList::OnCellLeftClick)
- EVT_GRID_CELL_RIGHT_CLICK(V4FieldList::OnCellRightClick)
- EVT_GRID_CELL_LEFT_DCLICK(V4FieldList::OnCellLeftDClick)
-END_EVENT_TABLE()
-
-class Position {
-public :
- Position(u32 fi, s32 fp) : fieldIndex(fi), fieldPosition(fp) {}
- u32 fieldIndex;
- s32 fieldPosition;
-};
-
-V4FieldList::V4FieldList(wxWindow *parent_, wxSize size) : wxGrid(parent_, -1, wxDefaultPosition, size) {
- positions = gf_list_new();
- CreateGrid(0,0);
- SetRowLabelSize(0);
- SetColLabelSize(20);
- SetColLabelValue(0, wxString(" "));
- SetColLabelValue(1, wxString("Field Name"));
- SetColLabelValue(2, wxString("Field Value"));
- InsertCols(0,3);
- AutoSizeColumns(true);
- EnableGridLines(true);
-
- parent = (V4StudioFrame *) parent_;
-}
-
-V4FieldList::~V4FieldList()
-{
- s32 i;
- for (i=gf_list_count(positions)-1; i>=0; i--) {
- Position *p = (Position *)gf_list_get(positions, i);
- delete p;
- p = NULL;
- gf_list_rem(positions, i);
- }
- gf_list_del(positions);
-}
-
-void V4FieldList::Create()
-{
- GF_Node *node = m_pNode;
-
- if (!node) return;
-
- DeleteCols(0,3);
- u32 nbRows = GetNumberRows();
- if (nbRows) DeleteRows(0,nbRows);
- InsertCols(0,3);
-
- s32 i;
- for (i=gf_list_count(positions)-1; i>=0; i--) {
- Position *p = (Position *)gf_list_get(positions, i);
- delete p;
- p = NULL;
- gf_list_rem(positions, i);
- }
-
- u32 pos = 0; // counts rows added
-
- // adds a row to modify DefName
- InsertRows(pos, 1);
- SetCellValue(pos, 1, wxString("Name"));
- const char * defName = gf_node_get_name(node);
- if (defName) SetCellValue(pos, 2, wxString(defName));
- gf_list_add(positions, new Position(-1, -1));
- // enables modifying the DefName
- for (i=0; i<2; i++) SetReadOnly(pos, i, TRUE);
- SetReadOnly(pos, 2, FALSE);
- pos++;
-
- // adds all fields
- GF_FieldInfo field;
- u32 count = gf_node_get_field_count(node);
- u32 j;
-
- for (j=0; j<count; j++) {
- gf_node_get_field(node, j, &field);
- switch (field.eventType) {
- case GF_SG_EVENT_FIELD:
- case GF_SG_EVENT_EXPOSED_FIELD:
- InsertOneFieldRow(pos, field);
- pos++;
- break;
- default:
- break;
- }
- }
- AutoSizeColumns(true);
-}
-
-void V4FieldList::InsertOneFieldRow(u32 pos, GF_FieldInfo field)
-{
- InsertRows(pos, 1);
- gf_list_add(positions, new Position(field.fieldIndex, -1));
- SetReadOnly(pos, 0, TRUE);
- SetReadOnly(pos, 1, TRUE);
- SetReadOnly(pos, 2, FALSE);
- SetCellFieldValue(field, pos);
-}
-
-void V4FieldList::SetFieldValue(GF_FieldInfo f, wxString *value, int pos)
-{
- void *ptr = NULL;
- s32 type = -1;
- if (gf_sg_vrml_is_sf_field(f.fieldType)) {
- type = f.fieldType;
- ptr = f.far_ptr;
- } else {
- if (pos < 0) return;
- gf_sg_vrml_mf_get_item(f.far_ptr, f.fieldType, &ptr, pos);
- type = gf_sg_vrml_get_sf_type(f.fieldType);
- }
- switch (type) {
- case GF_SG_VRML_SFCOLOR:
- sscanf(value->c_str(), "%f %f %f", &(((SFColor *)ptr)->red), &(((SFColor *)ptr)->green), &(((SFColor *)ptr)->blue));
- break;
- case GF_SG_VRML_SFVEC2F:
- sscanf(value->c_str(), "%f %f", &(((SFVec2f *)ptr)->x), &(((SFVec2f *)ptr)->y));
- break;
- case GF_SG_VRML_SFFLOAT:
- sscanf(value->c_str(), "%f", (SFFloat *)ptr);
- break;
- case GF_SG_VRML_SFINT32:
- sscanf(value->c_str(), "%d", (SFInt32 *)ptr);
- break;
- case GF_SG_VRML_SFBOOL:
- if (!stricmp(value->c_str(), "true")) *((SFBool *)ptr) = 1;
- else *((SFBool *)ptr) = 0;
- break;
- case GF_SG_VRML_SFSTRING:
- if (((SFString *)ptr)->buffer) gf_free(((SFString *)ptr)->buffer);
- ((SFString *)ptr)->buffer = gf_strdup(value->c_str());
- break;
- default:
- break;
- }
-}
-
-void V4FieldList::GetFieldValue(GF_FieldInfo f, wxString *s, int pos)
-{
- void *ptr = NULL;
- s32 type = -1;
- if (gf_sg_vrml_is_sf_field(f.fieldType)) {
- type = f.fieldType;
- ptr = f.far_ptr;
- } else {
- if (pos < 0) return;
- gf_sg_vrml_mf_get_item(f.far_ptr, f.fieldType, &ptr, pos);
- type = gf_sg_vrml_get_sf_type(f.fieldType);
- }
- switch (type) {
- case GF_SG_VRML_SFBOOL:
- if (*(SFBool *)ptr == 0) s->Printf("false");
- else s->Printf("true");
- break;
- case GF_SG_VRML_SFINT32:
- s->Printf("%d", *(SFInt32 *)ptr);
- break;
- case GF_SG_VRML_SFCOLOR:
- s->Printf("%.2f %.2f %.2f", ((SFColor *)ptr)->red, ((SFColor *)ptr)->green, ((SFColor *)ptr)->blue);
- break;
- case GF_SG_VRML_SFVEC2F:
- s->Printf("%.2f %.2f", ((SFVec2f *)ptr)->x, ((SFVec2f *)ptr)->y);
- break;
- case GF_SG_VRML_SFFLOAT:
- s->Printf("%.2f", *(SFFloat *)ptr);
- break;
- case GF_SG_VRML_SFSTRING:
- s->Printf("%s", ((SFString *)ptr)->buffer);
- break;
- case GF_SG_VRML_SFSCRIPT:
- s->Printf("%s", ((SFScript *)ptr)->script_text);
- break;
- default:
- break;
- }
- gf_node_dirty_set(m_pNode, 0, 1);
-}
-
-// OnCellChanged -- user has validated the changes made to a field, updates the node with the new value
-void V4FieldList::OnCellChanged(wxGridEvent &evt)
-{
- u32 row;
- GF_FieldInfo field;
- wxString value;
-
- if (!m_pNode || evt.GetCol() == 0) {
- evt.Skip();
- return;
- }
-
- row = evt.GetRow();
- value = GetCellValue(row, 2);
- Position *pSelected = (Position *)gf_list_get(positions, row);
- if (!pSelected) {
- evt.Skip();
- return;
- }
-
- // defName requires special treatment
- if (pSelected->fieldIndex == (u32) -1) {
- u32 id = gf_node_get_id(m_pNode);
- if (!id) id = gf_sg_get_next_available_node_id(parent->GetV4SceneManager()->GetSceneGraph());
- gf_node_set_id(m_pNode, id, value.c_str());
- parent->GetV4SceneManager()->pools.Add(m_pNode);
- } else {
- // modifies any kind of field
- gf_node_get_field(m_pNode, pSelected->fieldIndex, &field);
- if (gf_sg_vrml_is_sf_field(field.fieldType)) {
- SetFieldValue(field, &value, -1);
- } else {
- if (pSelected->fieldPosition >= 0) {
- SetFieldValue(field, &value, pSelected->fieldPosition);
- } else {
- GenMFField *mf = (GenMFField *)field.far_ptr;
- void *ptr;
- gf_sg_vrml_mf_insert(mf, field.fieldType, &ptr, mf->count);
- SetFieldValue(field, &value, mf->count-1);
- SetCellValue(row, 2, "");
- wxString sign = GetCellValue(row, 0);
- switch (sign.GetChar(0)) {
- case '-':
- {
- u32 insertPosition = row+mf->count+1;
- InsertRows(insertPosition-1, 1);
- gf_list_insert(positions, new Position(pSelected->fieldIndex, mf->count-1), insertPosition);
- wxString tmp;
- tmp << '['; tmp << (mf->count-1); tmp << ']';
- SetCellValue(insertPosition-1, 1, tmp);
- wxString buf;
- GetFieldValue(field, &buf, mf->count-1);
- SetCellValue(insertPosition-1, 2, buf);
- }
- break;
- case '+':
- break;
- case ' ':
- SetCellValue(row, 0, "+");
- break;
- }
- }
- }
- }
- gf_node_dirty_set(m_pNode, 0, 1);
- V4StudioFrame *parent = (V4StudioFrame *)this->GetParent();
- parent->Update();
-}
-
-void V4FieldList::SetLog(wxString s)
-{
- V4StudioFrame *parent = (V4StudioFrame *)this->GetParent();
- parent->GetStatusBar()->SetStatusText(s);
-}
-
-void V4FieldList::SetCellFieldValue(GF_FieldInfo field, u32 pos)
-{
- wxString buf;
- if (gf_sg_vrml_is_sf_field(field.fieldType)) {
- SetCellValue(pos,1,wxString(field.name));
- GetFieldValue(field, &buf, -1);
- SetCellValue(pos,2,buf);
- } else {
- GenMFField *mf = (GenMFField *)field.far_ptr;
- if (mf->count > 0 ) {
- SetCellValue(pos,0,"+");
- } else {
- SetCellValue(pos,0," ");
- }
- SetCellValue(pos,1,field.name);
- }
-}
-
-// OnCellLeftClick -- draws columns for multivalued fields
-void V4FieldList::OnCellLeftClick(wxGridEvent &evt)
-{
- u32 col = evt.GetCol();
- u32 row = evt.GetRow();
- GF_FieldInfo field;
- GF_Node *node = m_pNode;
-
- if (col != 0) {
- evt.Skip();
- return;
- }
-
- Position *pSelected = (Position *)gf_list_get(positions, row);
- if (!pSelected) {
- evt.Skip();
- return;
- }
-
- gf_node_get_field(node, pSelected->fieldIndex, &field);
- if (gf_sg_vrml_is_sf_field(field.fieldType) || field.fieldType == GF_SG_VRML_MFNODE) {
- evt.Skip();
- return;
- }
-
- wxString value = GetCellValue(row, col);
- char c = value.GetChar(0);
- GenMFField *mf = (GenMFField *)field.far_ptr;
- if (c == ' ') {
- evt.Skip();
- return;
- } else if (c == '+') {
- value.SetChar(0, '-');
- SetCellValue(row,0,value);
- InsertRows(row+1, mf->count);
- for (u32 j = 0; j<mf->count; j++) {
- Position *p = new Position(pSelected->fieldIndex, j);
- gf_list_insert(positions, p, row+1+j);
- wxString tmp;
- tmp << '['; tmp << j; tmp << ']';
- SetCellValue(row+1+j, 1, tmp);
- wxString buf;
- GetFieldValue(field, &buf, j);
- SetCellValue(row+1+j, 2, buf);
- }
- } else if (c == '-') {
- value.SetChar(0, '+');
- SetCellValue(row,0,value);
- DeleteRows(row+1, mf->count);
- for (s32 j = mf->count-1; j>=0; j--) {
- Position *p = (Position *)gf_list_get(positions,row+1+j);
- delete p;
- p = NULL;
- gf_list_rem(positions, row+1+j);
- }
- }
- evt.Skip();
-}
-
-void V4FieldList::OnCellRightClick(wxGridEvent &evt)
-{
- int row = evt.GetRow();
- GF_FieldInfo field;
- GF_Node *node = m_pNode;
-
- Position *pSelected = (Position *)gf_list_get(positions,row);
- if (!pSelected) {
- evt.Skip();
- return;
- }
-
- gf_node_get_field(node, pSelected->fieldIndex, &field);
- if (gf_sg_vrml_is_sf_field(field.fieldType)) {
- evt.Skip();
- return;
- }
-
- GenMFField *mf = (GenMFField *)field.far_ptr;
- if (pSelected->fieldPosition == -1) {
- evt.Skip();
- return;
- }
-
- InsertRows(row, 1);
- gf_list_insert(positions, new Position(pSelected->fieldIndex, pSelected->fieldPosition), row);
- void *ptr;
- gf_sg_vrml_mf_insert(mf, field.fieldType, &ptr, pSelected->fieldPosition);
- SetCellValue(row, 2, "");
- for (u32 i=pSelected->fieldPosition; i<mf->count; i++) {
- wxString tmp;
- tmp << '['; tmp << i; tmp << ']';
- SetCellValue(row+i, 1, tmp);
- }
-}
-
-// OnCellLeftDClick -- Edit a given field
-void V4FieldList::OnCellLeftDClick(wxGridEvent &evt)
-{
- int row = evt.GetRow();
- GF_FieldInfo field;
- GF_Node *node = m_pNode;
-
- Position *pSelected = (Position *)gf_list_get(positions,row);
- if (!pSelected) {
- evt.Skip();
- return;
- }
-
- // editing the DEF name is NOT modifying a field
- // we just need to modify the string itself
- if (pSelected->fieldIndex == (u32) -1) {
- evt.Skip();
- return;
- }
-
- gf_node_get_field(node, pSelected->fieldIndex, &field);
- u32 type;
- void *ptr;
- if (gf_sg_vrml_is_sf_field(field.fieldType)) {
- type = field.fieldType;
- ptr = field.far_ptr;
- } else {
- if (pSelected->fieldPosition < 0) {
- evt.Skip();
- return;
- }
- gf_sg_vrml_mf_get_item(field.far_ptr, field.fieldType, &ptr, pSelected->fieldPosition);
- type = gf_sg_vrml_get_sf_type(field.fieldType);
- }
-
- if (type== GF_SG_VRML_SFCOLOR) {
- wxColourDialog cd(this);
- if (cd.ShowModal() == wxID_OK)
- {
- wxColourData retData = cd.GetColourData();
- wxColour col = retData.GetColour();
- ((SFColor *)ptr)->red = col.Red()/255.0f;
- ((SFColor *)ptr)->green = col.Green()/255.0f;
- ((SFColor *)ptr)->blue = col.Blue()/255.0f;
- } else {
- return;
- }
- } else if (!stricmp(field.name,"family")) {
- wxFontDialog fd(this);
- if (fd.ShowModal() == wxID_OK) {
- wxFontData retData = fd.GetFontData();
- wxFont font = retData.GetChosenFont();
- wxString name = font.GetFaceName();
- if (((SFString *)ptr)->buffer) gf_free(((SFString *)ptr)->buffer);
- ((SFString *)ptr)->buffer = gf_strdup(name.c_str());
- } else {
- return;
- }
-
- } else {
- evt.Skip();
- return;
- }
- V4StudioFrame *parent = (V4StudioFrame *)this->GetParent();
- parent->Update();
-}
+++ /dev/null
-#ifndef _V4_FIELD_LIST_H
-#define _V4_FIELD_LIST_H
-
-#include "safe_include.h"
-#include <gpac/scenegraph.h>
-
-#include <wx/grid.h>
-
-
-class V4StudioFrame;
-
-
-class V4FieldList: public wxGrid {
-
-public:
- V4FieldList(wxWindow *parent, wxSize size);
- ~V4FieldList();
-
- void SetNode(GF_Node *node) { m_pNode = node; }
-
- void Create();
- void GetFieldValue(GF_FieldInfo f, wxString *s, int pos);
- void SetFieldValue(GF_FieldInfo f, wxString *s, int pos);
-
- void OnCellChanged(wxGridEvent &evt);
- void OnCellLeftClick(wxGridEvent &evt);
- void OnCellRightClick(wxGridEvent &evt);
- void OnCellLeftDClick(wxGridEvent &evt);
-protected:
- DECLARE_EVENT_TABLE()
-
-private:
- void SetLog(wxString s);
-
- void InsertOneFieldRow(u32 position, GF_FieldInfo field);
-
- void SetCellFieldValue(GF_FieldInfo field, u32 pos);
-
- GF_Node * m_pNode;
- GF_List *positions;
-
- // All the component of the V4Studio Main Frame have a pointer to that Main Frame, called parent.
- V4StudioFrame * parent;
-
-};
-
-#endif
+++ /dev/null
-/*
- V4Node.cpp
-
- Implements V4Node class
-*/
-
-#include "V4Node.h"
-#include <crtdbg.h>
-
-
-// Constructor
-V4Node::V4Node(const u32 _NodeID, GF_Node * _node) : NodeID(_NodeID), node(_node) {
- _ASSERT(_node); // no NULL node
-}
-
-
-// GetID --
-u32 V4Node::GetID() const {
- return NodeID;
-}
-
-
-// GetNode --
-GF_Node * V4Node::GetNode() const {
- return node;
-}
-
-
-// IsAliveAt -- check all aparitions
-bool V4Node::IsAliveAt(const u32 frame) {
- std::list<segment>::iterator i;
-
- for (i = lifeSpan.begin(); i != lifeSpan.end(); i++)
- if ( ((*i).from >= frame) && ((*i).to <= frame) ) return true;
-
- return false;
-}
-
-
-// Appear
-void V4Node::Appear(const u32 startFrame, const u32 stopFrame) {
- // TODO :
- return;
-}
-
-
-// Disappear
-void V4Node::Disappear(const u32 startFrame, const u32 stopFrame) {
- // TODO :
- return;
-}
-
-
-// GetName --
-wxString V4Node::GetName() {
- return wxString(gf_node_get_name(node));
-}
\ No newline at end of file
+++ /dev/null
-/*
- V4Node.h
-
- Represents a node with additionnal attributes for V4Studio, such as lifespan
-*/
-
-#ifndef _V4Node_
-#define _V4Node_
-
-#include "safe_include.h"
-#include <gpac/scenegraph.h> // GF_Node structure
-
-#include <wx/wx.h>
-
-#include <list>
-
-
-struct segment {
- u32 from, to;
-};
-
-
-class V4Node {
- public:
- // constructor destructor
- V4Node(const u32 NodeID, GF_Node * node=NULL); // node may be modified, don't use const GF_Node *
-
- // accesses to members
- u32 GetID() const;
- GF_Node * GetNode() const;
-
-
- // computes whether the node is alive at the given frame
- bool IsAliveAt(const u32 frame);
-
- // Add an apparition, inclusive
- void Appear(const u32 startFrame, const u32 stopFrame);
-
- // Remove frames from lifeSpan, inclusive
- void Disappear(const u32 startFrame, const u32 stopFrame);
-
-
- // (to save workspace) tells whether the node should appear on the timeline
- bool isOnTimeLine;
-
- // retrieves the node _DEF_ name (node has a Node ID)
- wxString GetName();
-
-
-
- private:
- // various accesses to the node
- u32 NodeID;
- GF_Node * node;
-
- // timeLine
- std::list<segment> lifeSpan; // each element of the list is one use of this node, first value is start frame, second is end frame, inclusive
-
-};
-
-#endif
\ No newline at end of file
+++ /dev/null
-/*
- V4NodePool.cpp
-
-*/
-#include "safe_include.h"
-#include <gpac/scenegraph_vrml.h>
-
-#include "V4NodePool.h"
-
-
-// FindNode -- search for a node with the specified NodeID or pointer
-u32 V4NodePool::FindNode(const u32 NodeID, const GF_Node * node) {
-
- if ( (NodeID == 0) && (node == NULL) ) return (u32) -1;
-
- for (int i = 0; i < Nodes.size(); i++)
- if ( (NodeID == Nodes.at(i).GetID()) || (node == Nodes.at(i).GetNode()) ) return i;
-
- return (u32) -1;
-}
-
-
-// AddNode --
-V4Node& V4NodePool::AddNode(GF_Node * _node) {
- // checks that the node is not already in the pool
- u32 id = gf_node_get_id(_node);
- u32 i = FindNode(id);
- if (i != (u32) -1) return Nodes.at(i);
-
- // add a new entry into the pool
- V4Node node(id, _node);
- Nodes.push_back(node);
- count++;
- return Nodes.back();
-}
-
-
-// DeleteNode -- Deletes a node from the pool
-void V4NodePool::DeleteNode(const u32 _NodeID, const GF_Node * _node) {
- u32 i = FindNode(_NodeID, _node);
- std::vector<V4Node>::iterator iter = Nodes.begin();
-
- for (u32 j=0; j<i; j++) iter++;
- Nodes.erase(iter);
-}
-
-
-// GetV4Node -- retrieves a node from the pool
-V4Node& V4NodePool::GetV4Node(const u32 _NodeID, const GF_Node * _node) {
- u32 i = FindNode(_NodeID, _node);
- return Nodes.at(i);
-}
-
-
-// GetNodesCount -- returns the numbre of nodes
-u32 V4NodePool::GetNodesCount() const {
- return Nodes.size();
-}
-
-
-// FirstNode -- returns the beginning the list
-V4Node& V4NodePool::at(u32 n) {
- return Nodes.at(n);
-}
-
-
-
-// Clear -- deletes all item
-void V4NodePool::Clear() {
- Nodes.clear();
-}
-
-// returns count
-u32 V4NodePool::GetCount() const {
- return count;
-}
\ No newline at end of file
+++ /dev/null
-/*
- V4NodePool
-
- Holds every node usable
-
-*/
-
-#ifndef _V4NodePool_
-#define _V4NodePool_
-
-#include "safe_include.h"
-#include <vector>
-#include "V4Node.h"
-
-using namespace std;
-
-class V4NodePool {
-
- public:
-
- // Constructor
- V4NodePool() { count = 0; }
-
- // Adds a node to the pool
- V4Node& AddNode(GF_Node * node=NULL); // node may be modified, don't use const GF_Node *
-
- // Deletes a node from the pool
- void DeleteNode(const u32 NodeID, const GF_Node * node=NULL);
-
- // retrieves a node from the pool
- V4Node& GetV4Node(const u32 NodeID, const GF_Node * node=NULL);
-
- // returns the numbre of nodes
- u32 GetNodesCount() const;
-
- // returns the nth element in the vector
- V4Node& at(u32 n);
-
- // clear the pool
- void Clear();
-
- // returns count
- u32 GetCount() const;
-
-
- private:
- vector<V4Node> Nodes;
-
- // find the V4Node with the specified attributes
- u32 FindNode(const u32 NodeID, const GF_Node * node=NULL);
-
- // counts the nodes added to that pool (used in autonaming nodes)
- u32 count;
-
-};
-
-#endif
\ No newline at end of file
+++ /dev/null
-/*
- V4NodePools.cpp
-
- Implements V4NodePools class
-
-*/
-
-#include "V4NodePools.h"
-#include "V4NodePool.h"
-
-V4NodePool dummy;
-
-// Constructor
-V4NodePools::V4NodePools() {
- pools.resize(DICT_LAST);
- unPooled = 0;
-}
-
-
-// pool -- returns the pool of object for the given tag
-V4NodePool& V4NodePools::pool(const u32 tag)
-{
- u32 n = poolN(tag);
- if ((u32) -1 == n) return dummy;
- return pools.at(n);
-}
-
-
-// pool -- returns the NUMBER of the pool for the given tag
-u32 V4NodePools::poolN(const u32 tag) {
-
- switch (tag) {
-
- // objects that can be children of a switch
- case TAG_MPEG4_OrderedGroup:
- case TAG_MPEG4_Shape: {
- return DICT_GEN;
- break;
- }
-
- // objects that can be a geometry
- case TAG_MPEG4_Rectangle:
- case TAG_MPEG4_IndexedFaceSet2D:
- case TAG_MPEG4_Circle: {
- return DICT_GEOMETRY;
- break;
- }
-
- // objects that can be an appearance
- case TAG_MPEG4_Appearance: {
- return DICT_APPEARANCE;
- break;
- }
-
- // objects that can be a texture
- case TAG_MPEG4_MovieTexture:
- case TAG_MPEG4_ImageTexture: {
- return DICT_TEXTURE;
- break;
- }
-
- // objects that can be a material
- case TAG_MPEG4_Material2D: {
- return DICT_MATERIAL;
- break;
- }
-
- }
-
- return (u32) -1;
-}
-
-
-// poolNFromFieldName -- Get the correct pool from a field name
-V4NodePool& V4NodePools::poolFromFieldName(const char * name) {
-
- if (!strcmp("appearance", name)) return pools.at(DICT_APPEARANCE);
- if (!strcmp("geometry", name)) return pools.at(DICT_GEOMETRY);
- if (!strcmp("material", name)) return pools.at(DICT_MATERIAL);
- if (!strcmp("texture", name)) return pools.at(DICT_TEXTURE);
-
- // throws an exception if not found
- return dummy;
-}
-
-
-// Clear -- clears all the pool
-void V4NodePools::Clear() {
- for (u32 i = 0; i < pools.size(); i++)
- pools.at(i).Clear();
-}
-
-
-// Add -- Adds a node to the correct pool
-void V4NodePools::Add(GF_Node * node) {
- u32 tag = gf_node_get_tag(node);
- if (poolN(tag) == (u32) -1) return;
- pool(tag).AddNode(node);
-}
-
-
-// NodeHasField -- tells if nodes as field of the given type
-bool V4NodePools::NodeHasField(GF_Node * node, u32 fieldType) {
- u32 count = gf_node_get_field_count(node);
- GF_FieldInfo field;
-
- // cycles through all fields and checks field type
- for (u32 i = 0; i < count; i++) {
- gf_node_get_field(node, i, &field);
- if (field.fieldType == fieldType) return true;
- }
-
- return false;
-}
-
-
-// returns the total number of nodes created for that type of node
-u32 V4NodePools::GetCount(const u32 tag) {
- if (poolN(tag) == (u32) -1) return unPooled++;
- return pool(tag).GetCount();
-}
\ No newline at end of file
+++ /dev/null
-/*
- V4NodePools
-
- List all the Node pools for each possible node tag
-
-*/
-
-#include "safe_include.h"
-#include <gpac/scenegraph.h>
-#include <gpac/nodes_mpeg4.h>
-
-#include <vector>
-
-#include "V4NodePool.h"
-
-
-using namespace std;
-
-
-enum {
- DICT_GEN = 0,
- DICT_GEOMETRY,
- DICT_APPEARANCE,
- DICT_TEXTURE,
- DICT_MATERIAL,
-
- DICT_LAST // last element, gives the actual number of pool
-};
-
-
-class V4NodePools {
-
- public:
- // Constructor
- V4NodePools();
-
- // gets the correct pool from the given tag
- V4NodePool& pool(const u32 tag);
- V4NodePool& poolFromFieldName(const char * name);
- u32 poolN(const u32 tag);
-
- // clears all the pools
- void Clear();
-
- // Adds a node to the correct pool
- void Add(GF_Node * node);
-
- // tells if nodes as field of the given type
- bool NodeHasField(GF_Node * node, u32 fieldType);
-
- // returns the total number of nodes created for that type of node
- u32 GetCount(const u32 tag);
-
-
- private:
- vector<V4NodePool> pools;
- unsigned int unPooled;
-
-};
\ No newline at end of file
+++ /dev/null
-#include "V4SceneGraph.h"
-#include "V4StudioFrame.h"
-
-#include <gpac/scene_manager.h>
-#include <gpac/nodes_mpeg4.h>
-#include <gpac/internal/scenegraph_dev.h>
-
-#include "V4Service.h"
-
-V4SceneGraph::V4SceneGraph(V4StudioFrame *parent) : frame(parent)
-{
- m_pSm = NULL;
- m_pSg = NULL;
- m_pSr = NULL;
- m_pIs = NULL;
- m_pOriginal_mp4 = NULL;
- m_bEncodeNames = 0;
- m_term = parent->GetGPACPanel()->m_term;
-}
-
-V4SceneGraph::~V4SceneGraph()
-{
- // TODO : pquoi fallait il commenter cette ligne ?
- //if (m_pSm) gf_sm_del(m_pSm);
- if (m_pOriginal_mp4) gf_free(m_pOriginal_mp4);
- if (m_pService) delete m_pService;
-}
-
-void V4SceneGraph::SetSceneSize(int w, int h)
-{
- gf_sg_set_scene_size_info(m_pSg, w,h, 1);
- /*reassign scene graph to update scene size in renderer*/
- gf_sr_set_scene(m_pSr, m_pSg);
-}
-
-void V4SceneGraph::GetSceneSize(wxSize &size)
-{
- gf_sg_get_scene_size_info(m_pSg, (u32 *)&(size.x), (u32 *)&(size.y));
-}
-
-GF_Node *V4SceneGraph::SetTopNode(u32 tag)
-{
- GF_Node * root = NewNode(tag);
- gf_sg_set_root_node(m_pSg, root);
- return (GF_Node *)root;
-}
-
-
-GF_Node *V4SceneGraph::NewNode(u32 tag)
-{
- GF_Node *n = gf_node_new(m_pSg, tag);
- if (!n) return NULL;
- gf_node_init(n);
- return n;
-}
-
-void V4SceneGraph::SaveFile(const char *path)
-{
- char rad_name[5000];
- strcpy(rad_name, "dump");
- gf_sm_dump(m_pSm, rad_name, 0);
- GF_ISOFile *mp4 = gf_isom_open(path, GF_ISOM_WRITE_EDIT, NULL);
- m_pSm->max_node_id = gf_sg_get_max_node_id(m_pSm->scene_graph);
- gf_sm_encode_to_file(m_pSm, mp4, "c:\\log.txt", NULL, GF_SM_LOAD_MPEG4_STRICT, 0);
- gf_isom_close(mp4);
-}
-
-void V4SceneGraph::LoadNew()
-{
- if (m_pSm) {
- gf_sr_set_scene(m_pSr, NULL);
- gf_sm_del(m_pSm);
- m_pSm = NULL;
- gf_sg_del(m_pSg);
- m_pSg = NULL;
- }
- if (m_pOriginal_mp4) gf_free(m_pOriginal_mp4);
- m_pOriginal_mp4 = NULL;
-
- m_pIs = gf_is_new(NULL);
- m_pSg = m_pIs->graph;
- gf_sg_set_init_callback(m_pSg, v4s_node_init, this);
- gf_sr_set_scene(m_pSr, m_pSg);
-
- m_pSm = gf_sm_new(m_pSg);
- /* Create a BIFS stream with one AU with on ReplaceScene */
- GF_StreamContext *sc = gf_sm_stream_new(m_pSm, 1, GF_STREAM_SCENE, 0);
- GF_AUContext *au = gf_sm_stream_au_new(sc, 0, 0, 1);
- GF_Command *command = gf_sg_command_new(m_pSg, GF_SG_SCENE_REPLACE);
- gf_list_add(au->commands, command);
-
- // reinitializes the node pool
- frame->pools.Clear();
-}
-
-void V4SceneGraph::LoadFileOld(const char *path)
-{
- m_pService = new V4Service(path);
- gf_term_attach_service(m_term, m_pService->m_pNetClient);
- m_pIs = m_term->root_scene;
- m_pSg = m_pIs->graph;
- gf_term_play_from_time(m_term, 0);
- while(!m_pIs->graph_attached) {}
- // CreateDictionnary crashes because the root node in m_pSg is not set.
- CreateDictionnary();
-}
-
-void V4SceneGraph::LoadFile(const char *path)
-{
- GF_SceneLoader load;
- if (m_pSm) {
- gf_sr_set_scene(m_pSr, NULL);
- gf_sm_del(m_pSm);
- gf_sg_del(m_pSg);
- }
-
- // initializes a new scene
- // We need an GF_InlineScene, a SceneManager and an GF_ObjectManager
- m_pIs = gf_is_new(NULL);
- m_pSg = m_pIs->graph;
- m_pSm = gf_sm_new(m_pSg);
-
- m_pIs->root_od = gf_odm_new();
-
- m_pIs->root_od->parentscene = NULL;
- m_pIs->root_od->subscene = m_pIs;
- m_pIs->root_od->term = m_term;
-
- m_term->root_scene = m_pIs;
-
- // TODO : what's the use of this ?
- if (m_pOriginal_mp4) gf_free(m_pOriginal_mp4);
- m_pOriginal_mp4 = NULL;
-
- /* Loading of a file (BT, MP4 ...) and modification of the SceneManager */
- memset(&load, 0, sizeof(GF_SceneLoader));
- load.fileName = path;
- load.ctx = m_pSm;
- load.cbk = this;
- if (strstr(path, ".mp4") || strstr(path, ".MP4") ) load.isom = gf_isom_open(path, GF_ISOM_OPEN_READ, NULL);
- gf_sm_load_init(&load);
- gf_sm_load_run(&load);
- gf_sm_load_done(&load);
- if (load.isom) gf_isom_delete(load.isom);
-
- /* SceneManager should be initialized and filled correctly */
-
- gf_sg_set_scene_size_info(m_pSg, m_pSm->scene_width, m_pSm->scene_height, m_pSm->is_pixel_metrics);
-
- // TODO : replace with GetBifsStream
- GF_StreamContext *sc = (GF_StreamContext *) gf_list_get(m_pSm->streams,0);
-
- if (sc->streamType == 3) {
- GF_AUContext *au = (GF_AUContext *) gf_list_get(sc->AUs,0);
- GF_Command *c = (GF_Command *) gf_list_get(au->commands,0);
- gf_sg_command_apply(m_pSg, c, 0);
- /* This is a patch to solve the save pb:
- When ApplyCommand is made on a Scene Replace Command
- The command node is set to NULL
- When we save a BIFS stream whose first command is of this kind,
- the file saver thinks the bifs commands should come from an NHNT file
- This is a temporary patch */
- if (c->tag == GF_SG_SCENE_REPLACE) { c->node = m_pSg->RootNode; }
- }
- gf_sr_set_scene(m_pSr, m_pSg);
-
- // retrieves all the node from the tree and adds them to the node pool
- GF_Node * root = gf_sg_get_root_node(m_pSg);
- CreateDictionnary();
-}
-
-GF_Node *V4SceneGraph::CopyNode(GF_Node *node, GF_Node *parent, bool copy)
-{
- if (copy) return CloneNodeForEditing(m_pSg, node);
- u32 nodeID = gf_node_get_id(node);
- if (!nodeID) {
- nodeID = gf_sg_get_next_available_node_id(m_pSg);
- gf_node_set_id(node, nodeID, NULL);
- gf_node_register(node, parent);
- }
- return node;
-}
-
-void V4SceneGraph::LoadCommand(u32 commandNumber)
-{
- GF_StreamContext *sc = NULL;
- for (u32 i=0; i<gf_list_count(m_pSm->streams); i++) {
- sc = (GF_StreamContext *) gf_list_get(m_pSm->streams, i);
- if (sc->streamType == GF_STREAM_SCENE) break;
- sc = NULL;
- }
- assert(sc);
- GF_AUContext *au = (GF_AUContext *) gf_list_get(sc->AUs,0);
- if (commandNumber < gf_list_count(au->commands)) {
- for (u32 j=0; j<=commandNumber; j++) {
- GF_Command *c = (GF_Command *) gf_list_get(au->commands, j);
- gf_sg_command_apply(m_pSg, c, 0);
- }
- }
-}
-
-
-
-extern "C" {
-
-GF_Node *CloneNodeForEditing(GF_SceneGraph *inScene, GF_Node *orig) //, GF_Node *cloned_parent)
-{
- u32 i, j, count;
- GF_Node *node, *child, *tmp;
- GF_List *list, *list2;
- GF_FieldInfo field_orig, field;
-
- /*this is not a mistake*/
- if (!orig) return NULL;
-
- /*check for DEF/USE
- if (orig->sgprivate->NodeID) {
- node = gf_sg_find_node(inScene, orig->sgprivate->NodeID);
- //node already created, USE
- if (node) {
- gf_node_register(node, cloned_parent);
- return node;
- }
- }
- */
- /*create a node*/
-/*
- if (orig->sgprivate->tag == TAG_MPEG4_ProtoNode) {
- proto_node = ((GF_ProtoInstance *)orig)->proto_interface;
- //create the instance but don't load the code -c we MUST wait for ISed routes to be cloned before
- node = gf_sg_proto_create_node(inScene, proto_node, (GF_ProtoInstance *) orig);
- } else {
-*/
- node = gf_node_new(inScene, gf_node_get_tag(orig));
-// }
-
- count = gf_node_get_field_count(orig);
-
- /*copy each field*/
- for (i=0; i<count; i++) {
- gf_node_get_field(orig, i, &field_orig);
-
- /*get target ptr*/
- gf_node_get_field(node, i, &field);
-
- assert(field.eventType==field_orig.eventType);
- assert(field.fieldType==field_orig.fieldType);
-
- /*duplicate it*/
- switch (field.fieldType) {
- case GF_SG_VRML_SFNODE:
- child = CloneNodeForEditing(inScene, (GF_Node *) (* ((GF_Node **) field_orig.far_ptr)));//, node);
- *((GF_Node **) field.far_ptr) = child;
- break;
- case GF_SG_VRML_MFNODE:
- list = *( (GF_List **) field_orig.far_ptr);
- list2 = *( (GF_List **) field.far_ptr);
-
- for (j=0; j<gf_list_count(list); j++) {
- tmp = (GF_Node *)gf_list_get(list, j);
- child = CloneNodeForEditing(inScene, tmp);//, node);
- gf_list_add(list2, child);
- }
- break;
- default:
- gf_sg_vrml_field_copy(field.far_ptr, field_orig.far_ptr, field.fieldType);
- break;
- }
- }
- /*register node
- if (orig->sgprivate->NodeID) {
- Node_SetID(node, orig->sgprivate->NodeID);
- gf_node_register(node, cloned_parent);
- }*/
-
- /*init node before creating ISed routes so the eventIn handler are in place*/
- if (gf_node_get_tag(node) != TAG_ProtoNode) gf_node_init(node);
-
- return node;
-}
-
-}
-
-
-// GetBifsStream -- gets the first stream with id = 3
-GF_StreamContext * V4SceneGraph::GetBifsStream() {
- GF_StreamContext * ctx = NULL;
- u32 count = gf_list_count(m_pSm->streams);
-
- // cycle trough each stream
- while (count--) {
- ctx = (GF_StreamContext *) gf_list_get(m_pSm->streams, count);
- if (ctx->streamType == 3) break;
- }
-
- if (ctx == NULL) return NULL;
-
- // if we went through the loop without finding any BIFS stream return null
- if (ctx->streamType != 3) return NULL;
-
- return ctx;
-}
-
-
+++ /dev/null
-#ifndef _V4SCENEGRAPH_H
-#define _V4SCENEGRAPH_H
-
-#include "safe_include.h"
-#include <gpac/scene_manager.h>
-#include <gpac/compositor.h>
-#include <gpac/internal/terminal_dev.h> // MPEG4CLIENT
-
-
-#include <wx/gdicmn.h>
-
-
-#define DICTNAME "__V4dictionnary"
-
-
-#define FPS 25
-
-
-class V4StudioFrame;
-class V4Service;
-
-extern "C" {
- GF_Node *CloneNodeForEditing(GF_SceneGraph *inScene, GF_Node *orig);
- int GetNextNodeID(GF_SceneGraph *sg);
-}
-
-class V4SceneGraph {
-public:
- // Constructor / Desctructor
- V4SceneGraph(V4StudioFrame *parent);
- ~V4SceneGraph();
-
-
- /* file management functions */
-
- void SaveFile(const char * path);
- void LoadNew();
- void LoadFile(const char *path);
- void LoadFileOld(const char *path);
-
-
- /* Node management functions */
-
- GF_Node *NewNode(u32 tag);
- GF_Node *CopyNode(GF_Node *node, GF_Node *parent, bool copy);
- GF_Node *SetTopNode(u32 tag); // TODO : will destroy dictionnary
-
- /* Various */
-
- void LoadCommand(u32 commandNumber); // ?
- GF_StreamContext * GetBifsStream(); // Get the first stream with id = 3
-
-
- /* access to private members */
-
- // SceneSize
- void SetSceneSize(int w, int h);
- void GetSceneSize(wxSize &size);
-
- // Renderer (owned by the terminal)
- void SetRenderer(GF_Compositor *sr) { m_pSr = sr; }
- GF_Compositor *GetSceneCompositor() { return m_pSr; }
-
- // GF_InlineScene
- // TODO : Should be modified ?
- LPINLINESCENE GetInlineScene() { return m_pIs; }
-
- // SceneManager
- // TODO : Should be modified ?
- GF_SceneManager * GetSceneManager() { return m_pSm; }
-
- // SceneGraph
- GF_SceneGraph *GetSceneGraph() { return m_pSg; }
- GF_Node *GetRootNode() { return gf_sg_get_root_node(m_pSg); }
-
-protected:
-
- // self created
- LPINLINESCENE m_pIs;
- GF_SceneGraph * m_pSg;
- GF_SceneManager *m_pSm;
- GF_Node * dictionnary;
-
- // from other objects
- GF_Compositor *m_pSr;
- GF_Terminal *m_term;
- V4StudioFrame * frame;
-
- char *m_pOriginal_mp4;
- Bool m_bEncodeNames;
- V4Service *m_pService;
-};
-
-#endif
-
+++ /dev/null
-#include "V4SceneManager.h"
-#include "V4StudioFrame.h"
-
-#include <gpac/scene_manager.h>
-#include <gpac/nodes_mpeg4.h>
-#include <gpac/internal/scenegraph_dev.h>
-#include <gpac/constants.h>
-
-
-V4SceneManager::V4SceneManager(V4StudioFrame *parent) : frame(parent)
-{
- m_pSm = NULL;
- m_pIs = NULL;
- units = 1000; // used to calculate AU timings
-}
-
-V4SceneManager::~V4SceneManager()
-{
- GF_SceneGraph *tmp = m_pIs->graph;
-
- /* Deletion of the SceneManager
- This is done before deleting the GF_InlineScene in the GF_Terminal in the GPAC Panel
- but for that we need to register the root node one more time to avoid the deletion of the scene graph
- But this is temporary, this register of the root node should be done at loading time.
- */
- if (m_pSm) {
- gf_node_register(m_pSm->scene_graph->RootNode, NULL);
- gf_sm_del(m_pSm);
- m_pSm = NULL;
- }
-
- /* Destruction of the GPAC panel and of the associated service and terminal */
- delete m_gpac_panel;
- m_gpac_panel = NULL;
-
-}
-
-void V4SceneManager::LoadCommon()
-{
- /* Creation and initialization of the structure InlineScene, including the SceneGraph */
- m_pIs = gf_inline_new(NULL);
-
- /* Creation of the GPAC Panel which includes the creation of the terminal */
- m_gpac_panel = new wxGPACPanel(this, NULL);
-
- /* Connection of the InlineScene to the terminal */
- GF_Terminal *term = m_gpac_panel->GetMPEG4Terminal();
- term->root_scene = m_pIs;
-
-/*
- gf_sc_set_scene(term->compositor, m_pIs->graph);
- m_pIs->graph_attached = 1;
-*/
-
- /* Creation of a SceneManager to manipulate the scene and streams */
- m_pSm = gf_sm_new(m_pIs->graph);
-
- /* Creation of main ObjectManager to manipulate the media */
- m_pIs->root_od = gf_odm_new();
- m_pIs->root_od->parentscene = NULL;
- m_pIs->root_od->subscene = m_pIs;
- m_pIs->root_od->term = term;
-}
-
-void V4SceneManager::LoadNew()
-{
- LoadCommon();
-
- /* Create a BIFS stream with one AU with one ReplaceScene */
- GF_StreamContext *sc = gf_sm_stream_new(m_pSm, 1, GF_STREAM_SCENE, 0);
- GF_AUContext *au = gf_sm_stream_au_new(sc, 0, 0, 1);
- GF_Command *command = gf_sg_command_new(m_pIs->graph, GF_SG_SCENE_REPLACE);
- gf_list_add(au->commands, command);
-
- SetLength(50);
- SetFrameRate(25);
-
- // reinitializes the node pool
- pools.Clear();
-}
-
-void V4SceneManager::LoadFile(const char *path)
-{
- LoadCommon();
- GF_Terminal *term = m_gpac_panel->GetMPEG4Terminal();
-
- /* Loading of a file (BT, MP4 ...) and modification of the SceneManager */
- GF_SceneLoader load;
- memset(&load, 0, sizeof(GF_SceneLoader));
- load.fileName = path;
- load.ctx = m_pSm;
- if (strstr(path, ".mp4") || strstr(path, ".MP4") ) load.isom = gf_isom_open(path, GF_ISOM_OPEN_READ, NULL);
- gf_sm_load_init(&load);
- gf_sm_load_run(&load);
- gf_sm_load_done(&load);
- if (load.isom) gf_isom_delete(load.isom);
-
- /* SceneManager should be initialized and filled correctly */
-
- gf_sg_set_scene_size_info(m_pIs->graph, m_pSm->scene_width, m_pSm->scene_height, m_pSm->is_pixel_metrics);
-
- // TODO : replace with GetBifsStream
- GF_StreamContext *sc = (GF_StreamContext *) gf_list_get(m_pSm->streams,0);
-
- if (sc->streamType == 3) {
- GF_AUContext *au = (GF_AUContext *) gf_list_get(sc->AUs,0);
- GF_Command *c = (GF_Command *) gf_list_get(au->commands,0);
- //gf_sg_command_apply(m_pIs->graph, c, 0);
- /* This is a patch to solve the save pb:
- When ApplyCommand is made on a Scene Replace Command
- The command node is set to NULL
- When we save a BIFS stream whose first command is of this kind,
- the file saver thinks the bifs commands should come from an NHNT file
- This is a temporary patch */
- if (c->tag == GF_SG_SCENE_REPLACE) { c->node = m_pIs->graph->RootNode; }
- }
-
- gf_sc_set_scene(term->compositor, m_pIs->graph);
- m_pIs->graph_attached = 1;
-
- // TODO : read actual values from file
- SetLength(50);
- SetFrameRate(25);
-
- // retrieves all the node from the tree and adds them to the node pool
- GF_Node * root = gf_sg_get_root_node(m_pIs->graph);
-// CreateDictionnary();
-}
-
-void V4SceneManager::SaveFile(const char *path)
-{
- GF_SMEncodeOptions opts;
- char rad_name[5000];
-
- /* First dump the scene in a BT file */
- strcpy(rad_name, "dump");
- m_pSm->scene_graph->RootNode = NULL;
- gf_sm_dump(m_pSm, rad_name, 0);
-
- /* Then reload properly (overriding the current SceneManager)*/
- GF_SceneLoader load;
- memset(&load, 0, sizeof(GF_SceneLoader));
- load.fileName = "dump.bt";
- load.ctx = m_pSm;
- gf_sm_load_init(&load);
- gf_sm_load_run(&load);
- gf_sm_load_done(&load);
-
- /* Finally encode the file */
- GF_ISOFile *mp4 = gf_isom_open(path, GF_ISOM_WRITE_EDIT, NULL);
- m_pSm->max_node_id = gf_sg_get_max_node_id(m_pSm->scene_graph);
- memset(&opts, 0, sizeof(opts));
- opts.flags = GF_SM_LOAD_MPEG4_STRICT;
- gf_sm_encode_to_file(m_pSm, mp4, &opts);
- gf_isom_set_brand_info(mp4, GF_ISOM_BRAND_MP42, 1);
- gf_isom_modify_alternate_brand(mp4, GF_ISOM_BRAND_ISOM, 1);
- gf_isom_close(mp4);
-}
-
-void V4SceneManager::SetSceneSize(int w, int h)
-{
- gf_sg_set_scene_size_info(m_pIs->graph, w,h, 1);
- /*reassign scene graph to update scene size in renderer*/
- gf_sc_set_scene(m_gpac_panel->GetMPEG4Terminal()->compositor, m_pIs->graph);
- m_pIs->graph_attached = 1;
-}
-
-void V4SceneManager::GetSceneSize(wxSize &size)
-{
- gf_sg_get_scene_size_info(m_pIs->graph, (u32 *)&(size.x), (u32 *)&(size.y));
-}
-
-GF_Node *V4SceneManager::SetTopNode(u32 tag)
-{
- GF_Node *root = NewNode(tag);
- gf_sg_set_root_node(m_pIs->graph, root);
- GF_StreamContext *sc = (GF_StreamContext *) gf_list_get(m_pSm->streams,0);
- if (sc->streamType == 3) {
- GF_AUContext *au = (GF_AUContext *) gf_list_get(sc->AUs,0);
- GF_Command *c = (GF_Command *) gf_list_get(au->commands,0);
- /* This is a patch to solve the save pb:
- When ApplyCommand is made on a Scene Replace Command
- The command node is set to NULL
- When we save a BIFS stream whose first command is of this kind,
- the file saver thinks the bifs commands should come from an NHNT file
- This is a temporary patch */
- if (c->tag == GF_SG_SCENE_REPLACE) {
- c->node = m_pIs->graph->RootNode;
- gf_node_register(m_pIs->graph->RootNode, NULL);
- }
- }
- return root;
-}
-
-GF_Node *V4SceneManager::NewNode(u32 tag)
-{
- GF_Node *n = gf_node_new(m_pIs->graph, tag);
- if (!n) return NULL;
- gf_node_init(n);
- return n;
-}
-
-GF_Node *V4SceneManager::CopyNode(GF_Node *node, GF_Node *parent, bool copy)
-{
- if (copy) return CloneNodeForEditing(m_pIs->graph, node);
- u32 nodeID = gf_node_get_id(node);
- if (!nodeID) {
- nodeID = gf_sg_get_next_available_node_id(m_pIs->graph);
- gf_node_set_id(node, nodeID, NULL);
- gf_node_register(node, parent);
- }
- return node;
-}
-
-extern "C" {
-
-GF_Node *CloneNodeForEditing(GF_SceneGraph *inScene, GF_Node *orig) //, GF_Node *cloned_parent)
-{
- u32 i, j, count;
- GF_Node *node, *child, *tmp;
- GF_ChildNodeItem *list, *list2;
- GF_FieldInfo field_orig, field;
-
- /*this is not a mistake*/
- if (!orig) return NULL;
-
- /*check for DEF/USE
- if (orig->sgprivate->NodeID) {
- node = gf_sg_find_node(inScene, orig->sgprivate->NodeID);
- //node already created, USE
- if (node) {
- gf_node_register(node, cloned_parent);
- return node;
- }
- }
- */
- /*create a node*/
-/*
- if (orig->sgprivate->tag == TAG_MPEG4_ProtoNode) {
- proto_node = ((GF_ProtoInstance *)orig)->proto_interface;
- //create the instance but don't load the code -c we MUST wait for ISed routes to be cloned before
- node = gf_sg_proto_create_node(inScene, proto_node, (GF_ProtoInstance *) orig);
- } else {
-*/
- node = gf_node_new(inScene, gf_node_get_tag(orig));
-// }
-
- count = gf_node_get_field_count(orig);
-
- /*copy each field*/
- for (i=0; i<count; i++) {
- gf_node_get_field(orig, i, &field_orig);
-
- /*get target ptr*/
- gf_node_get_field(node, i, &field);
-
- assert(field.eventType==field_orig.eventType);
- assert(field.fieldType==field_orig.fieldType);
-
- /*duplicate it*/
- switch (field.fieldType) {
- case GF_SG_VRML_SFNODE:
- child = CloneNodeForEditing(inScene, (GF_Node *) (* ((GF_Node **) field_orig.far_ptr)));//, node);
- *((GF_Node **) field.far_ptr) = child;
- break;
- case GF_SG_VRML_MFNODE:
- list = *( (GF_ChildNodeItem **) field_orig.far_ptr);
- list2 = *( (GF_ChildNodeItem **) field.far_ptr);
-
- for (j=0; j<gf_node_list_get_count(list); j++) {
- tmp = (GF_Node *)gf_node_list_get_child(list, j);
- child = CloneNodeForEditing(inScene, tmp);//, node);
- gf_node_list_add_child(&list2, child);
- }
- break;
- default:
- gf_sg_vrml_field_copy(field.far_ptr, field_orig.far_ptr, field.fieldType);
- break;
- }
- }
- /*register node
- if (orig->sgprivate->NodeID) {
- Node_SetID(node, orig->sgprivate->NodeID);
- gf_node_register(node, cloned_parent);
- }*/
-
- /*init node before creating ISed routes so the eventIn handler are in place*/
- if (gf_node_get_tag(node) != TAG_ProtoNode) gf_node_init(node);
-
- return node;
-}
-
-} // extern "C"
-
-
-// GetBifsStream -- gets the first stream with id = 3
-GF_StreamContext * V4SceneManager::GetBifsStream() {
- GF_StreamContext * ctx = NULL;
- u32 count = gf_list_count(m_pSm->streams);
-
- // cycle trough each stream
- while (count--) {
- ctx = (GF_StreamContext *) gf_list_get(m_pSm->streams, count);
- if (ctx->streamType == 3) break;
- }
-
- if (ctx == NULL) return NULL;
-
- // if we went through the loop without finding any BIFS stream return null
- if (ctx->streamType != 3) return NULL;
-
- return ctx;
-}
-
-
-// CreateDictionnary -- Create the root node of the dictionnary and populates it
-void V4SceneManager::CreateDictionnary() {
- GF_Node * root = gf_sg_get_root_node(m_pIs->graph);
- dictionnary = NewNode(TAG_MPEG4_Switch);
-
- // Insert the dictionnary in the scene and gives it a name
- gf_node_insert_child(root, dictionnary, 0);
- gf_node_register(dictionnary, root);
- gf_node_set_id(dictionnary, gf_sg_get_next_available_node_id(m_pIs->graph), DICTNAME);
-
- // makes the dictionnary invisible
- // the number 1 field is the "whichChoice", setting it to -1 makes it display nothing
- GF_FieldInfo field;
- gf_node_get_field(dictionnary, 1, &field);
- frame->GetFieldView()->SetFieldValue(field, &wxString("-1"), -1); // TODO : maybe put the method SetFieldValue somewhere more accessible
-
- // populates dictionnary with the root node of the scene
- AddToDictionnary(root);
-}
-
-
-// AddToDictionnary -- adds a node to the dictionnary, increases its reference count, the node must already have an ID
-// WARNING : does not add the node to the pool if it has a parent in the dictionnary
-void V4SceneManager::AddToDictionnary(GF_Node * node) {
-
- // checks if nodes has a parent with an id
- // if true then there is already a reference to this node
- if (HasDefParent(node)) return;
-
- AddRecursive(node);
-}
-
-
-// AddRecursive -- recursively adds items with an ID to the dictionnary
-void V4SceneManager::AddRecursive(GF_Node * node, bool parentAdded) {
-
- // skips empty nodes
- if (!node) return;
-
- // skips the dictionnary
- const char * c = gf_node_get_name(node);
- if ( (c != NULL) && (!strcmp(c, DICTNAME)) ) return;
-
- // if node as an id adds it to the dictionnary and the node pool
- u32 id = gf_node_get_id(node);
- if (id) {
- pools.Add(node);
- // children of added node are not added to the dictionnary
- if (!parentAdded) AddEffective(node);
- parentAdded = true;
- }
-
- GF_FieldInfo field;
- GF_ChildNodeItem * list;
- int count = gf_node_get_field_count(node);
-
- // tests all fields, if a field is a node then adds it and process its children recursively
- for (int i=0; i<count; i++) {
-
- gf_node_get_field(node, i, &field);
-
- // single value node field
- if (field.fieldType == GF_SG_VRML_SFNODE)
- AddRecursive( * ((GF_Node **) field.far_ptr), parentAdded );
-
- // multiple value node field
- if (field.fieldType == GF_SG_VRML_MFNODE) {
- list = *( (GF_ChildNodeItem **) field.far_ptr);
- for (u32 j=0; j<gf_node_list_get_count(list); j++)
- AddRecursive( (GF_Node *) gf_node_list_get_child(list, j), parentAdded );
- }
- }
-}
-
-
-// AddEffective --
-void V4SceneManager::AddEffective(GF_Node * node) {
-
- // gets the node type (equals pool number)
- u32 poolN = pools.poolN(gf_node_get_tag(node));
-
- // adds the node using a type specific function
- switch (poolN) {
- case DICT_GEN: {
- AddGen(node);
- break;
- }
-
- case DICT_GEOMETRY: {
- AddGeometry(node);
- break;
- }
-
- case DICT_APPEARANCE: {
- AddAppearance(node);
- break;
- }
-
- case DICT_TEXTURE: {
- AddTexture(node);
- break;
- }
-
- case DICT_MATERIAL: {
- AddMaterial(node);
- break;
- }
-
- // TODO : raise an exception when not found
- }
-
-}
-
-
-// RemoveFromDictionnary -- Removes _ONE_ item from the dictionnary, if some of the children are also in the dictionnary preserves them
-void V4SceneManager::RemoveFromDictionnary(GF_Node * node) {
-
-}
-
-
-/******* Add element to dictionnary functions *******/
-
-// TODO : can add genericity around here
-// ATTENTION, all these functions thinks the node as already been assigned an ID
-
-// Add gen -- adds any element which can be a children of a switch node
-void V4SceneManager::AddGen(GF_Node * node) {
-
- // retrieves the chain of children (field number 0 named "choice")
- GF_FieldInfo field;
- GF_List * list;
-
- gf_node_get_field(dictionnary, 0, &field);
- list = *( (GF_List **) field.far_ptr);
-
- // adds a reference to that node in the dictionnary
- gf_list_add(list, node);
- gf_node_register(node, dictionnary);
-
-}
-
-
-// TODO : check if there is a dummy node with free space in it
-
-
-// AddGeometry -- adds any element which can be a children of a shape as a geometry node
-void V4SceneManager::AddGeometry(GF_Node * node) {
-
- // creates a dummy node to hold this one
- GF_Node * parent = CreateDummyNode(TAG_MPEG4_Shape, dictionnary, 0);
-
- // sets the parentship relation
- MakeChild(node, parent, 1); // geometry is field one in a shape
-
-}
-
-
-// AddAppearance -- adds any element which can be a children of a shape as an appearance node
-void V4SceneManager::AddAppearance(GF_Node * node) {
-
- // creates a dummy node to hold this one
- GF_Node * parent = CreateDummyNode(TAG_MPEG4_Shape, dictionnary, 0);
-
- // sets the parentship relation
- MakeChild(node, parent, 0); // appearance is field zero in a shape
-}
-
-
-// AddTexture -- adds any element which can be a children of an appearance as a texture node
-void V4SceneManager::AddTexture(GF_Node * node) {
-
- // creates dummy nodes to hold this one
- GF_Node * parent1 = CreateDummyNode(TAG_MPEG4_Shape, dictionnary, 0);
- GF_Node * parent2 = CreateDummyNode(TAG_MPEG4_Appearance, parent1, 3);
-
- // sets the parentship relation
- MakeChild(node, parent2, 1); // texture is field one in a appearance
-
-}
-
-
-// AddMaterial -- adds any element which can be a children of an appearance as a material node
-void V4SceneManager::AddMaterial(GF_Node * node) {
-
- // creates dummy nodes to hold this one
- GF_Node * parent1 = CreateDummyNode(TAG_MPEG4_Shape, dictionnary, 0);
- GF_Node * parent2 = CreateDummyNode(TAG_MPEG4_Appearance, parent1, 3);
-
- // sets the parentship relation
- MakeChild(node, parent2, 0); // material is field zero in appearance
-}
-
-
-// CreateDummyNode -- creates a node to hold another one, adds this node to given field of the given parent
-// (designed for use with nodes in the dictionnary)
-GF_Node * V4SceneManager::CreateDummyNode(const u32 tag, GF_Node * parent, const u32 fieldIndex) {
-
- // creates a new node for this scene
- GF_Node * newNode = NewNode(tag);
-
- // sets the parentship relation !! AND registers the node !!
- MakeChild(newNode, parent, fieldIndex);
-
- return newNode;
-}
-
-
-// MakeChild -- Sets the first node as a child of the second using the given field
-void V4SceneManager::MakeChild(GF_Node * child, GF_Node * parent, const u32 fieldIndex) {
- // get the field where we have to add the new child
- GF_FieldInfo field;
- gf_node_get_field(parent, fieldIndex, &field);
-
- // keeps the count of uses up to date
- gf_node_register(child, parent);
-
- // if the field is single valued
- if (field.fieldType == GF_SG_VRML_SFNODE) {
- *((GF_Node **) field.far_ptr) = child;
- }
-
- // if the field is multi valued
- if (field.fieldType == GF_SG_VRML_MFNODE)
- gf_node_list_add_child((GF_ChildNodeItem **)field.far_ptr, child );
-
-}
-
-
-// GetDictionnary -- access to the dictionnary
-GF_Node * V4SceneManager::GetDictionnary() const {
- return dictionnary;
-}
-
-
-// HasDefParent -- checks if an ancestor of this node has an ID
-GF_Node * V4SceneManager::HasDefParent(GF_Node * node) {
-
- assert(node);
-
- // also checks the node itself
-
- int count = gf_node_get_parent_count(node);
- GF_Node * parent;
-
- // loops through all the parents and recurses
- for (int i=0; i<count; i++) {
- parent = gf_node_get_parent(node, i);
- const char * name = gf_node_get_name(parent);
- if (name) return parent;
-
- parent = HasDefParent(parent);
- if (parent) return parent;
- }
-
- return NULL;
-}
-
-void V4SceneManager::CreateIDandAddToPool(GF_Node *node)
-{
- // gets a node ID
- u32 id = gf_sg_get_next_available_node_id(GetSceneGraph());
-
- char d[10]; // supposes no more than 1 000 000 000 objects
-
- // queries the pool to know which number to use for the name
- itoa(pools.GetCount(gf_node_get_tag(node)), d, 10);
-
- char c[50];
- strcpy(c, gf_node_get_class_name(node));
- strncat(c, "_", 1);
- strncat(c, d, 10);
-
- gf_node_set_id(node, id, c); // assigns NodeID and name
- pools.Add(node); // adds to the node pool
-
-}
-
-
-// SetLength -- updates the number of cells in the timeline
-void V4SceneManager::SetLength(const u32 length_) {
- length = length_;
- frame->GetTimeLine()->SetLength(length_);
-}
\ No newline at end of file
+++ /dev/null
-#ifndef _V4SceneManager_H
-#define _V4SceneManager_H
-
-#include "safe_include.h"
-#include <gpac/scene_manager.h>
-#include <gpac/compositor.h>
-#include <gpac/internal/terminal_dev.h> // MPEG4CLIENT
-#include "wxGPACPanel.h"
-#include "V4NodePools.h"
-
-
-#include <wx/gdicmn.h>
-
-
-#define DICTNAME "__V4dictionnary"
-
-
-class V4StudioFrame;
-
-extern "C" {
- GF_Node *CloneNodeForEditing(GF_SceneGraph *inScene, GF_Node *orig);
- int GetNextNodeID(GF_SceneGraph *sg);
-}
-
-class V4SceneManager {
-public:
- // Constructor / Desctructor
- V4SceneManager(V4StudioFrame *parent);
- ~V4SceneManager();
-
- // reusable nodes, sorted by tag
- V4NodePools pools;
-
- /* file management functions */
-
- void SaveFile(const char * path);
-
- void LoadCommon();
- void LoadNew();
- void LoadFile(const char *path);
-
- /* Node management functions */
-
- GF_Node *NewNode(u32 tag);
- GF_Node *CopyNode(GF_Node *node, GF_Node *parent, bool copy);
- GF_Node *SetTopNode(u32 tag); // TODO : will destroy dictionnary
-
- void CreateIDandAddToPool(GF_Node *node);
-
- /* Dictionnary functions */
-
- // adds a node to the dictionnary, increases its reference count, the node must already have an ID
- void AddToDictionnary(GF_Node * node);
-
- // removes a node from the dictionnary = DELETES it's ID
- void RemoveFromDictionnary(GF_Node * node);
-
- GF_Node * GetDictionnary() const;
-
-
- /* Various */
-
- void LoadCommand(u32 commandNumber); // ?
- GF_StreamContext * GetBifsStream(); // Get the first stream with id = 3
-
-
- /* access to private members */
-
- // SceneSize
- void SetSceneSize(int w, int h);
- void GetSceneSize(wxSize &size);
-
- // FrameRate
- void SetFrameRate(const u32 framerate_) { frameRate = framerate_; }
- u32 GetFrameRate() const { return frameRate; }
-
- // accesses Length
- void SetLength(const u32 length_);
- u32 GetLength() const { return length; }
-
- // accesses units
- void SetUnits(u32 units_) { units = units_; }
- u32 GetUnits() const { return units; }
-
-
-
- GF_Compositor *GetSceneCompositor() { return m_gpac_panel->GetSceneCompositor(); }
-
- // GF_InlineScene
- GF_InlineScene *GetInlineScene() { return m_pIs; }
-
- // SceneGraph
- GF_SceneGraph *GetSceneGraph() { return m_pIs->graph; }
- GF_Node *GetRootNode() { return gf_sg_get_root_node(m_pIs->graph); }
-
- wxGPACPanel *GetGPACPanel() { return m_gpac_panel; }
- V4StudioFrame *GetV4StudioFrame() { return frame; }
-
- // TODO : terminal
- private:
-
- /* dictionnary function */
-
- // initializes the dictionnary node
- void CreateDictionnary();
-
- // Finds all node with an ID from the given node and adds them to the node pool and the dictionnary
- void AddRecursive(GF_Node * node, bool parentAdded = false);
-
- // calls a proper function to add the node according to its type
- void AddEffective(GF_Node * node);
-
- // Create a dummy node of type tag and it to the specified field (or reimplace if the field is single valued)
- GF_Node * CreateDummyNode(const u32 tag, GF_Node * parent, const u32 fieldIndex);
-
- // Sets the first node as a child of the second using the given field
- void MakeChild(GF_Node * child, GF_Node * parent, const u32 fieldIndex);
-
- // Checks is specified node as a parent with an ID
- GF_Node * V4SceneManager::HasDefParent(GF_Node * node);
-
- // adds a node to the dictionnary
- void AddGen(GF_Node * node);
- void AddGeometry(GF_Node * node);
- void AddAppearance(GF_Node * node);
- void AddTexture(GF_Node * node);
- void AddMaterial(GF_Node * node);
-
-
-protected:
-
- // self created
- LPINLINESCENE m_pIs;
- GF_SceneManager *m_pSm;
- GF_Node *dictionnary;
- wxGPACPanel *m_gpac_panel;
-
- // from other objects
- V4StudioFrame *frame;
-
- u8 frameRate;
- u32 length; // in frames!
- u32 units; // = 1000
-
-};
-
-#endif
-
+++ /dev/null
-#include "V4Service.h"
-
-#include <gpac/constants.h>
-
-#define V4_PRIVATE_SCENE_OTI 0xFF
-
-extern "C" {
-
-
-V4Channel *V4Service::V4_GetChannel(V4Service *v4service, LPNETCHANNEL ch)
-{
- u32 i;
- for (i=0; i<gf_list_count(v4service->channels); i++) {
- V4Channel *v4c = (V4Channel *)gf_list_get(v4service->channels, i);
- if (v4c->ch && v4c->ch==ch) return v4c;
- }
- return NULL;
-}
-
-Bool V4Service::V4_RemoveChannel(V4Service *v4service, LPNETCHANNEL ch)
-{
- u32 i;
- for (i=0; i<gf_list_count(v4service->channels); i++) {
- V4Channel *v4c = (V4Channel *)gf_list_get(v4service->channels, i);
- if (v4c->ch && v4c->ch==ch) {
- gf_list_rem(v4service->channels, i);
- gf_free(v4c);
- return 1;
- }
- }
- return 0;
-}
-
-static Bool V4_CanHandleURL(GF_InputService *plug, const char *url)
-{
- return 1;
-}
-
-static GF_Err V4_ConnectService (GF_InputService *plug, GF_ClientService *serv, const char *url)
-{
- V4Service *v4serv = (V4Service *)plug->priv;
- v4serv->SetService(serv);
- gf_term_on_connect(v4serv->GetService(), NULL, GF_OK);
- return GF_OK;
-}
-
-static GF_Err V4_CloseService(GF_InputService *plug)
-{
- V4Service *v4serv = (V4Service *)plug->priv;
- gf_term_on_disconnect(v4serv->GetService(), NULL, GF_OK);
- return GF_OK;
-}
-
-static GF_Descriptor *V4_GetServiceDesc(GF_InputService *plug, u32 expect_type, const char *sub_url)
-{
- V4Service *v4service= (V4Service *) plug->priv;
- GF_ESD *esd;
- GF_InitialObjectDescriptor *iod = (GF_InitialObjectDescriptor *) gf_odf_desc_new(GF_ODF_IOD_TAG);
- iod->scene_profileAndLevel = 1;
- iod->graphics_profileAndLevel = 1;
- iod->OD_profileAndLevel = 1;
- iod->audio_profileAndLevel = 0xFE;
- iod->visual_profileAndLevel = 0xFE;
- iod->objectDescriptorID = 1;
-
- esd = gf_odf_desc_esd_new(0);
- esd->slConfig->timestampResolution = 1000;
- esd->slConfig->useTimestampsFlag = 1;
- esd->ESID = 0xFFFE;
- esd->decoderConfig->streamType = GF_STREAM_PRIVATE_SCENE;
- esd->decoderConfig->objectTypeIndication = 0x01; //V4_PRIVATE_SCENE_OTI;
- if (v4service->GetPath()) {
- esd->decoderConfig->decoderSpecificInfo->dataLength = strlen(v4service->GetPath()) + 1;
- esd->decoderConfig->decoderSpecificInfo->data = gf_strdup(v4service->GetPath());
- }
- gf_list_add(iod->ESDescriptors, esd);
- return (GF_Descriptor *)iod;
-}
-
-static GF_Err V4_ConnectChannel(GF_InputService *plug, LPNETCHANNEL channel, const char *url, Bool upstream)
-{
- u32 ESID;
- V4Service *v4serv = (V4Service *)plug->priv;
-
- sscanf(url, "ES_ID=%ud", &ESID);
- if (!ESID) {
- gf_term_on_connect(v4serv->GetService(), channel, GF_STREAM_NOT_FOUND);
- } else {
- V4Channel *v4c = (V4Channel *)gf_malloc(sizeof(V4Channel));
- memset(v4c, 0, sizeof(V4Channel));
- v4c->ch = channel;
- v4c->ESID = ESID;
- gf_list_add(v4serv->GetChannels(), v4c);
- gf_term_on_connect(v4serv->GetService(), channel, GF_OK);
- }
- return GF_OK;
-}
-
-static GF_Err V4_DisconnectChannel(GF_InputService *plug, LPNETCHANNEL channel)
-{
- V4Service *v4serv = (V4Service *)plug->priv;
- Bool had_ch;
-
- had_ch = v4serv->V4_RemoveChannel(v4serv, channel);
- gf_term_on_disconnect(v4serv->GetService(), channel, had_ch ? GF_OK : GF_STREAM_NOT_FOUND);
- return GF_OK;
-}
-
-static GF_Err V4_ServiceCommand(GF_InputService *plug, GF_NetworkCommand *com)
-{
- V4Service *v4serv = (V4Service *)plug->priv;
- V4Channel *v4c;
-
- if (!com->base.on_channel) return GF_OK;
-
- v4c = v4serv->V4_GetChannel(v4serv, com->base.on_channel);
- if (!v4c) return GF_STREAM_NOT_FOUND;
-
- switch (com->command_type) {
- case GF_NET_CHAN_SET_PULL: return GF_OK;
- case GF_NET_CHAN_INTERACTIVE: return GF_OK;
- case GF_NET_CHAN_SET_PADDING: return GF_NOT_SUPPORTED;
- case GF_NET_CHAN_BUFFER:
- com->buffer.max = com->buffer.min = 0;
- return GF_OK;
- case GF_NET_CHAN_DURATION:
- /*this is not made for updates, use undefined duration*/
- com->duration.duration = 0;
- return GF_OK;
- case GF_NET_CHAN_PLAY:
- v4c->start = (u32) (1000 * com->play.start_range);
- v4c->end = (u32) (1000 * com->play.end_range);
- return GF_OK;
- case GF_NET_CHAN_STOP:
- return GF_OK;
- case GF_NET_CHAN_CONFIG: return GF_OK;
- case GF_NET_CHAN_GET_DSI:
- com->get_dsi.dsi = NULL;
- com->get_dsi.dsi_len = 0;
- return GF_OK;
- }
- return GF_OK;
-}
-
-static GF_Err V4_ChannelGetSLP(GF_InputService *plug, LPNETCHANNEL channel, char **out_data_ptr, u32 *out_data_size, GF_SLHeader *out_sl_hdr, Bool *sl_compressed, GF_Err *out_reception_status, Bool *is_new_data)
-{
- V4Channel *v4c;
- V4Service *v4serv = (V4Service *)plug->priv;
- v4c = v4serv->V4_GetChannel(v4serv, channel);
- if (!v4c) return GF_STREAM_NOT_FOUND;
-
- memset(out_sl_hdr, 0, sizeof(GF_SLHeader));
- out_sl_hdr->compositionTimeStampFlag = 1;
- out_sl_hdr->compositionTimeStamp = v4c->start;
- out_sl_hdr->accessUnitStartFlag = 1;
- *sl_compressed = 0;
- *out_reception_status = GF_OK;
- *is_new_data = 1;
- return GF_OK; return GF_OK;
-}
-
-static GF_Err V4_ChannelReleaseSLP(GF_InputService *plug, LPNETCHANNEL channel)
-{
- return GF_OK;
-}
-
-static Bool V4_CanHandleURLInService(GF_InputService *plug, const char *url)
-{
- return 0;
-}
-
-} // extern "C"
-
-V4Service::V4Service(const char *path)
-{
-
- m_pNetClient = (GF_InputService *)gf_malloc(sizeof(GF_InputService));
- m_pNetClient->priv = this;
-
- m_pNetClient->CanHandleURL = V4_CanHandleURL;
-
- m_pNetClient->ConnectService = V4_ConnectService;
- m_pNetClient->CloseService = V4_CloseService;
-
- m_pNetClient->ConnectChannel = V4_ConnectChannel;
- m_pNetClient->DisconnectChannel = V4_DisconnectChannel;
-
- m_pNetClient->GetServiceDescriptor = V4_GetServiceDesc;
- m_pNetClient->ServiceCommand = V4_ServiceCommand;
-
- m_pNetClient->ChannelGetSLP = V4_ChannelGetSLP;
- m_pNetClient->ChannelReleaseSLP = V4_ChannelReleaseSLP;
-
- m_pNetClient->CanHandleURLInService = V4_CanHandleURLInService;
-
- channels = gf_list_new();
- if (path) m_path = gf_strdup(path);
-}
-
-V4Service::~V4Service()
-{
- if (m_path) gf_free(m_path);
- gf_list_del(channels);
- gf_free(m_pNetClient);
-}
+++ /dev/null
-#include "safe_include.h"
-#include <gpac/modules/service.h>
-
-typedef struct
-{
- u32 ESID;
- LPNETCHANNEL ch;
- u32 start, end;
-} V4Channel;
-
-
-class V4Service {
-public:
-
- V4Service(const char*path);
- ~V4Service();
-
- void SetService(GF_ClientService *s) { m_pService = s; }
- GF_ClientService *GetService() { return m_pService; }
-
- void SetPath(char *path) { m_path = path; }
- char *GetPath() { return m_path; }
-
- GF_List* GetChannels() { return channels; }
- V4Channel *V4_GetChannel(V4Service *v4service, LPNETCHANNEL ch);
- Bool V4_RemoveChannel(V4Service *v4service, LPNETCHANNEL ch);
-
- GF_InputService *GetServiceInterface() { return m_pNetClient; }
-
-protected:
-
- /* the interface given to the GPAC Core */
- GF_InputService *m_pNetClient;
-
- /* The actual GPAC Core service returned by the interface */
- GF_ClientService *m_pService;
- /* All the channels of the current service */
- GF_List *channels;
-
- /* The path to the currently load file */
- char *m_path;
-};
\ No newline at end of file
+++ /dev/null
-#include "safe_include.h"
-
-#include "wx/wxprec.h"
-
-#ifndef WX_PRECOMP
- #include "wx/wx.h"
-#endif
-
-#include "V4StudioApp.h"
-#include "V4StudioFrame.h"
-#include <wx/image.h>
-//#include <wx/xrc/xmlres.h>
-
-IMPLEMENT_APP(V4StudioApp)
-
-bool V4StudioApp::OnInit()
-{
- wxFrame *frame = new V4StudioFrame();
- frame->Show(TRUE);
- SetTopWindow(frame);
- return true;
-}
-
+++ /dev/null
-#ifndef _V4STUDIO_APP_H
-#define _V4STUDIO_APP_H
-
-class V4StudioApp : public wxApp
-{
-public:
- virtual bool OnInit();
-protected:
-private:
-};
-
-DECLARE_APP(V4StudioApp)
-
-#endif
-
+++ /dev/null
-#include "safe_include.h"
-
-#include "wx/wxprec.h"
-
-#ifndef WX_PRECOMP
- #include "wx/wx.h"
-#endif
-
-#include "V4StudioFrame.h"
-#include "wx/xrc/xmlres.h"
-
-
-#include <gpac/internal/scenegraph_dev.h>
-#include <gpac/internal/terminal_dev.h> // GF_Terminal
-#include <gpac/nodes_mpeg4.h>
-
-V4StudioFrame::V4StudioFrame():
- wxFrame((wxFrame *) NULL, -1, "V4Studio", wxPoint(50, 50), wxSize(800, 700))
-{
-
- m_pV4sm = NULL;
-
- m_selection = NULL;
- m_parentSelection = NULL;
- m_clipboardNode = NULL;
-
- m_frame = 0; // we start at frame=0
- editDict = false;
-
- // Creates components and places them on the form
- fieldView = new V4FieldList(this, wxSize(100,250));
- treeView = new V4StudioTree(this, wxSize(100,250), fieldView);
- timeLine = new V4TimeLine(this);
- timeLine->SetSize(500, 100);
- cmdPanel = new V4CommandPanel(this);
- cmdPanel->SetSize(100, 100);
-
- /*new m_pFileMenu bar*/
- wxMenuBar *b = new wxMenuBar();
- /*file*/
- m_pFileMenu = new wxMenu();
- m_pFileMenu->Append(MENU_FILE_NEW, "&New\tCtrl+N", "Create a new document");
- m_pFileMenu->Append(MENU_FILE_OPEN, "&Open...\tCtrl+O", "Open an existing document");
- m_pFileMenu->Append(MENU_FILE_SAVE, "&Save\tCtrl+S", "Save the active document");
- m_pFileMenu->Append(MENU_FILE_CLOSE, "&Close\tCtrl+X", "Close the active document");
- m_pFileMenu->AppendSeparator();
- m_pFileMenu->Append(CHANGE_SIZE_DIALOG, "&Size\tCtrl+Z", "Change scene size");
- m_pFileMenu->Append(CHANGE_FRAMERATE, "&FrameRate\tCtrl+F", "Change FrameRate");
- m_pFileMenu->Append(CHANGE_LENGTH, "&Length\tCtrl+L", "Change Length");
- m_pFileMenu->AppendSeparator();
- m_pFileMenu->Append(MENU_FILE_QUIT, "E&xit", "Quit the application; prompts to save documents");
- b->Append(m_pFileMenu, "&File");
- SetMenuBar(b);
-
- /*file*/
- m_pToolsMenu = new wxMenu();
- m_pToolsMenu->Append(MENU_TOOL_SHOW_LOWLEVEL, "&Low-Level\tCtrl+L", "Shows the low-level toolbar");
- m_pToolsMenu->Append(MENU_TOOL_SHOW_HIGHLEVEL, "&High-Level\tCtrl+H", "Shows the high-level toolbar");
- b->Append(m_pToolsMenu, "&Tools");
- SetMenuBar(b);
-
- m_pStatusbar = CreateStatusBar();
-
- // Main Toolbar
- m_pMainToolbar = new wxToolBar(this, -1, wxDefaultPosition, wxDefaultSize, wxTB_HORIZONTAL|wxTB_FLAT);
- m_pMainToolbar->AddTool(TOOL_FILE_NEW, _("New"), wxBitmap (wxT("rc\\new.bmp"), wxBITMAP_TYPE_ANY), wxNullBitmap, wxITEM_NORMAL, _("Open a new file"), wxT(""));
- m_pMainToolbar->AddTool(TOOL_FILE_OPEN, _("Open"), wxBitmap (wxT("rc\\open.bmp"), wxBITMAP_TYPE_ANY), wxNullBitmap, wxITEM_NORMAL, _("Open an existing file (BT/XMT/MP4)"), wxT(""));
- m_pMainToolbar->AddTool(TOOL_FILE_SAVE, _("Save"), wxBitmap (wxT("rc\\save.bmp"), wxBITMAP_TYPE_ANY), wxNullBitmap, wxITEM_NORMAL, _("Save to a file"), wxT(""));
- m_pMainToolbar->AddTool(TOOL_FILE_CLOSE, _("Close"), wxBitmap (wxT("rc\\close.bmp"), wxBITMAP_TYPE_ANY), wxNullBitmap, wxITEM_NORMAL, _("Close the file"), wxT(""));
- m_pMainToolbar->AddSeparator();
- m_pMainToolbar->AddTool(TOOL_FILE_PREVIEW, _("Preview"), wxBitmap (wxT("rc\\preview.bmp"), wxBITMAP_TYPE_ANY), wxNullBitmap, wxITEM_NORMAL, _("Preview in player"), wxT(""));
- m_pMainToolbar->AddSeparator();
- m_pMainToolbar->AddTool(TOOL_EDIT_CUT, _("Cut"), wxBitmap (wxT("rc\\cut.bmp"), wxBITMAP_TYPE_ANY), wxNullBitmap, wxITEM_NORMAL, _("Cut"), wxT(""));
- m_pMainToolbar->AddTool(TOOL_EDIT_COPY, _("Copy"), wxBitmap (wxT("rc\\copy.bmp"), wxBITMAP_TYPE_ANY), wxNullBitmap, wxITEM_NORMAL, _("Copy"), wxT(""));
- m_pMainToolbar->AddTool(TOOL_EDIT_PASTE, _("Paste"), wxBitmap (wxT("rc\\paste.bmp"), wxBITMAP_TYPE_ANY), wxNullBitmap, wxITEM_NORMAL, _("Paste"), wxT(""));
- m_pMainToolbar->AddTool(TOOL_EDIT_PASTE_USE, _("PastePlus"), wxBitmap (wxT("rc\\paste_use.bmp"), wxBITMAP_TYPE_ANY), wxNullBitmap, wxITEM_NORMAL, _("Paste a USE"), wxT(""));
- m_pMainToolbar->AddTool(TOOL_EDIT_DELETE, _("Delete"), wxBitmap (wxT("rc\\delete.bmp"), wxBITMAP_TYPE_ANY), wxNullBitmap, wxITEM_NORMAL, _("Delete"), wxT(""));
- m_pMainToolbar->AddSeparator();
- m_pMainToolbar->AddTool(TOOL_EDIT_UNDO, _("Undo"), wxBitmap (wxT("rc\\undo.bmp"), wxBITMAP_TYPE_ANY), wxNullBitmap, wxITEM_NORMAL, _("Undo"), wxT(""));
- m_pMainToolbar->AddTool(TOOL_EDIT_REDO, _("Redo"), wxBitmap (wxT("rc\\redo.bmp"), wxBITMAP_TYPE_ANY), wxNullBitmap, wxITEM_NORMAL, _("Redo"), wxT(""));
- m_pMainToolbar->AddSeparator();
-
- m_pMainToolbar->AddSeparator();
-
- m_pMainToolbar->AddTool(TOOL_ADD_TO_TL, _("AddToTL"), wxBitmap( wxT("rc\\paste.bmp"), wxBITMAP_TYPE_ANY), wxNullBitmap, wxITEM_NORMAL, _("Add to timeLine"), wxT(""));
- m_pMainToolbar->AddTool(TOOL_NEXT_FRAME, _("NextFrame"), wxBitmap( wxT("rc\\redo.bmp"), wxBITMAP_TYPE_ANY), wxNullBitmap, wxITEM_NORMAL, _("Next frame"), wxT(""));
- m_pMainToolbar->AddTool(TOOL_VIEW_DICT, _("ViewDict"), wxBitmap( wxT("rc\\open.bmp"), wxBITMAP_TYPE_ANY), wxNullBitmap, wxITEM_NORMAL, _("View Dictionnary"), wxT(""));
-
- /* Not Implemented yet */
- m_pMainToolbar->EnableTool(TOOL_FILE_PREVIEW, false);
- m_pMainToolbar->EnableTool(TOOL_EDIT_UNDO, false);
- m_pMainToolbar->EnableTool(TOOL_EDIT_REDO, false);
- m_pMainToolbar->EnableTool(TOOL_NEXT_FRAME, false);
-
- /* Not available when starting V4Studio */
- /* Nothing to save */
- m_pFileMenu->Enable(MENU_FILE_SAVE, false);
- m_pFileMenu->Enable(MENU_FILE_CLOSE, false);
- m_pFileMenu->Enable(CHANGE_SIZE_DIALOG, false);
- m_pFileMenu->Enable(CHANGE_LENGTH, false);
- m_pFileMenu->Enable(CHANGE_FRAMERATE, false);
- m_pMainToolbar->EnableTool(TOOL_FILE_SAVE, false);
- m_pMainToolbar->EnableTool(TOOL_FILE_CLOSE, false);
-
- /* Nothing to edit */
- m_pMainToolbar->EnableTool(TOOL_EDIT_CUT, false);
- m_pMainToolbar->EnableTool(TOOL_EDIT_COPY, false);
- m_pMainToolbar->EnableTool(TOOL_EDIT_PASTE, false);
- m_pMainToolbar->EnableTool(TOOL_EDIT_PASTE_USE, false);
- m_pMainToolbar->EnableTool(TOOL_EDIT_DELETE, false);
-
- m_pMainToolbar->EnableTool(TOOL_ADD_TO_TL, false);
- m_pMainToolbar->EnableTool(TOOL_VIEW_DICT, false);
- m_pMainToolbar->Realize();
- SetToolBar(m_pMainToolbar);
-
- m_uSelectedNodeToolBar = 0;
- // Node Creation Toolbar
- m_pLowLevelNodeToolbar = new wxToolBar(this, -1, wxDefaultPosition, wxDefaultSize, wxTB_VERTICAL|wxTB_FLAT);
- m_pLowLevelNodeToolbar->AddTool(TOOL_NEW_ORDEREDGROUP, _("OrderedGroup"), wxBitmap (wxT("rc\\orderedgroup.bmp"), wxBITMAP_TYPE_ANY), wxNullBitmap, wxITEM_NORMAL, _("Create an OrderedGroup"), wxT(""));
- m_pLowLevelNodeToolbar->AddTool(TOOL_NEW_LAYER2D, _("Layer2D"), wxBitmap (wxT("rc\\layer2d.bmp"), wxBITMAP_TYPE_ANY), wxNullBitmap, wxITEM_NORMAL, _("Create a Layer2D"), wxT(""));
- m_pLowLevelNodeToolbar->AddTool(TOOL_NEW_TRANSFORM2D, _("Transform2D"), wxBitmap (wxT("rc\\t2d.bmp"), wxBITMAP_TYPE_ANY), wxNullBitmap, wxITEM_NORMAL, _("Create a Tranform2D"), wxT(""));
- m_pLowLevelNodeToolbar->AddTool(TOOL_NEW_TRANSFORMMATRIX2D, _("TransformMatrix2D"), wxBitmap (wxT("rc\\tm2d.bmp"), wxBITMAP_TYPE_ANY), wxNullBitmap, wxITEM_NORMAL, _("Create a TranformMatrix2D"), wxT(""));
- m_pLowLevelNodeToolbar->AddTool(TOOL_NEW_COLOR_TRANSFORM, _("ColorTransform"), wxBitmap (wxT("rc\\colortransform.bmp"), wxBITMAP_TYPE_ANY), wxNullBitmap, wxITEM_NORMAL, _("Create a ColorTransform"), wxT(""));
- m_pLowLevelNodeToolbar->AddTool(TOOL_NEW_SHAPE, _("Shape"), wxBitmap (wxT("rc\\shape.bmp"), wxBITMAP_TYPE_ANY), wxNullBitmap, wxITEM_NORMAL, _("Create a Shape"), wxT(""));
- m_pLowLevelNodeToolbar->AddSeparator();
- m_pLowLevelNodeToolbar->AddTool(TOOL_NEW_APPEARANCE, _("Appearance"), wxBitmap (wxT("rc\\appearance.bmp"), wxBITMAP_TYPE_ANY), wxNullBitmap, wxITEM_NORMAL, _("Create an Appearance"), wxT(""));
- m_pLowLevelNodeToolbar->AddTool(TOOL_NEW_MATERIAL2D, _("Material2D"), wxBitmap (wxT("rc\\material2d.bmp"), wxBITMAP_TYPE_ANY), wxNullBitmap, wxITEM_NORMAL, _("Create a Material2D"), wxT(""));
- m_pLowLevelNodeToolbar->AddTool(TOOL_NEW_LINEPROPS, _("LineProps"), wxBitmap (wxT("rc\\lineproperties.bmp"), wxBITMAP_TYPE_ANY), wxNullBitmap, wxITEM_NORMAL, _("Create a LineProperties"), wxT(""));
- m_pLowLevelNodeToolbar->AddTool(TOOL_NEW_LINEAR_GRADIENT, _("LinearGradient"), wxBitmap (wxT("rc\\lg.bmp"), wxBITMAP_TYPE_ANY), wxNullBitmap, wxITEM_NORMAL, _("Create a Linear Gradient"), wxT(""));
- m_pLowLevelNodeToolbar->AddTool(TOOL_NEW_RADIAL_GRADIENT, _("RadialGradient"), wxBitmap (wxT("rc\\rg.bmp"), wxBITMAP_TYPE_ANY), wxNullBitmap, wxITEM_NORMAL, _("Create a Radial Gradient"), wxT(""));
- m_pLowLevelNodeToolbar->AddSeparator();
- m_pLowLevelNodeToolbar->AddTool(TOOL_NEW_RECT, _("Rectangle"), wxBitmap (wxT("rc\\rect.bmp"), wxBITMAP_TYPE_ANY), wxNullBitmap, wxITEM_NORMAL, _("Create a Rectangle"), wxT(""));
- m_pLowLevelNodeToolbar->AddTool(TOOL_NEW_CIRCLE, _("Circle"), wxBitmap (wxT("rc\\circle.bmp"), wxBITMAP_TYPE_ANY), wxNullBitmap, wxITEM_NORMAL, _("Create a Rectangle"), wxT(""));
- m_pLowLevelNodeToolbar->AddTool(TOOL_NEW_IFS2D, _("IndexedFaceSet2D"), wxBitmap (wxT("rc\\ifs2d.bmp"), wxBITMAP_TYPE_ANY), wxNullBitmap, wxITEM_NORMAL, _("Create an IndexedFaceSet2D"), wxT(""));
- m_pLowLevelNodeToolbar->AddTool(TOOL_NEW_ILS2D, _("IndexedLineSet2D"), wxBitmap (wxT("rc\\ils2d.bmp"), wxBITMAP_TYPE_ANY), wxNullBitmap, wxITEM_NORMAL, _("Create an IndexedLineSet2D"), wxT(""));
- m_pLowLevelNodeToolbar->AddTool(TOOL_NEW_XLINEPROPS, _("XLineProps"), wxBitmap (wxT("rc\\xlineproperties.bmp"), wxBITMAP_TYPE_ANY), wxNullBitmap, wxITEM_NORMAL, _("Create an XLineProperties"), wxT(""));
- m_pLowLevelNodeToolbar->AddSeparator();
- m_pLowLevelNodeToolbar->AddTool(TOOL_NEW_TEXT, _("Text"), wxBitmap (wxT("rc\\text.bmp"), wxBITMAP_TYPE_ANY), wxNullBitmap, wxITEM_NORMAL, _("Create a Text"), wxT(""));
- m_pLowLevelNodeToolbar->AddTool(TOOL_NEW_FONTSTYLE, _("FontStyle"), wxBitmap (wxT("rc\\fs.bmp"), wxBITMAP_TYPE_ANY), wxNullBitmap, wxITEM_NORMAL, _("Create a FontStyle"), wxT(""));
- m_pLowLevelNodeToolbar->AddSeparator();
- m_pLowLevelNodeToolbar->AddTool(TOOL_NEW_BACKGROUND2D, _("Background2D"), wxBitmap (wxT("rc\\image.bmp"), wxBITMAP_TYPE_ANY), wxNullBitmap, wxITEM_NORMAL, _("Add a Background2D"), wxT(""));
- m_pLowLevelNodeToolbar->AddTool(TOOL_NEW_MOVIE, _("Movie"), wxBitmap (wxT("rc\\movie.bmp"), wxBITMAP_TYPE_ANY), wxNullBitmap, wxITEM_NORMAL, _("Add a Movie"), wxT(""));
- m_pLowLevelNodeToolbar->AddTool(TOOL_NEW_IMAGE, _("Image"), wxBitmap (wxT("rc\\image.bmp"), wxBITMAP_TYPE_ANY), wxNullBitmap, wxITEM_NORMAL, _("Add an Image"), wxT(""));
- m_pLowLevelNodeToolbar->AddTool(TOOL_NEW_SOUND, _("Sound"), wxBitmap (wxT("rc\\sound.bmp"), wxBITMAP_TYPE_ANY), wxNullBitmap, wxITEM_NORMAL, _("Add a Sound"), wxT(""));
- m_pLowLevelNodeToolbar->Realize();
-
-/*
- m_pHighLevelNodeToolbar = new wxToolBar(this, -1, wxDefaultPosition, wxDefaultSize, wxTB_VERTICAL|wxTB_FLAT);
- m_pHighLevelNodeToolbar->AddTool(TOOL_NEW_2DSCENE, _("OrderedGroup"), wxBitmap (wxT("rc\\orderedgroup.bmp"), wxBITMAP_TYPE_ANY), wxNullBitmap, wxITEM_NORMAL, _("Creates a 2D scene"), wxT(""));
- m_pHighLevelNodeToolbar->Realize();
-*/
- set_properties();
- do_layout();
- UpdateToolBar();
-}
-
-V4StudioFrame::~V4StudioFrame()
-{
-}
-
-
-/* Functions that changes scene parameters */
-
-void V4StudioFrame::OnChangeFrameRate(wxCommandEvent &event) {
- if (!m_pV4sm) return;
-
- u32 l = m_pV4sm->GetFrameRate();
- wxString sFR;
- sFR.Printf("%d", l);
-
- wxTextEntryDialog dialog(this, _T("Enter scene framerate"), _T("one positive integer number"), sFR, wxOK | wxCANCEL);
-
- if (dialog.ShowModal() != wxID_OK) {
- dialog.Destroy();
- return;
- }
-
- sscanf(dialog.GetValue(), "%d", &l);
- m_pV4sm->SetFrameRate(l);
-
- dialog.Destroy();
- SceneGraphChanged();
-}
-
-
-void V4StudioFrame::OnChangeLength(wxCommandEvent &event) {
- if (!m_pV4sm) return;
- u32 l = m_pV4sm->GetLength();
- wxString sLength;
- sLength.Printf("%d", l);
-
- wxTextEntryDialog dialog(this, _T("Enter scene length"), _T("one positive integer number"), sLength, wxOK | wxCANCEL);
-
- if (dialog.ShowModal() != wxID_OK) {
- dialog.Destroy();
- return;
- }
-
- sscanf(dialog.GetValue(), "%d", &l);
- m_pV4sm->SetLength(l);
-
- dialog.Destroy();
- SceneGraphChanged();
-}
-
-void V4StudioFrame::OnChangeSize(wxCommandEvent &event)
-{
- if (!m_pV4sm) return;
- u32 w, h;
- wxSize sceneSize;
- m_pV4sm->GetSceneSize(sceneSize);
- w = sceneSize.GetX();
- h = sceneSize.GetY();
- wxString sSize;
- sSize.Printf("%d %d", w, h);
- wxTextEntryDialog dialog(this,
- _T("Enter the scene width and height"),
- _T("Please enter two integer numbers"),
- sSize,
- wxOK | wxCANCEL);
-
- while (dialog.ShowModal() != wxID_OK && w == 0 && h == 0) {}
- sscanf(dialog.GetValue(), "%d %d", &w, &h);
- m_pV4sm->SetSceneSize(w,h);
- dialog.Destroy();
- SceneGraphChanged();
-}
-
-// Dispatchs the new scene graph to all the sub components who need it.
-void V4StudioFrame::SceneGraphChanged()
-{
- m_parentSelection = NULL;
- m_selection = (!m_pV4sm ? NULL : m_pV4sm->GetRootNode());
- Layout();
- Update();
-}
-
-void V4StudioFrame::set_properties()
-{
- SetTitle(_("V4Studio"));
- wxIcon _icon;
- _icon.CopyFromBitmap(wxBitmap(_("rc\\v4.bmp"), wxBITMAP_TYPE_ANY));
- SetIcon(_icon);
- SetSize(wxSize(500, 500));
-}
-
-
-void V4StudioFrame::do_layout()
-{
- wxBoxSizer * sizer_6 = new wxBoxSizer(wxVERTICAL); // top = treeview + fieldview; bottom = timeline + command panel
- wxBoxSizer * sizer_7 = new wxBoxSizer(wxHORIZONTAL); // right = timeline, left = command panel
- wxBoxSizer * sizer_8 = new wxBoxSizer(wxHORIZONTAL); // right = treeview; left = fieldview
-
- sizer_6->Add(sizer_8, 2, wxEXPAND, 0); // height of treeview twice bigger thant height of timeline
- sizer_6->Add(sizer_7, 1, wxEXPAND, 0);
-
- sizer_7->Add(timeLine, 3, wxEXPAND, 0);
- sizer_7->Add(cmdPanel, 1, wxEXPAND, 0);
-
- sizer_8->Add(treeView, 1, wxEXPAND, 0);
- sizer_8->Add(fieldView, 1, wxEXPAND, 0);
-
- wxBoxSizer* sizer_9 = new wxBoxSizer(wxHORIZONTAL);
-
- sizer_9->Add(m_pLowLevelNodeToolbar, 0, wxEXPAND, 0);
-/*
- if (m_uSelectedNodeToolBar == 0) sizer_9->Add(m_pLowLevelNodeToolbar, 0, wxEXPAND, 0);
- else sizer_9->Add(m_pHighLevelNodeToolbar, 0, wxEXPAND, 0);
-*/
-
- sizer_9->Add(sizer_6, 1, wxEXPAND, 0);
-
- SetSizer(sizer_9);
- Layout();
-
- cmdPanel->Layout();
-}
-
-
-BEGIN_EVENT_TABLE(V4StudioFrame, wxFrame)
- // m_pFileMenu events
- EVT_MENU(MENU_FILE_NEW, V4StudioFrame::OnNew)
- EVT_MENU(MENU_FILE_OPEN, V4StudioFrame::OnFileOpen)
- EVT_MENU(MENU_FILE_SAVE, V4StudioFrame::OnSave)
- EVT_MENU(MENU_FILE_CLOSE, V4StudioFrame::OnClose)
- EVT_MENU(MENU_FILE_QUIT, V4StudioFrame::OnQuit)
- EVT_MENU(CHANGE_SIZE_DIALOG, V4StudioFrame::OnChangeSize)
- EVT_MENU(CHANGE_FRAMERATE, V4StudioFrame::OnChangeFrameRate)
- EVT_MENU(CHANGE_LENGTH, V4StudioFrame::OnChangeLength)
-
- // m_pToolsMenu events
- EVT_MENU(MENU_TOOL_SHOW_LOWLEVEL, V4StudioFrame::OnLowLevelTools)
- EVT_MENU(MENU_TOOL_SHOW_HIGHLEVEL, V4StudioFrame::OnHighLevelTools)
-
- // edit toolbar events
- EVT_TOOL(TOOL_FILE_NEW, V4StudioFrame::OnNew)
- EVT_TOOL(TOOL_FILE_OPEN, V4StudioFrame::OnFileOpen)
- EVT_TOOL(TOOL_FILE_SAVE, V4StudioFrame::OnSave)
- EVT_TOOL(TOOL_FILE_CLOSE, V4StudioFrame::OnClose)
- EVT_TOOL(TOOL_EDIT_CUT, V4StudioFrame::OnEditCut)
- EVT_TOOL(TOOL_EDIT_COPY, V4StudioFrame::OnEditCopy)
- EVT_TOOL(TOOL_EDIT_PASTE, V4StudioFrame::OnEditPaste)
- EVT_TOOL(TOOL_EDIT_PASTE_USE, V4StudioFrame::OnEditPasteUse)
- EVT_TOOL(TOOL_EDIT_DELETE, V4StudioFrame::OnEditDelete)
- EVT_TOOL(TOOL_ADD_TO_TL, V4StudioFrame::OnAddToTimeLine)
- EVT_TOOL(TOOL_NEXT_FRAME, V4StudioFrame::NextFrame)
- EVT_TOOL(TOOL_VIEW_DICT, V4StudioFrame::SwitchView)
-
- // new toolbar events
- EVT_TOOL(TOOL_NEW_ORDEREDGROUP, V4StudioFrame::OnNewOrderedGroup)
- EVT_TOOL(TOOL_NEW_LAYER2D, V4StudioFrame::OnNewLayer2D)
- EVT_TOOL(TOOL_NEW_TRANSFORM2D, V4StudioFrame::OnNewTransform2D)
- EVT_TOOL(TOOL_NEW_TRANSFORMMATRIX2D, V4StudioFrame::OnNewTransformMatrix2D)
- EVT_TOOL(TOOL_NEW_COLOR_TRANSFORM, V4StudioFrame::OnNewColorTransform)
- EVT_TOOL(TOOL_NEW_SHAPE, V4StudioFrame::OnNewShape)
- EVT_TOOL(TOOL_NEW_APPEARANCE, V4StudioFrame::OnNewAppearance)
- EVT_TOOL(TOOL_NEW_LINEAR_GRADIENT, V4StudioFrame::OnNewLinearGradient)
- EVT_TOOL(TOOL_NEW_RADIAL_GRADIENT, V4StudioFrame::OnNewRadialGradient)
- EVT_TOOL(TOOL_NEW_MATERIAL2D, V4StudioFrame::OnNewMaterial2D)
- EVT_TOOL(TOOL_NEW_LINEPROPS, V4StudioFrame::OnNewLineProps)
- EVT_TOOL(TOOL_NEW_XLINEPROPS, V4StudioFrame::OnNewXLineProps)
- EVT_TOOL(TOOL_NEW_RECT, V4StudioFrame::OnNewRect)
- EVT_TOOL(TOOL_NEW_CIRCLE, V4StudioFrame::OnNewCircle)
- EVT_TOOL(TOOL_NEW_TEXT, V4StudioFrame::OnNewText)
- EVT_TOOL(TOOL_NEW_FONTSTYLE, V4StudioFrame::OnNewFontStyle)
- EVT_TOOL(TOOL_NEW_SOUND, V4StudioFrame::OnNewSound)
- EVT_TOOL(TOOL_NEW_BACKGROUND2D, V4StudioFrame::OnNewBackground2D)
- EVT_TOOL(TOOL_NEW_IMAGE, V4StudioFrame::OnNewImageTexture)
- EVT_TOOL(TOOL_NEW_MOVIE, V4StudioFrame::OnNewMovieTexture)
-END_EVENT_TABLE()
-
-// Creates New Scene
-void V4StudioFrame::OnNew(wxCommandEvent &event)
-{
- m_pV4sm = new V4SceneManager(this);
- m_pV4sm->LoadNew();
-
- m_pMainToolbar->EnableTool(TOOL_ADD_TO_TL, true);
- m_pMainToolbar->EnableTool(TOOL_VIEW_DICT, true);
- m_pMainToolbar->EnableTool(TOOL_FILE_SAVE, true);
- m_pFileMenu->Enable(MENU_FILE_SAVE, true);
- m_pMainToolbar->EnableTool(TOOL_FILE_CLOSE, true);
- m_pFileMenu->Enable(MENU_FILE_CLOSE, true);
- m_pMainToolbar->EnableTool(TOOL_FILE_OPEN, false);
- m_pFileMenu->Enable(MENU_FILE_OPEN, false);
- m_pMainToolbar->EnableTool(TOOL_FILE_NEW, false);
- m_pFileMenu->Enable(MENU_FILE_NEW, false);
- m_pFileMenu->Enable(CHANGE_SIZE_DIALOG, true);
- m_pFileMenu->Enable(CHANGE_LENGTH, true);
- m_pFileMenu->Enable(CHANGE_FRAMERATE, true);
-
- Layout();
- SetStatusText("New scene", 0);
- SceneGraphChanged();
-
- OnChangeSize(event);
-}
-
-// Opens an existing file
-void V4StudioFrame::OnFileOpen(wxCommandEvent &event)
-{
- wxFileDialog *dlg = new wxFileDialog(this, "Open a bt scene",
- "", "", "BT Files (*.bt)|*.bt|MP4 Files (*.mp4)|*.mp4|XMT Files (*.xmt)|*.xmt|SWF Files (*.swf)|*.swf|All files (*.*)|*.*",
- wxOPEN, wxDefaultPosition);
- if ( dlg->ShowModal() == wxID_OK ) {
- if (m_pV4sm) delete m_pV4sm;
- m_pV4sm = new V4SceneManager(this);
- m_pV4sm->LoadFile(dlg->GetPath().c_str());
-
- m_pMainToolbar->EnableTool(TOOL_ADD_TO_TL, true);
- m_pMainToolbar->EnableTool(TOOL_VIEW_DICT, true);
- m_pMainToolbar->EnableTool(TOOL_FILE_SAVE, true);
- m_pFileMenu->Enable(MENU_FILE_SAVE, true);
- m_pMainToolbar->EnableTool(TOOL_FILE_CLOSE, true);
- m_pFileMenu->Enable(MENU_FILE_CLOSE, true);
- m_pMainToolbar->EnableTool(TOOL_FILE_OPEN, false);
- m_pFileMenu->Enable(MENU_FILE_OPEN, false);
- m_pMainToolbar->EnableTool(TOOL_FILE_NEW, false);
- m_pFileMenu->Enable(MENU_FILE_NEW, true);
- m_pFileMenu->Enable(CHANGE_SIZE_DIALOG, true);
- m_pFileMenu->Enable(CHANGE_LENGTH, true);
- m_pFileMenu->Enable(CHANGE_FRAMERATE, true);
-
- Layout();
- SetStatusText(dlg->GetFilename(), 0);
- SceneGraphChanged();
- }
- dlg->Destroy();
-}
-
-void V4StudioFrame::OnSave(wxCommandEvent &event)
-{
- if (!m_pV4sm) return;
- wxFileDialog *dlg = new wxFileDialog(this, "Save the scene to an mp4 file",
- "", "", "MPEG-4 Files (*.mp4)|*.mp4|All files (*.*)|*.*",
- wxSAVE, wxDefaultPosition);
- if ( dlg->ShowModal() == wxID_OK )
- {
- m_pV4sm->SaveFile(dlg->GetPath().c_str());
- SetStatusText(dlg->GetFilename(), 0);
- }
- dlg->Destroy();
-}
-
-void V4StudioFrame::OnClose(wxCommandEvent &event)
-{
- if (m_pV4sm) delete m_pV4sm;
- m_pV4sm = NULL;
-
- m_pMainToolbar->EnableTool(TOOL_ADD_TO_TL, false);
- m_pMainToolbar->EnableTool(TOOL_VIEW_DICT, false);
- m_pMainToolbar->EnableTool(TOOL_FILE_SAVE, false);
- m_pFileMenu->Enable(MENU_FILE_SAVE, false);
- m_pMainToolbar->EnableTool(TOOL_FILE_CLOSE, false);
- m_pFileMenu->Enable(MENU_FILE_CLOSE, false);
- m_pMainToolbar->EnableTool(TOOL_FILE_OPEN, true);
- m_pFileMenu->Enable(MENU_FILE_OPEN, true);
- m_pMainToolbar->EnableTool(TOOL_FILE_NEW, true);
- m_pFileMenu->Enable(MENU_FILE_NEW, true);
- m_pFileMenu->Enable(CHANGE_SIZE_DIALOG, false);
- m_pFileMenu->Enable(CHANGE_LENGTH, false);
- m_pFileMenu->Enable(CHANGE_FRAMERATE, false);
-
- m_clipboardNode = NULL;
- m_clipboardParentNode = NULL;
- m_pMainToolbar->EnableTool(TOOL_EDIT_CUT, false);
- m_pMainToolbar->EnableTool(TOOL_EDIT_COPY, false);
- m_pMainToolbar->EnableTool(TOOL_EDIT_PASTE, false);
- m_pMainToolbar->EnableTool(TOOL_EDIT_PASTE_USE, false);
- m_pMainToolbar->EnableTool(TOOL_EDIT_DELETE, false);
- Layout();
- SceneGraphChanged();
-}
-
-// Quits application
-// TODO : memory leaks !
-void V4StudioFrame::OnQuit(wxCommandEvent &event)
-{
- Close(FALSE);
-}
-
-/**********************************************/
-/* Tools Menu methods */
-/**********************************************/
-void V4StudioFrame::OnLowLevelTools(wxCommandEvent &event)
-{
- m_uSelectedNodeToolBar = 0;
- do_layout();
-}
-
-void V4StudioFrame::OnHighLevelTools(wxCommandEvent &event)
-{
- m_uSelectedNodeToolBar = 1;
- do_layout();
-}
-
-/**********************************************/
-/* Functions to add components to the scene */
-/**********************************************/
-void V4StudioFrame::OnNewOrderedGroup(wxCommandEvent &event)
-{
- if (!m_pV4sm) return;
- GF_Node *top = m_pV4sm->GetRootNode();
- if (!top) {
- top = m_pV4sm->SetTopNode(TAG_MPEG4_OrderedGroup);
- m_selection = top;
- m_parentSelection = NULL;
- } else {
- GF_Node *og = m_pV4sm->NewNode(TAG_MPEG4_OrderedGroup);
- gf_node_insert_child(m_selection, og, -1);
- gf_node_register(og, m_selection);
- m_parentSelection = m_selection;
- m_selection = og;
- }
- Update();
-}
-
-void V4StudioFrame::OnNewLayer2D(wxCommandEvent &event)
-{
- if (!m_pV4sm) return;
- GF_Node *top = m_pV4sm->GetRootNode();
- if (!top) {
- top = m_pV4sm->SetTopNode(TAG_MPEG4_Layer2D);
- m_selection = top;
- m_parentSelection = NULL;
- } else {
- GF_Node *l2d = m_pV4sm->NewNode(TAG_MPEG4_Layer2D);
- gf_node_insert_child(m_selection, l2d, -1);
- gf_node_register(l2d, m_selection);
- m_parentSelection = m_selection;
- m_selection = l2d;
- }
- Update();
-}
-
-void V4StudioFrame::OnNewText(wxCommandEvent &event)
-{
- if (!m_pV4sm) return;
- GF_Node *text = m_pV4sm->NewNode(TAG_MPEG4_Text);
- M_Shape *shape = (M_Shape *)m_selection;
- shape->geometry = text;
- gf_node_register(text, m_selection);
- m_parentSelection = m_selection;
- m_selection = text;
- Update();
-}
-
-void V4StudioFrame::OnNewFontStyle(wxCommandEvent &event)
-{
- if (!m_pV4sm) return;
- GF_Node *fs = m_pV4sm->NewNode(TAG_MPEG4_FontStyle);
- M_Text *text = (M_Text *)m_selection;
- text->fontStyle = fs;
- gf_node_register(fs, m_selection);
- m_selection = fs;
- m_parentSelection = (GF_Node *)text;
- Update();
-}
-
-void V4StudioFrame::OnNewRect(wxCommandEvent &event)
-{
- if (!m_pV4sm) return;
- GF_Node *rect = m_pV4sm->NewNode(TAG_MPEG4_Rectangle);
- M_Shape *shape = (M_Shape *)m_selection;
- shape->geometry = rect;
- gf_node_register(rect, m_selection);
- m_parentSelection = m_selection;
- m_selection = rect;
- Update();
-}
-
-void V4StudioFrame::OnNewCircle(wxCommandEvent &event)
-{
- if (!m_pV4sm) return;
- GF_Node *circle = m_pV4sm->NewNode(TAG_MPEG4_Circle);
- M_Shape *shape = (M_Shape *)m_selection;
- shape->geometry = circle;
- gf_node_register(circle, m_selection);
- ((M_Circle *) circle)->radius = 75;
- m_parentSelection = m_selection;
- m_selection = circle;
- Update();
-}
-
-void V4StudioFrame::OnNewTransform2D(wxCommandEvent &event)
-{
- if (!m_pV4sm) return;
- GF_Node *t2d = m_pV4sm->NewNode(TAG_MPEG4_Transform2D);
- if (!m_selection) m_selection = m_pV4sm->GetRootNode();
- gf_node_insert_child(m_selection, t2d, -1);
- gf_node_register(t2d, m_selection);
- m_parentSelection = m_selection;
- m_selection = t2d;
- Update();
-}
-
-void V4StudioFrame::OnNewColorTransform(wxCommandEvent &event)
-{
- if (!m_pV4sm) return;
- GF_Node *ct = m_pV4sm->NewNode(TAG_MPEG4_ColorTransform);
- if (!m_selection) m_selection = m_pV4sm->GetRootNode();
- gf_node_insert_child(m_selection, ct, -1);
- gf_node_register(ct, m_selection);
- m_parentSelection = m_selection;
- m_selection = ct;
- Update();
-}
-
-void V4StudioFrame::OnNewTransformMatrix2D(wxCommandEvent &event)
-{
- if (!m_pV4sm) return;
- GF_Node *tm2d = m_pV4sm->NewNode(TAG_MPEG4_TransformMatrix2D);
- if (!m_selection) m_selection = m_pV4sm->GetRootNode();
- gf_node_insert_child(m_selection, tm2d, -1);
- gf_node_register(tm2d, m_selection);
- m_parentSelection = m_selection;
- m_selection = (GF_Node *)tm2d;
- Update();
-}
-
-void V4StudioFrame::OnNewShape(wxCommandEvent &event)
-{
- if (!m_pV4sm) return;
- GF_Node *shape = m_pV4sm->NewNode(TAG_MPEG4_Shape);
- gf_node_insert_child(m_selection, shape, -1);
- gf_node_register( shape, m_selection);
- m_parentSelection = m_selection;
- m_selection = (GF_Node *)shape;
- Update();
-}
-
-void V4StudioFrame::OnNewAppearance(wxCommandEvent &event)
-{
- if (!m_pV4sm) return;
- GF_Node *app = m_pV4sm->NewNode(TAG_MPEG4_Appearance);
- M_Shape *shape = (M_Shape *)m_selection;
- shape->appearance = app;
- gf_node_register(app, m_selection);
- m_parentSelection = m_selection;
- m_selection = app;
- Update();
-}
-
-void V4StudioFrame::OnNewLinearGradient(wxCommandEvent &event)
-{
- if (!m_pV4sm) return;
- GF_Node *lg = m_pV4sm->NewNode(TAG_MPEG4_LinearGradient);
- M_Appearance *app = (M_Appearance *)m_selection;
- app->texture = lg;
- gf_node_register(lg, m_selection);
- m_parentSelection = m_selection;
- m_selection = (GF_Node *)lg;
- Update();
-}
-
-void V4StudioFrame::OnNewRadialGradient(wxCommandEvent &event)
-{
- if (!m_pV4sm) return;
- GF_Node *rg = m_pV4sm->NewNode(TAG_MPEG4_RadialGradient);
- M_Appearance *app = (M_Appearance *)m_selection;
- app->texture = rg;
- gf_node_register(rg, m_selection);
- m_parentSelection = m_selection;
- m_selection = rg;
- Update();
-}
-
-
-void V4StudioFrame::OnNewMaterial2D(wxCommandEvent &event)
-{
- if (!m_pV4sm) return;
- GF_Node *mat2d = m_pV4sm->NewNode(TAG_MPEG4_Material2D);
- M_Appearance *app = (M_Appearance *)m_selection;
- app->material = mat2d;
- gf_node_register(mat2d, m_selection);
- m_parentSelection = m_selection;
-
- m_selection = mat2d;
- Update();
-}
-
-void V4StudioFrame::OnNewLineProps(wxCommandEvent &event)
-{
- if (!m_pV4sm) return;
- GF_Node *lp = m_pV4sm->NewNode(TAG_MPEG4_LineProperties);
- M_Material2D *mat2d= (M_Material2D *)m_selection;
- mat2d->lineProps = lp;
- gf_node_register(lp, m_selection);
- m_parentSelection = m_selection;
- m_selection = lp;
- Update();
-}
-
-void V4StudioFrame::OnNewXLineProps(wxCommandEvent &event)
-{
- if (!m_pV4sm) return;
- GF_Node *lp = m_pV4sm->NewNode(TAG_MPEG4_XLineProperties);
- M_Material2D *mat2d= (M_Material2D *)m_selection;
- mat2d->lineProps = lp;
- gf_node_register(lp, m_selection);
- m_parentSelection = m_selection;
- m_selection = lp;
- Update();
-}
-
-void V4StudioFrame::OnNewSound(wxCommandEvent &event)
-{
-}
-
-void V4StudioFrame::OnNewBackground2D(wxCommandEvent &event)
-{
- if (!m_pV4sm) return;
- GF_Node *b2d = m_pV4sm->NewNode(TAG_MPEG4_Background2D);
- gf_node_insert_child(m_selection, b2d, -1);
- gf_node_register(b2d, m_selection);
- m_parentSelection = m_selection;
- m_selection = b2d;
- Update();
-}
-
-void V4StudioFrame::OnNewImageTexture(wxCommandEvent &event)
-{
- if (!m_pV4sm) return;
- GF_Node *it = m_pV4sm->NewNode(TAG_MPEG4_ImageTexture);
- M_Appearance *app = (M_Appearance *) m_selection;
- app->texture = it;
- gf_node_register(it, m_selection);
- m_parentSelection = m_selection;
- m_selection = it;
- Update();
-}
-
-void V4StudioFrame::OnNewMovieTexture(wxCommandEvent &event)
-{
- if (!m_pV4sm) return;
- GF_Node *mt = m_pV4sm->NewNode(TAG_MPEG4_MovieTexture);
- M_Appearance *app = (M_Appearance *)m_selection;
- app->texture = mt;
- gf_node_register(mt, m_selection);
- m_parentSelection = m_selection;
- m_selection = mt;
- Update();
-}
-
-void V4StudioFrame::UpdateSelection(GF_Node *node, GF_Node *parent)
-{
- SetSelection(node);
- SetParentSelection(parent);
- m_pMainToolbar->EnableTool(TOOL_EDIT_CUT, true);
- m_pMainToolbar->EnableTool(TOOL_EDIT_COPY, true);
- m_pMainToolbar->EnableTool(TOOL_EDIT_DELETE, true);
- UpdateToolBar();
- fieldView->SetNode(node);
- fieldView->Create();
-}
-
-
-// Update display
-void V4StudioFrame::Update()
-{
- if (m_pV4sm){
- if (m_pV4sm->GetGPACPanel()) m_pV4sm->GetGPACPanel()->Update();
- treeView->Refresh(m_pV4sm->GetRootNode());
- } else {
- treeView->Refresh(NULL);
- }
- UpdateToolBar();
-}
-
-void V4StudioFrame::UpdateToolBar()
-{
- bool enableGeometry = false,
- enableAppearance = false,
- enableMaterial = false,
- enableGroupNode = false,
- enableLineProps = false,
- enableFontStyle = false,
- enable2DNode = false,
- enableTexture = false,
- enableTopNode = false,
- enableBackground = false;
-
- // a scene must have been created to enable the controls
- if (m_pV4sm && m_pV4sm->GetInlineScene()) {
- if (m_selection != NULL) {
- u32 tag = gf_node_get_tag(m_selection);
- GF_Node * node = m_selection;
- enableBackground = true;
- switch (tag) {
- case TAG_MPEG4_Switch:
- case TAG_MPEG4_OrderedGroup:
- case TAG_MPEG4_Layer2D:
- case TAG_MPEG4_Transform2D:
- case TAG_MPEG4_TransformMatrix2D:
- case TAG_MPEG4_ColorTransform:
- enableGroupNode = true;
- enable2DNode = true;
- break;
- case TAG_MPEG4_Shape:
- if (!((M_Shape *)node)->geometry) enableGeometry = true;
- if (!((M_Shape *)node)->appearance) enableAppearance = true;
- break;
- case TAG_MPEG4_Appearance:
- if (!((M_Appearance *)node)->material) enableMaterial = true;
- if (!((M_Appearance *)node)->texture) enableTexture = true;
- break;
- case TAG_MPEG4_Material2D:
- if (!((M_Material2D *)node)->lineProps) enableLineProps = true;
- break;
- case TAG_MPEG4_Text:
- if (!((M_Text *)node)->fontStyle) enableFontStyle = true;
- break;
- case TAG_MPEG4_Rectangle:
- case TAG_MPEG4_Circle:
- case TAG_MPEG4_ImageTexture:
- case TAG_MPEG4_MovieTexture:
- case TAG_MPEG4_Background2D:
- break;
- }
- } else {
- enableTopNode = true;
- }
- }
-
- m_pLowLevelNodeToolbar->EnableTool(TOOL_NEW_ORDEREDGROUP, enableGroupNode || enable2DNode || enableTopNode);
- m_pLowLevelNodeToolbar->EnableTool(TOOL_NEW_LAYER2D, enableGroupNode || enable2DNode || enableTopNode);
- m_pLowLevelNodeToolbar->EnableTool(TOOL_NEW_TRANSFORM2D, enableGroupNode || enable2DNode);
- m_pLowLevelNodeToolbar->EnableTool(TOOL_NEW_COLOR_TRANSFORM, enableGroupNode || enable2DNode);
- m_pLowLevelNodeToolbar->EnableTool(TOOL_NEW_TRANSFORMMATRIX2D, enableGroupNode || enable2DNode);
- m_pLowLevelNodeToolbar->EnableTool(TOOL_NEW_SHAPE, enable2DNode);
- m_pLowLevelNodeToolbar->EnableTool(TOOL_NEW_RECT, enableGeometry);
- m_pLowLevelNodeToolbar->EnableTool(TOOL_NEW_CIRCLE, enableGeometry);
- m_pLowLevelNodeToolbar->EnableTool(TOOL_NEW_IFS2D, enableGeometry);
- m_pLowLevelNodeToolbar->EnableTool(TOOL_NEW_ILS2D, enableGeometry);
- m_pLowLevelNodeToolbar->EnableTool(TOOL_NEW_TEXT, enableGeometry);
- m_pLowLevelNodeToolbar->EnableTool(TOOL_NEW_MOVIE, enableTexture);
- m_pLowLevelNodeToolbar->EnableTool(TOOL_NEW_IMAGE, enableTexture);
- m_pLowLevelNodeToolbar->EnableTool(TOOL_NEW_SOUND, enable2DNode);
- m_pLowLevelNodeToolbar->EnableTool(TOOL_NEW_APPEARANCE, enableAppearance);
- m_pLowLevelNodeToolbar->EnableTool(TOOL_NEW_MATERIAL2D, enableMaterial);
- m_pLowLevelNodeToolbar->EnableTool(TOOL_NEW_LINEAR_GRADIENT, enableTexture);
- m_pLowLevelNodeToolbar->EnableTool(TOOL_NEW_RADIAL_GRADIENT, enableTexture);
- m_pLowLevelNodeToolbar->EnableTool(TOOL_NEW_LINEPROPS, enableLineProps);
- m_pLowLevelNodeToolbar->EnableTool(TOOL_NEW_XLINEPROPS, enableLineProps);
- m_pLowLevelNodeToolbar->EnableTool(TOOL_NEW_FONTSTYLE, enableFontStyle);
- m_pLowLevelNodeToolbar->EnableTool(TOOL_NEW_BACKGROUND2D, enableBackground);
-}
-
-// Cut and paste functions
-void V4StudioFrame::OnEditCut(wxCommandEvent &WXUNUSED(event))
-{
- if (!m_selection) return;
-
- m_clipboardNode = m_selection;
- m_clipboardParentNode = m_parentSelection;
- gf_node_remove_child(m_parentSelection, m_selection);
- m_pMainToolbar->EnableTool(TOOL_EDIT_CUT, true);
- m_pMainToolbar->EnableTool(TOOL_EDIT_COPY, true);
- m_pMainToolbar->EnableTool(TOOL_EDIT_PASTE, true);
- m_pMainToolbar->EnableTool(TOOL_EDIT_PASTE_USE, false);
- m_pMainToolbar->EnableTool(TOOL_EDIT_DELETE, false);
-
- Update();
-}
-
-void V4StudioFrame::OnEditDelete(wxCommandEvent &WXUNUSED(event))
-{
- if (!m_selection) return;
-
- gf_node_remove_child(m_parentSelection, m_selection);
- m_clipboardNode = NULL;
- m_clipboardParentNode = NULL;
- m_pMainToolbar->EnableTool(TOOL_EDIT_CUT, false);
- m_pMainToolbar->EnableTool(TOOL_EDIT_COPY, false);
- m_pMainToolbar->EnableTool(TOOL_EDIT_PASTE, false);
- m_pMainToolbar->EnableTool(TOOL_EDIT_PASTE_USE, false);
- m_pMainToolbar->EnableTool(TOOL_EDIT_DELETE, false);
-
- Update();
-}
-
-void V4StudioFrame::OnEditCopy(wxCommandEvent &WXUNUSED(event))
-{
- if (!m_selection) return;
-
- m_clipboardNode = m_selection;
- m_clipboardParentNode = m_parentSelection;
- m_pMainToolbar->EnableTool(TOOL_EDIT_CUT, true);
- m_pMainToolbar->EnableTool(TOOL_EDIT_COPY, true);
- m_pMainToolbar->EnableTool(TOOL_EDIT_PASTE, true);
- m_pMainToolbar->EnableTool(TOOL_EDIT_PASTE_USE, true);
- m_pMainToolbar->EnableTool(TOOL_EDIT_DELETE, false);
-
- Update();
-}
-
-void V4StudioFrame::OnEditPaste(wxCommandEvent &WXUNUSED(event))
-{
- if (!m_pV4sm) return;
- if (m_clipboardNode == NULL) return;
-
- GF_Node *copy = m_pV4sm->CopyNode(m_clipboardNode, m_parentSelection, true);
- gf_node_insert_child(m_selection, copy, -1);
- m_pMainToolbar->EnableTool(TOOL_EDIT_CUT, true);
- m_pMainToolbar->EnableTool(TOOL_EDIT_COPY, true);
- m_pMainToolbar->EnableTool(TOOL_EDIT_PASTE, true);
- m_pMainToolbar->EnableTool(TOOL_EDIT_PASTE_USE, false);
- m_pMainToolbar->EnableTool(TOOL_EDIT_DELETE, false);
-
- Update();
-}
-
-void V4StudioFrame::OnEditPasteUse(wxCommandEvent &WXUNUSED(event))
-{
- if (!m_pV4sm) return;
- if (m_clipboardNode == NULL) return;
-
- GF_Node *copy = m_pV4sm->CopyNode(m_clipboardNode, m_parentSelection, false);
- gf_node_register(copy, m_selection);
- gf_node_insert_child(m_selection, copy, -1);
- m_pMainToolbar->EnableTool(TOOL_EDIT_CUT, true);
- m_pMainToolbar->EnableTool(TOOL_EDIT_COPY, true);
- m_pMainToolbar->EnableTool(TOOL_EDIT_PASTE, true);
- m_pMainToolbar->EnableTool(TOOL_EDIT_PASTE_USE, false);
- m_pMainToolbar->EnableTool(TOOL_EDIT_DELETE, false);
-
- Update();
-}
-
-// OnAddToTimeLine -- adds a node in the timeline (meaning creating a node ID and adding it to the dictionnary and the pool)
-void V4StudioFrame::OnAddToTimeLine(wxCommandEvent &event) {
- if (!m_pV4sm) return;
- if (!m_selection) return; // don't add nothing
-
- // if object has no node id then create one
- if (! gf_node_get_id(m_selection) )
- m_pV4sm->CreateIDandAddToPool(m_selection);
-
- // Adds the node to the dictionnary
-// m_pV4sm->AddToDictionnary(m_selection);
-
- // calls timeline function to add the line
- char c[50];
- strcpy(c, gf_node_get_name(m_selection));
- timeLine->AddLine( gf_node_get_id(m_selection), wxString(c) );
-}
-
-
-// NextFrame -- goto next frame
-void V4StudioFrame::NextFrame(wxCommandEvent &event) {
- //gf_term_play_from_time(gpacPanel->GetMPEG4Terminal(), 1000);
- m_selection = NULL;
- Update();
-}
-
-
-// SwitchView -- switches between scene editing and dictionnary editing
-void V4StudioFrame::SwitchView(wxCommandEvent &event) {
- SetEditDict(!editDict);
-}
-
-
-
-/****** Access Functions ******/
-
-// changes time to the frame specified, implies playing the scene up to that point
-void V4StudioFrame::SetFrame(unsigned long _frame) {
- // TODO :
- m_frame = _frame;
-}
-
-
-// SetEditDict -- edit the dictionnary or not
-void V4StudioFrame::SetEditDict(bool _editDict) {
-
- // does nothing if no scene
- if (!m_pV4sm) return;
- if ( ! m_pV4sm->GetSceneGraph() ) return;
-
- editDict = _editDict;
-
- if (editDict) treeView->Refresh(m_pV4sm->GetDictionnary());
- else treeView->Refresh(m_pV4sm->GetRootNode());
-}
-
-
-// GetEditDict -- Access to edit dict
-bool V4StudioFrame::GetEditDict() const {
- return editDict;
-}
+++ /dev/null
-#ifndef V4STUDIO_FRAME_H
-#define V4STUDIO_FRAME_H
-
-#include "safe_include.h" // include m4_tools.h
-
-#include <wx/wx.h>
-#include <wx/image.h>
-#include <wx/listctrl.h>
-
-// UI
-#include "V4StudioTree.h"
-#include "V4FieldList.h"
-#include "V4TimeLine\V4TimeLine.h"
-#include "V4CommandPanel.h"
-
-// Scene data
-#include "V4SceneManager.h"
-
-enum {
- // File Menu commands
- MENU_FILE_NEW,
- MENU_FILE_OPEN,
- MENU_FILE_SAVE,
- MENU_FILE_CLOSE,
- MENU_FILE_QUIT,
-
- // Tools Menu commands
- MENU_TOOL_SHOW_LOWLEVEL,
- MENU_TOOL_SHOW_HIGHLEVEL,
-
- // Generic Toolbar commands
- TOOL_FILE_NEW,
- TOOL_FILE_OPEN,
- TOOL_FILE_SAVE,
- TOOL_FILE_CLOSE,
- TOOL_FILE_PREVIEW,
- TOOL_EDIT_CUT,
- TOOL_EDIT_COPY,
- TOOL_EDIT_PASTE,
- TOOL_EDIT_PASTE_USE,
- TOOL_EDIT_DELETE,
- TOOL_EDIT_UNDO,
- TOOL_EDIT_REDO,
- TOOL_FRAME_COMBO,
- TOOL_ADD_TO_TL,
- TOOL_NEXT_FRAME,
- TOOL_VIEW_DICT,
-
- CHANGE_SIZE_DIALOG,
- CHANGE_FRAMERATE,
- CHANGE_LENGTH,
-
- /* High level node creation */
- TOOL_NEW_2DSCENE,
-
- /* Low level node creations */
- // 2D node Toolbar commands
- TOOL_NEW_ORDEREDGROUP,
- TOOL_NEW_LAYER2D,
- TOOL_NEW_TRANSFORM2D,
- TOOL_NEW_TRANSFORMMATRIX2D,
- TOOL_NEW_COLOR_TRANSFORM,
- TOOL_NEW_SHAPE,
-
- // Appearance and sub-appearance Toolbar commands
- TOOL_NEW_APPEARANCE,
- TOOL_NEW_MATERIAL2D,
- TOOL_NEW_LINEPROPS,
- TOOL_NEW_XLINEPROPS,
- TOOL_NEW_FONTSTYLE,
- TOOL_NEW_LINEAR_GRADIENT,
- TOOL_NEW_RADIAL_GRADIENT,
-
- // Geometry Toolbar commands
- TOOL_NEW_RECT,
- TOOL_NEW_CIRCLE,
- TOOL_NEW_IFS2D,
- TOOL_NEW_ILS2D,
- TOOL_NEW_TEXT,
-
- // Media Toolbar commands
- TOOL_NEW_BACKGROUND2D,
- TOOL_NEW_MOVIE,
- TOOL_NEW_IMAGE,
- TOOL_NEW_SOUND
-};
-
-class V4StudioFrame: public wxFrame {
-public:
-
- // Constructor / Desctructor
- V4StudioFrame();
- ~V4StudioFrame();
-
- /* generic UI functions */
-
- /* File Menu functions */
- void OnNew(wxCommandEvent &event);
- void OnFileOpen(wxCommandEvent &event);
- void OnSave(wxCommandEvent &event);
- void OnClose(wxCommandEvent &event);
- void OnQuit(wxCommandEvent &event);
- void OnChangeSize(wxCommandEvent &event);
- void OnChangeFrameRate(wxCommandEvent &event);
- void OnChangeLength(wxCommandEvent &event);
-
- /* Tools Menu functions */
- void OnLowLevelTools(wxCommandEvent &event);
- void OnHighLevelTools(wxCommandEvent &event);
-
- /* edition toolbar functions */
- void OnEditCut(wxCommandEvent &event);
- void OnEditCopy(wxCommandEvent &event);
- void OnEditPaste(wxCommandEvent &event);
- void OnEditPasteUse(wxCommandEvent &event);
- void OnEditDelete(wxCommandEvent &event);
- void OnAddToTimeLine(wxCommandEvent &event);
- void OnCombo(wxCommandEvent& event);
- void NextFrame(wxCommandEvent &event);
- void SwitchView(wxCommandEvent &event);
-
- /* new components toolbar functions */
- void OnNewLayer2D(wxCommandEvent &event);
- void OnNewOrderedGroup(wxCommandEvent &event);
- void OnNewTransform2D(wxCommandEvent &event);
- void OnNewTransformMatrix2D(wxCommandEvent &event);
- void OnNewColorTransform(wxCommandEvent &event);
- void OnNewShape(wxCommandEvent &event);
- void OnNewAppearance(wxCommandEvent &event);
- void OnNewMaterial2D(wxCommandEvent &event);
- void OnNewLinearGradient(wxCommandEvent &event);
- void OnNewRadialGradient(wxCommandEvent &event);
- void OnNewLineProps(wxCommandEvent &event);
- void OnNewXLineProps(wxCommandEvent &event);
- void OnNewText(wxCommandEvent &event);
- void OnNewFontStyle(wxCommandEvent &event);
- void OnNewRect(wxCommandEvent &event);
- void OnNewCircle(wxCommandEvent &event);
- void OnNewSound(wxCommandEvent &event);
- void OnNewBackground2D(wxCommandEvent &event);
- void OnNewImageTexture(wxCommandEvent &event);
- void OnNewMovieTexture(wxCommandEvent &event);
-
-
- /* display update functions */
- void Update();
- void UpdateSelection(GF_Node *node, GF_Node *parent);
- void SetSelection(GF_Node *node) { m_selection = node; }
- void SetParentSelection(GF_Node *node) { m_parentSelection = node; }
- void UpdateToolBar();
- void SceneGraphChanged();
-
-
- /* access to private members */
-
- // UI objects
- V4FieldList * GetFieldView() { return fieldView; }
- V4StudioTree * GetTreeView() { return treeView; }
- V4CommandPanel * GetCmdPanel() { return cmdPanel; }
- V4TimeLine * GetTimeLine() { return timeLine; }
- V4SceneManager * GetV4SceneManager() { return m_pV4sm; }
-
- // variables
- void SetFrame(unsigned long _frame); // changes time to the frame specified, implies playing the scene up to that point
- void SetEditDict(bool editDict); // edit the dictionnary or not
- bool GetEditDict() const;
-
-
-private:
- void set_properties();
- void do_layout();
-
-protected:
-
- DECLARE_EVENT_TABLE()
-
- // select, cut and paste members
- GF_Node *m_selection;
- GF_Node *m_parentSelection;
- GF_Node *m_clipboardNode;
- GF_Node *m_clipboardParentNode;
-
- // scene data
- V4SceneManager *m_pV4sm;
-
- // UI objects
- V4StudioTree *treeView;
- V4FieldList *fieldView;
- V4TimeLine *timeLine;
- V4CommandPanel *cmdPanel;
-
- wxMenu *m_pFileMenu;
- wxMenu *m_pToolsMenu;
- wxStatusBar *m_pStatusbar;
- // The Main bar that contains the new, load, save, cut, copy ...
- wxToolBar *m_pMainToolbar;
-
- // The tool bar to create all the MPEG-4 nodes
- wxToolBar *m_pLowLevelNodeToolbar;
- wxToolBar *m_pHighLevelNodeToolbar;
- u32 m_uSelectedNodeToolBar;
-
- // editing states machine
- bool editDict; // true if we are editing the dictionnary
- unsigned long m_frame; // frame currently selected
-
-};
-
-
-#endif
-
+++ /dev/null
-#include "safe_include.h"
-
-// For compilers that supports precompilation , includes "wx/wx.h"
-#include "wx/wxprec.h"
-
-#ifndef WX_PRECOMP
- #include "wx/wx.h"
-#endif
-
-#include "V4StudioTree.h"
-#include "V4StudioFrame.h"
-
-#include "V4SceneManager.h" // DICTNAME constant
-
-#include "wx/image.h"
-#include "wx/imaglist.h"
-#include "wx/treectrl.h"
-
-#include <math.h>
-
-#include "treeIcon1.xpm"
-#include "treeIcon2.xpm"
-#include "treeIcon3.xpm"
-#include "treeIcon4.xpm"
-#include "treeIcon5.xpm"
-
-#include <gpac/nodes_mpeg4.h>
-
-
-BEGIN_EVENT_TABLE(V4StudioTree, wxTreeCtrl)
- EVT_TREE_SEL_CHANGED(-1, V4StudioTree::OnSelChanged)
- EVT_TREE_ITEM_RIGHT_CLICK(-1, V4StudioTree::OnItemRightClick)
- EVT_TREE_BEGIN_DRAG(-1, V4StudioTree::OnBeginDrag)
- EVT_TREE_END_DRAG(-1, V4StudioTree::OnEndDrag)
-END_EVENT_TABLE()
-
-GF_Err V4StudioTreeItemData::GetField(GF_FieldInfo *f)
-{
- if (!f || fieldIndex < 0) return GF_BAD_PARAM;
- return gf_node_get_field(parent, fieldIndex, f);
-}
-
-V4StudioTree::V4StudioTree(wxWindow *parent_, wxSize size,V4FieldList *fieldView) :
- wxTreeCtrl(parent_, -1, wxDefaultPosition, size, wxTR_DEFAULT_STYLE)
-{
- CreateImageList();
- AddRoot("Scene", V4StudioTree::TreeCtrlIcon_Folder, V4StudioTree::TreeCtrlIcon_FolderOpened);
- m_transformNode = NULL;
- m_selectedNode = NULL;
-
- parent = (V4StudioFrame *) parent_;
-}
-
-
-// Refresh -- redraws the tree starting at the specified node
-void V4StudioTree::Refresh(GF_Node * node)
-{
-
- // check if we have to display the dictionnary or not
- if (parent->GetEditDict())
- node = parent->GetV4SceneManager()->GetDictionnary();
-
-
- wxTreeItemId rootId = GetRootItem();
- CollapseAndReset(rootId);
- if (node) {
- AddNodesToItem(rootId, node, -1, -1);
- Expand(rootId);
- }
-}
-
-void V4StudioTree::AddNodesToItem(wxTreeItemId parentItemId, GF_Node * node, s32 fieldIndex, s32 position)
-{
- GF_FieldInfo field;
- u32 count, i, j;
- char *name;
-
- if (!node) return;
-
- // displays the name and the defname it exists
- u32 s = strlen(gf_node_get_class_name(node));
-
- if (gf_node_get_name(node)) {
- s += strlen(gf_node_get_name(node));
- name = new char[s+4];
- strcpy(name, gf_node_get_class_name(node));
- strcat(name, " - ");
- strcat(name, gf_node_get_name(node));
- } else {
- name = new char[s+1];
- strcpy(name, gf_node_get_class_name(node));
- }
-
- GF_Node * parent = NULL;
-
- V4StudioTreeItemData *parentItemData = (V4StudioTreeItemData *)GetItemData(parentItemId);
- if (parentItemData != NULL) parent = parentItemData->GetNode();
-
- V4StudioTreeItemData * currentItemData = new V4StudioTreeItemData(node, parent, fieldIndex, position);
- wxTreeItemId nodeItemId;
- if (position == -1) nodeItemId = AppendItem(parentItemId, wxString(name), -1, -1, currentItemData);
- else nodeItemId = InsertItem(parentItemId, position, wxString(name), -1, -1, currentItemData);
-
- delete [] name;
- name = NULL;
-
- count = gf_node_get_field_count(node);
- for (i=0;i<count; i++) {
- gf_node_get_field(node, i, &field);
- if (field.eventType == GF_SG_EVENT_IN || field.eventType == GF_SG_EVENT_OUT) continue;
- switch (field.fieldType) {
- case GF_SG_VRML_SFNODE:
- if (* (GF_Node **) field.far_ptr) {
- AddNodesToItem(nodeItemId, * (GF_Node **) field.far_ptr, i, -1);
- }
- break;
- case GF_SG_VRML_MFNODE:
- {
- GF_ChildNodeItem *nodes = (* (GF_ChildNodeItem **) field.far_ptr); // list of children
- u32 nbNodes = gf_node_list_get_count(nodes);
- u8 skipped = 0; // counts nodes not added
-
- for (j=0; j< nbNodes; j++) {
- // gets a pointer to the current child
- GF_Node *child = (GF_Node *)gf_node_list_get_child(nodes, j);
- // prevents the dictionnary from being added to the graph
- const char * c = gf_node_get_name(child);
- if ( (c != NULL) && !strcmp(c,DICTNAME) ) {
- skipped++;
- continue;
- }
- // recursively adds children
- AddNodesToItem(nodeItemId, child, i, j-skipped);
- }
- }
- break;
- default:
- break;
- }
- }
- Expand(nodeItemId);
-}
-
-
-void V4StudioTree::CreateImageList(int size)
-{
- if ( size == -1 ) {
- SetImageList(NULL);
- return;
- }
- // Make an image list containing small icons
- wxImageList *images = new wxImageList(size, size, TRUE);
-
- // should correspond to TreeCtrlIcon_xxx enum
- wxBusyCursor wait;
- wxIcon icons[5];
- icons[0] = wxIcon(icon1_xpm);
- icons[1] = wxIcon(icon2_xpm);
- icons[2] = wxIcon(icon3_xpm);
- icons[3] = wxIcon(icon4_xpm);
- icons[4] = wxIcon(icon5_xpm);
- int sizeOrig = icons[0].GetWidth();
- for ( size_t i = 0; i < WXSIZEOF(icons); i++ ) {
- if ( size == sizeOrig ) images->Add(icons[i]);
- else images->Add(wxBitmap(wxBitmap(icons[i]).ConvertToImage().Rescale(size, size)));
- }
- AssignImageList(images);
-}
-
-void V4StudioTree::OnSelChanged(wxTreeEvent& event)
-{
- wxKeyEvent kevt = event.GetKeyEvent();
-
- wxTreeItemId itemId = event.GetItem();
- m_selectedItem = itemId;
- if (itemId.IsOk()) {
- V4StudioTreeItemData *itemData = (V4StudioTreeItemData *)GetItemData(itemId);
- if (!itemData) {
- event.Skip();
- return;
- }
- GF_Node *itemNode = itemData->GetNode();
- GF_Node *itemParentNode = itemData->GetNodeParent();
- if (!itemNode) {
- event.Skip();
- return;
- }
- V4StudioFrame *mainFrame = (V4StudioFrame *)GetParent();
- mainFrame->UpdateSelection(itemNode, itemParentNode);
- }
-}
-
-void V4StudioTree::SetSelectedItem(GF_Node *node)
-{
- if (m_selectedNode == node) return;
- wxTreeItemId rootId = GetRootItem();
- wxTreeItemId itemId = FindNodeItem(rootId, node);
- m_transformNode = FindTransformNode(itemId);
- itemId = GetItemParent(itemId);
- if (itemId.IsOk()) {
- V4StudioTreeItemData *data = (V4StudioTreeItemData *)GetItemData(itemId);
- if (data != NULL) {
- V4StudioFrame *mainFrame = (V4StudioFrame *)GetParent();
- GF_Node *itemNode = data->GetNode();
- m_selectedNode = itemNode;
- GF_Node *itemParentNode = data->GetNodeParent();
- mainFrame->UpdateSelection(itemNode, itemParentNode);
- }
- SelectItem(itemId);
- }
-}
-
-wxTreeItemId V4StudioTree::FindNodeItem(wxTreeItemId itemId, GF_Node *node)
-{
- void* cookie;
- V4StudioTreeItemData *data = (V4StudioTreeItemData *)GetItemData(itemId);
- if (data != NULL) {
- if (data->GetNode() == node) return itemId;
- }
- wxTreeItemId ret = (wxTreeItemId)0l;
- wxTreeItemId child = GetFirstChild(itemId, cookie);
- while (child.IsOk()) {
- wxTreeItemId ret = FindNodeItem(child, node);
- if (ret.IsOk()) return ret;
- child = GetNextChild(itemId, cookie);
- }
- return ret;
-}
-
-void V4StudioTree::OnItemRightClick(wxTreeEvent &event)
-{
- wxTreeItemId itemId = event.GetItem();
-}
-
-void V4StudioTree::OnBeginDrag(wxTreeEvent& event)
-{
- // need to explicitly allow drag
- if ( event.GetItem() != GetRootItem() ){
- m_draggedItem = event.GetItem();
- V4StudioTreeItemData *draggedData = (V4StudioTreeItemData *)GetItemData(m_draggedItem);
- event.Allow();
- } else {
- wxLogMessage(wxT("OnBeginDrag: this item can't be dragged."));
- }
-}
-
-void V4StudioTree::OnEndDrag(wxTreeEvent& event)
-{
- wxTreeItemId itemSrc = m_draggedItem, itemDst = event.GetItem(), dstParentItem = GetItemParent(itemDst);
- m_draggedItem = (wxTreeItemId)0l;
-
- V4StudioTreeItemData *srcData = (V4StudioTreeItemData *)GetItemData(itemSrc);
- GF_FieldInfo srcField;
- srcData->GetField(&srcField);
- // Removal of the src item from its parent field
- switch (srcField.fieldType) {
- case GF_SG_VRML_SFNODE:
- if (* (GF_Node **) srcField.far_ptr) {}
- break;
- case GF_SG_VRML_MFNODE:
- {
- GF_ChildNodeItem *nodes = (* (GF_ChildNodeItem **) srcField.far_ptr);
- gf_node_list_del_child_idx(&nodes, srcData->GetPosition());
- }
- break;
- default:
- break;
- }
-
- GF_Node *srcNode = srcData->GetNode();
- GF_FieldInfo dstField;
- V4StudioTreeItemData *dstData = (V4StudioTreeItemData *)GetItemData(itemDst);
- dstData->GetField(&dstField);
- // Addition of the src item prior to the dest item
- switch (dstField.fieldType) {
- case GF_SG_VRML_SFNODE:
- if (* (GF_Node **) dstField.far_ptr) {}
- break;
- case GF_SG_VRML_MFNODE:
- {
- GF_ChildNodeItem *nodes = (* (GF_ChildNodeItem **) dstField.far_ptr);
- gf_node_list_insert_child(&nodes, srcNode, dstData->GetPosition());
- gf_node_dirty_set(dstData->GetNode(), 0, 1);
- }
- break;
- default:
- break;
- }
-
- GF_Node *dstParentNode = dstData->GetNodeParent();
-
- Delete(itemSrc);
- AddNodesToItem(dstParentItem, srcNode, dstData->GetFieldIndex(), dstData->GetPosition());
- V4StudioFrame *mainFrame = (V4StudioFrame *)GetParent();
- mainFrame->UpdateSelection(srcNode,dstData->GetNodeParent());
- mainFrame->Update();
-}
-
-GF_Node *V4StudioTree::FindTransformNode(wxTreeItemId itemId)
-{
- GF_Node *transformNode = NULL;
- while (true) {
- if (itemId.IsOk()) {
- V4StudioTreeItemData *data = (V4StudioTreeItemData *)GetItemData(itemId);
- if (data != NULL) {
- GF_Node *itemNode = data->GetNode();
- u32 tag = gf_node_get_tag(itemNode);
- if (tag == TAG_MPEG4_Transform2D || tag == TAG_MPEG4_TransformMatrix2D) {
- transformNode = itemNode;
- break;
- }
- } else {
- break;
- }
- } else {
- break;
- }
- itemId = GetItemParent(itemId);
- }
- return transformNode;
-}
-
-void V4StudioTree::Translate(int dX, int dY)
-{
- if (m_transformNode) {
- GF_FieldInfo field;
- u32 tag = gf_node_get_tag(m_transformNode);
- if (tag == TAG_MPEG4_Transform2D){
- gf_node_get_field(m_transformNode, 7, &field);
- ((SFVec2f *)field.far_ptr)->x += dX;
- ((SFVec2f *)field.far_ptr)->y += dY;
- } else {
- gf_node_get_field(m_transformNode, 5, &field);
- *((SFFloat *)field.far_ptr) += dX;
- gf_node_get_field(m_transformNode, 8, &field);
- *((SFFloat *)field.far_ptr) += dY;
- }
- V4StudioFrame *mainFrame = (V4StudioFrame *)GetParent();
- mainFrame->GetFieldView()->SetNode(m_transformNode);
- mainFrame->GetFieldView()->Create();
- }
-}
-
-void V4StudioTree::Scale(int dX, int dY)
-{
- if (m_transformNode && (dX || dY)) {
- GF_FieldInfo field;
- u32 tag = gf_node_get_tag(m_transformNode);
- if (tag == TAG_MPEG4_Transform2D){
- gf_node_get_field(m_transformNode, 5, &field);
- if (dX) ((SFVec2f *)field.far_ptr)->x *= (dX>0?1.01:0.99);
- if (dY) ((SFVec2f *)field.far_ptr)->y *= (dY>0?1.01:0.99);
- } else {
- gf_node_get_field(m_transformNode, 3, &field);
- if (dX) *((SFFloat *)field.far_ptr) *= (dX>0?1.01:0.99);
- gf_node_get_field(m_transformNode, 7, &field);
- if (dY) *((SFFloat *)field.far_ptr) *= (dY>0?1.01:0.99);
- }
- V4StudioFrame *mainFrame = (V4StudioFrame *)GetParent();
- mainFrame->GetFieldView()->SetNode(m_transformNode);
- mainFrame->GetFieldView()->Create();
- }
-}
-
-
-void V4StudioTree::Rotate(int dX, int dY)
-{
- /*quick and dirty of course...*/
- dY *= -1;
- if (m_transformNode && (dX || dY)) {
- u32 tag = gf_node_get_tag(m_transformNode);
- if (tag == TAG_MPEG4_Transform2D){
- Double ang;
- ang = atan2(dY, dX) / 100;
- ((M_Transform2D *) m_transformNode)->rotationAngle += ang;
- } else {
- ((M_TransformMatrix2D *) m_transformNode)->mxy += dX;
- ((M_TransformMatrix2D *) m_transformNode)->myx += dY;
- }
- V4StudioFrame *mainFrame = (V4StudioFrame *)GetParent();
- mainFrame->GetFieldView()->SetNode(m_transformNode);
- mainFrame->GetFieldView()->Create();
- }
-}
-
-
+++ /dev/null
-#ifndef _V4STUDIO_TREE_H
-#define _V4STUDIO_TREE_H
-
-#include "safe_include.h"
-#include <gpac/scenegraph.h>
-#include "V4FieldList.h"
-
-#include <wx/treectrl.h>
-
-
-class V4StudioFrame;
-
-
-class V4StudioTreeItemData : public wxTreeItemData {
-public:
- V4StudioTreeItemData(GF_Node *n, GF_Node *p, s32 fi, s32 pos = -1) : node(n), parent(p), fieldIndex(fi), position(pos) {}
-
-public:
- GF_Node *GetNode() { return node; }
- void SetNode(GF_Node *n) { node = n; }
- GF_Err GetField(GF_FieldInfo *f);
-
- GF_Node *GetNodeParent() { return parent; }
- void SetNodeParent(GF_Node *n) { parent = n; }
- s32 GetPosition() { return position; }
- void SetPosition(s32 pos) { position = pos; }
- void SetFieldIndex(s32 i) { fieldIndex = i; }
- s32 GetFieldIndex() { return fieldIndex; }
-
-private:
- GF_Node *node;
- GF_Node *parent;
- s32 fieldIndex;
- s32 position;
-
-};
-
-class V4StudioTree: public wxTreeCtrl {
-
-public:
- enum
- {
- TreeCtrlIcon_File,
- TreeCtrlIcon_FileSelected,
- TreeCtrlIcon_Folder,
- TreeCtrlIcon_FolderSelected,
- TreeCtrlIcon_FolderOpened
- };
-
- V4StudioTree(wxWindow *parent, wxSize size, V4FieldList *fieldView);
-
- void CreateImageList(int size = 16);
-
- void Refresh(GF_Node * node);
-
- void OnSelChanged(wxTreeEvent& event);
- void OnItemRightClick(wxTreeEvent &event);
- void ShowMenu(wxTreeItemId id, const wxPoint& pt);
- void OnBeginDrag(wxTreeEvent& event);
- void OnEndDrag(wxTreeEvent& event);
-
- void SetSelectedItem(GF_Node *node);
- void Translate(int dX, int dY);
- void Scale(int dX, int dY);
- void Rotate(int dX, int dY);
- wxTreeItemId FindNodeItem(wxTreeItemId itemId, GF_Node *node);
- GF_Node *FindTransformNode(wxTreeItemId itemId);
-
-protected:
- DECLARE_EVENT_TABLE()
-
-private:
- void AddNodesToItem(wxTreeItemId parentItemId, GF_Node * node, s32 fieldIndex, s32 position);
-
- wxTreeItemId m_selectedItem; // item being dragged right now
- wxTreeItemId m_draggedItem; // item being dragged right now
-
- GF_Node * m_selectedNode;
- GF_Node * m_transformNode;
-
- // All the component of the V4Studio Main Frame have a pointer to that Main Frame, called parent.
- V4StudioFrame * parent;
-
-};
-
-#endif
+++ /dev/null
-/*
- V4TimeLine.cpp
-
- Implémentation de la classe V4TimeLine
-*/
-
-#include "V4TimeLine.h"
-#include "V4TimeLineCase.h"
-#include "..\V4StudioFrame.h"
-
-
-// Constructeur
-V4TimeLine::V4TimeLine(wxWindow * parent_, unsigned int timeLineLength) : wxScrolledWindow(parent_), sizer(NULL) {
-
- // position en X de la grille
- Offset = 100;
- Length = timeLineLength;
- clicked = NULL;
-
- parent = (V4StudioFrame *) parent_;
-
- sizer = new wxBoxSizer(wxVERTICAL);
-
- // indispensable pour avoir des barres de défilement
- SetScrollRate( 5, 5 );
-
- hdr = new V4TimeLineHdr(this);
- sizer->Add(hdr);
-
- SetSizer(sizer);
- FitInside();
-}
-
-
-// Destructeur
-V4TimeLine::~V4TimeLine() {
-}
-
-
-// retourne la position en X du debut de la grille
-int V4TimeLine::GetOffset() {
- return Offset;
-}
-
-
-// returns Length attribute
-unsigned int V4TimeLine::GetLength() {
- return Length;
-}
-
-
-// Adds a line to the timeline
-void V4TimeLine::AddLine(u32 NodeID, wxString eltName) {
- // verifies that we have no line with the same NodeID
-
- for (int i = 0; i < lines.size(); i++) {
- if (lines.at(i)->GetNodeID() == NodeID)
- return;
- }
-
- // adds the line at the end of the list, in the next position
- // note that we already have the hearder line in position 0
- lines.push_back(
- new V4TimeLineElt(this, lines.size()+1, NodeID, eltName, hdr->GetFrame())
- );
-
- // redraws the component
- sizer->Add(lines.back());
- Layout();
-}
-
-
-// called when time changed, update display (background colors)
-void V4TimeLine::SetFrame(u32 _frame, V4TimeLineCell * newClicked) {
-
- // updates lines display
- if (_frame != hdr->GetFrame()) {
- hdr->SetFrame(_frame);
-
- // TODO : apply all commands from previous frames.
- // maybe by adding a NextFrame() method
-
- for (int i = 0; i < lines.size(); i++)
- lines.at(i)->SetFrame(_frame);
- }
-
-
- // updates clicked state on clicked cells
-
- // removes state from old
- if (clicked != NULL) {
- u32 state = clicked->GetState();
- state &= ~CELL_STATE_CLICKED;
- clicked->SetState(state);
- }
-
- clicked = newClicked;
-
- // adds state to new
- if (clicked != NULL) {
- u32 state = clicked->GetState();
- state |= CELL_STATE_CLICKED;
- clicked->SetState(state);
- }
-
-
- // updates command panel
- ((V4StudioFrame *) GetParent())->GetCmdPanel()->Refresh(_frame);
-
-}
-
-
-// GetSelectedID -- returns the ID of the node whose timeline is selected
-u32 V4TimeLine::GetSelectedID() const {
-
- // if nothing is selected then returns null nodeID
- if (!clicked) return 0;
-
- // gets the line from the cell
- u32 pos = clicked->GetParent()->GetPos();
-
- // gets the node id (!! the header line is first)
- if (pos) return lines.at(pos-1)->GetNodeID();
- else return 0; // if we clicked on a header cell
-}
-
-
-// AddCommand --
-void V4TimeLine::AddCommand(GF_Command * c) {
- clicked->AddCommand(c);
-}
-
-
-// DeleteCommand --
-void V4TimeLine::DeleteCommand(u32 n) {
- clicked->DeleteCommand(n);
-}
-
-
-// GetCommand --
-GF_Command * V4TimeLine::GetCommand(u32 n) {
- return clicked->GetCommand(n);
-}
-
-
-// SetLength --
-void V4TimeLine::SetLength(const unsigned int length_) {
- hdr->SetLength(length_);
-
- // if the selected frames will be deleted, we select the last cell
- if (hdr->GetFrame() > length_) SetFrame(length_);
-
- for (int i = 0; i < lines.size(); i++)
- lines.at(i)->SetLength(length_);
-
- Length = length_;
-
- FitInside();
-}
\ No newline at end of file
+++ /dev/null
-/*
- V4TimeLine.h
-
- V4Studio component allowing to edit timings
- The component draw sub components whose type is V4TimeLineElt
-*/
-
-#ifndef _V4TimeLine_
-#define _V4TimeLine_
-
-#include "../safe_include.h"
-
-// wxWidgets includes
-#include <wx/scrolwin.h>
-#include <wx/sizer.h>
-
-// Own includes
-#include "V4TimeLineElt.h"
-#include "V4TimeLineHdr.h"
-
-// STL includes
-#include <vector>
-
-class V4TimeLineCell;
-class V4StudioFrame;
-
-
-
-class V4TimeLine : public wxScrolledWindow {
- public:
- // Constructeur -- timeLineLength est compté en images
- V4TimeLine(wxWindow * parent, unsigned int timeLineLength = 50);
-
- // Desctructeur
- ~V4TimeLine();
-
- void AddLine(u32 NodeID, wxString eltName); // Adds a line to the timeline
- // TODO : add an additionnal parameter to specify a pointer to the element represented by the line
- // TODO : use node pointer instead of id ?
-
- void Clear(); // clears all the line in the timeline
- // TODO : check if everything is destroyed correctly
-
- // retourne la position en X du debut de la grille
- int GetOffset();
-
- // access to Length
- unsigned int GetLength();
- void SetLength(const unsigned int length_);
-
- // called when time changed, update display (background colors)
- void SetFrame(u32 _frame, V4TimeLineCell * newClicked = NULL);
-
- // returns the ID of the node whose timeline is selected
- u32 GetSelectedID() const;
-
- // Deletes a command from the current cell
- void DeleteCommand(u32 n);
-
- // Adds a command to the current cell
- void AddCommand(GF_Command *);
-
- // Retrieves the list of commands for the current cell
- GF_Command * GetCommand(u32 n);
-
- // pointer to the parent
- V4StudioFrame * parent;
-
-
- private:
- // composants graphiques
- std::vector<V4TimeLineElt *> lines;
- V4TimeLineHdr * hdr;
- wxBoxSizer * sizer;
-
- // attributs divers
- int Offset; // X position of the grid
- u32 Length; // length (in frames) of the scene
- V4TimeLineCell * clicked; // cell currently "clicked"
-
-
-};
-
-#endif
\ No newline at end of file
+++ /dev/null
-/*
- V4TimeLineCase.cpp
-
-*/
-
-#include "V4TimeLineCase.h"
-#include "V4TimeLineLine.h"
-#include "V4TimeLine.h"
-
-#include "..\V4StudioFrame.h"
-#include "..\V4SceneManager.h"
-
-
-BEGIN_EVENT_TABLE(V4TimeLineCell, wxWindow)
- EVT_PAINT(V4TimeLineCell::OnPaint)
- EVT_LEFT_UP(V4TimeLineCell::OnLeftUp)
-END_EVENT_TABLE()
-
-
-// Constructor
-V4TimeLineCell::V4TimeLineCell(V4TimeLineLine * parent_, unsigned int _num, unsigned int _type) : wxWindow(parent_, -1), num(_num), state(0), type(_type) {
-
- parent = parent_;
- commands = gf_list_new();
-
- SetSize(parent_->GetOffset() + _num * 20, 0, -1, -1);
-
- // line, timeline, frame
- v4sf = (V4StudioFrame *) parent->GetParent()->GetParent();
-
-}
-
-
-// destructor
-V4TimeLineCell::~V4TimeLineCell() {
- gf_list_del(commands);
-}
-
-
-// OnPaint
-void V4TimeLineCell::OnPaint(wxPaintEvent & event) {
- wxPaintDC dc(this);
-
- dc.BeginDrawing();
-
- int w, h;
- GetSize(&w, &h);
-
- // draws the background
- dc.SetPen(*wxTRANSPARENT_PEN);
-
- // finds a color according to the parity
- unsigned char r,g,b;
- if ( ((V4TimeLineLine *)GetParent())->GetPos() % 2 ) { r = 220; g = 220; b = 255; }
- else { r = 200; g = 200; b = 255; };
-
- // if we are selected (ie current frame) adds green
- if (state & CELL_STATE_SELECTED)
- g += 35;
-
- wxColour c(r,g,b);
-
- wxBrush br(c);
- dc.SetBrush( br );
-
- dc.DrawRectangle(0,0,w,h);
-
- dc.SetBrush(*wxWHITE_BRUSH);
-
- // draws the vertical borders
- dc.SetPen(*wxLIGHT_GREY_PEN);
- dc.DrawLine(0,0,0,h);
-
- dc.SetPen(*wxBLACK_PEN);
-
- // draws state specific information
- if (state & CELL_STATE_CLICKED) dc.DrawCircle(w/2,h/2,10);
- if (state & CELL_STATE_COMMAND) dc.DrawRectangle(2, 2, w-4, h-4);
-
- // draws frame number
- wxString s;
- if ( (type == CELL_TYPE_HDR) && (! (num % 10)) ) {
- s = s.Format(wxT("%d"), num);
- // centers text
- int wt, ht;
- dc.GetTextExtent(s, &wt, &ht);
- dc.DrawText(s, (w-wt)/2, (h-ht)/2);
- }
-
- dc.EndDrawing();
-}
-
-
-// OnLeftUp -- tells the application that the user switched frame
-void V4TimeLineCell::OnLeftUp(wxMouseEvent & event) {
-
- ((V4TimeLine *) GetParent()->GetParent())->SetFrame(num, this);
-
- V4SceneManager * sg = v4sf->GetV4SceneManager();
-
- // don't trigger any more reaction if this is a cell in the first row
- //if (type == CELL_TYPE_HDR) return;
-
- Refresh();
- v4sf->Update();
-}
-
-
-// SetState -- Changes cell state
-void V4TimeLineCell::SetState(unsigned int _state) {
- state = _state;
-
- // if cell is clicked but not selected, can't be clicked anymore
- if ( (state & CELL_STATE_CLICKED) && !(state & CELL_STATE_SELECTED) )
- state &= ~CELL_STATE_CLICKED;
-
- Refresh();
-}
-
-
-// GetState -- Retrieves cells state
-unsigned int V4TimeLineCell::GetState() const {
- return state;
-}
-
-
-// AddCommand --
-void V4TimeLineCell::AddCommand(GF_Command *c) {
- gf_list_add(commands, c);
- SetState( GetState() | CELL_STATE_COMMAND );
-}
-
-// DeleteCommand -- Deletes ONE command
-void V4TimeLineCell::DeleteCommand(const u32 n) {
- // TODO :
-}
-
-
-// DeleteCommand -- destroys all the commands from this cell (for instance when shortening the scene)
-// ONLY works for NORMAL cells
-void V4TimeLineCell::DeleteCommands() {
-
- // deletes the commands from the au
-
- // useful objects
- V4SceneManager *sm = v4sf->GetV4SceneManager();
- GF_StreamContext *ctx = sm->GetBifsStream();
- GF_AUContext * au = NULL;
- GF_Node * myNode = gf_sg_find_node( sm->GetSceneGraph(), ((V4TimeLineElt *) parent)->GetNodeID() );
-
- u32 myTiming = sm->GetUnits() / sm->GetFrameRate() * num;
-
- // first, locates the AU
- for (int i = 0; i < gf_list_count(ctx->AUs); i++) {
- au = (GF_AUContext *) gf_list_get(ctx->AUs, i);
- if (au->timing == myTiming) {
- // then the commands for this node and deletes it
- for (int j = 0; j < gf_list_count(au->commands); j++) {
- GF_Command * c = (GF_Command *)gf_list_get(au->commands, j);
- if ( c->node == myNode ) {
- gf_sg_command_del(c);
- gf_list_rem(au->commands, j);
- break;
- }
- }
- }
- }
-
- // deletes the command in our chain
- gf_list_reset(commands);
-
- SetState( GetState() ^ CELL_STATE_COMMAND );
-}
-
-
-// GetCommand -- allow listing of the command for this cell
-GF_Command * V4TimeLineCell::GetCommand(u32 n) {
- if (gf_list_count(commands) < n) return NULL;
- else return (GF_Command *) gf_list_get(commands, n);
-}
-
-
-// GetParent -- returns a pointer to parent (used to retrieve line number and node ID)
-V4TimeLineLine * V4TimeLineCell::GetParent() const {
- return parent;
-}
+++ /dev/null
-/*
- V4TimeLineCase.h
-
- // TODO : description
-*/
-
-#ifndef _V4TimeLineCell_
-#define _V4TimeLineCell_
-
-
-#include <gpac/scenegraph_vrml.h>
-
-#include <wx/window.h>
-
-
-class V4TimeLineLine;
-
-// differents types of a cell -- differs with the line type
-#define CELL_TYPE_HDR 0
-#define CELL_TYPE_NORMAL 1
-
-// different states of a cell
-#define CELL_STATE_CLICKED 1
-#define CELL_STATE_SELECTED 2
-#define CELL_STATE_COMMAND 4
-
-class V4StudioFrame;
-
-class V4TimeLineCell: public wxWindow {
-
- public:
- // Constructor
- V4TimeLineCell(V4TimeLineLine * parent, unsigned int num=0, unsigned int type=CELL_TYPE_NORMAL);
-
- // Destructor
- virtual ~V4TimeLineCell();
-
- // Changes cell state
- void SetState(unsigned int _state);
- unsigned int GetState() const;
-
- // returns a pointer to parent (used to retrieve line number and node ID)
- V4TimeLineLine * GetParent() const;
-
- // manipulates the commands list
- void AddCommand(GF_Command *);
- void DeleteCommands();
- void DeleteCommand(const u32 n);
- GF_Command * GetCommand(u32 n);
-
- private:
- unsigned int state; // possible values not yet defined
- unsigned int type; // type of cell
-
- unsigned int num;
-
- DECLARE_EVENT_TABLE()
-
- V4StudioFrame * v4sf;
- V4TimeLineLine * parent;
-
- GF_List * commands; // actions to perform for this object (row) when entering the frame (col)
-
- void OnLeftUp(wxMouseEvent &);
- void OnPaint(wxPaintEvent &);
-};
-
-#endif
\ No newline at end of file
+++ /dev/null
-/*
- V4TimeLineElt.cpp
-
- Implements V4TimeLineElt class
-*/
-
-#include "V4TimeLineElt.h"
-#include "V4TimeLine.h"
-#include "V4TimeLineCase.h"
-
-#include "..\V4StudioFrame.h"
-#include "..\V4SceneManager.h" // FPS constant
-
-
-// Constructor
-V4TimeLineElt::V4TimeLineElt(V4TimeLine * parent, unsigned int pos, unsigned long _NodeID, wxString eltName, unsigned long frame) :
-V4TimeLineLine(parent, pos, frame), txt(NULL), lbl(NULL) {
- // creates sub-controls
-
- NodeID = _NodeID;
-
- sizer = new wxBoxSizer(wxHORIZONTAL);
- SetSizer(sizer);
-
- lbl = new wxStaticText(this, -1, eltName);
- lbl->SetSize(0,0,parent->GetOffset(), 20);
-
-
- sizer->Add(lbl, 0, wxALL, 0);
-
- CreateLine(CELL_TYPE_NORMAL);
-
-
- // locates the existing commands for a node
- GF_StreamContext * stream = parent->parent->GetV4SceneManager()->GetBifsStream();
-
- // tries all access units
- for (i=0; i < gf_list_count(stream->AUs); i++) {
- GF_AUContext * au = (GF_AUContext *) gf_list_get(stream->AUs, i);
-
- // and all commands in each au
- for (u32 j=0; j < gf_list_count(au->commands); j++) {
- GF_Command * c = (GF_Command *) gf_list_get(au->commands, j);
-
- // and checks whether they are appled to this node
- if (gf_node_get_id(c->node) == NodeID) {
- // TODO : the timing unit might not be 1 ms
- u32 cellNum = au->timing / 1000 * parent->parent->GetV4SceneManager()->GetFrameRate();
- cells.at(cellNum)->SetState(CELL_STATE_COMMAND);
- cells.at(cellNum)->AddCommand(c);
- }
- }
-
- }
-
-}
-
-
-// Destructor
-V4TimeLineElt::~V4TimeLineElt() {
-
-}
-
-
-// returns NodeID
-u32 V4TimeLineElt::GetNodeID() {
- return NodeID;
-}
-
-
-//
-unsigned char V4TimeLineElt::GetType() {
- return CELL_TYPE_NORMAL;
-}
\ No newline at end of file
+++ /dev/null
-/*
- V4TimeLineElt.h
-
- Class representing one line in the timeline
-
- A line consists in a label, giving the name of the object it represents, and an owner drawn zone where are represented the events
-*/
-
-#ifndef _V4TimeLineElt_
-#define _V4TimeLineElt_
-
-#include "../safe_include.h"
-
-// wxWidgets includes
-#include <wx/wx.h>
-
-// Own includes
-#include "V4TimeLineLine.h"
-
-
-// include GPAC
-//#include "../safe_include.h" // definition des types de données
-
-
-class V4TimeLine;
-
-
-class V4TimeLineElt : public V4TimeLineLine {
- public:
- // Constructor
- V4TimeLineElt(V4TimeLine * parent, unsigned int pos, unsigned long NodeID, wxString eltName, unsigned long frame=0);
-
- // Destructor
- ~V4TimeLineElt();
-
- // inherited
- virtual unsigned char GetType();
-
- // returns NodeID
- u32 GetNodeID();
-
- private:
- wxTextCtrl * txt;
- wxStaticText * lbl;
- unsigned long NodeID;
-};
-
-#endif
\ No newline at end of file
+++ /dev/null
-/*
- V4TimeLineHdr.cpp
-
- Implements V4TimeLineHdr class.
-*/
-
-#include "V4TimeLineHdr.h"
-#include "V4TimeLine.h"
-#include <wx/dcclient.h>
-
-BEGIN_EVENT_TABLE(V4TimeLineHdr, wxWindow)
-END_EVENT_TABLE()
-
-
-// Constructor
-V4TimeLineHdr::V4TimeLineHdr(V4TimeLine * parent, unsigned int pos) : V4TimeLineLine(parent, pos) {
-
- // Creates default line
- sizer = new wxBoxSizer(wxHORIZONTAL);
- SetSizer(sizer);
- lbl = new wxStaticText(this, -1, wxT("Object"));
- lbl->SetSize(0,0,parent->GetOffset(), 20);
- sizer->Add(lbl, 0, wxALL, 0);
-
- CreateLine(CELL_TYPE_HDR);
-
-}
-
-
-// Desctructor
-V4TimeLineHdr::~V4TimeLineHdr() {};
-
-
-//
-unsigned char V4TimeLineHdr::GetType() {
- return CELL_TYPE_HDR;
-}
\ No newline at end of file
+++ /dev/null
-/*
- V4TimeLineHdr.h
-
- Defines the class for printing hearder information on the timeline (frame numbers...)
-*/
-
-#ifndef _V4TimeLineHdr_
-#define _V4TimeLineHdr_
-
-#include "../safe_include.h"
-
-#include <wx/wx.h>
-#include "V4TimeLineLine.h" // parent class
-
-class V4TimeLine;
-
-
-class V4TimeLineHdr : public V4TimeLineLine {
- public:
- // Constructor
- V4TimeLineHdr(V4TimeLine * parent, unsigned int pos=0);
-
- // Destructor
- ~V4TimeLineHdr();
-
- // inherited
- virtual unsigned char GetType();
-
- private:
-
- wxStaticText * lbl; // holds the title string
-
- DECLARE_EVENT_TABLE();
-};
-
-#endif
+++ /dev/null
-/*
- V4TimeLineLine.cpp
-
- Implements V4TimeLineLine class
-
-*/
-
-#include "V4TimeLineLine.h"
-#include "V4TimeLine.h"
-
-// Constructor
-V4TimeLineLine::V4TimeLineLine(V4TimeLine * parent, unsigned int _pos, unsigned long frame) : wxWindow((wxWindow *) parent, -1), pos(_pos) {
-}
-
-
-// retrieves X position of the grid
-unsigned int V4TimeLineLine::GetOffset() const {
- return ( (V4TimeLine *)GetParent() )->GetOffset();
-}
-
-
-// returns the number of frame in the scene
-unsigned int V4TimeLineLine::GetLength() const {
- return ( (V4TimeLine *)GetParent() )->GetLength();
-}
-
-
-// returns the position of the line in the timeLine
-unsigned int V4TimeLineLine::GetPos() const {
- return pos;
-}
-
-
-// Update diplay to match new time
-void V4TimeLineLine::SetFrame(unsigned long _frame) {
- std::vector<V4TimeLineCell *>::iterator iter;
-
- int i = 0;
-
- // uptades the needed cells
-
- for (iter = cells.begin(); iter != cells.end(); iter++) {
- // newly selected cell, adds selected state
- if (i == _frame) {
- unsigned int state = (*iter)->GetState();
- state |= CELL_STATE_SELECTED;
- (*iter)->SetState(state);
- }
-
- // old selected cell, deletes selected state
- if ( (i == frame) && (_frame != frame) ) {
- unsigned int state = (*iter)->GetState();
- state &= ~CELL_STATE_SELECTED;
- (*iter)->SetState(state);
- }
-
- i++;
- }
-
- frame = _frame;
-}
-
-
-// Retrieves frame
-unsigned long V4TimeLineLine::GetFrame() const {
- return frame;
-}
-
-
-//
-void V4TimeLineLine::SetLength(const unsigned int length_) {
- int L = GetLength();
-
- V4TimeLine * line = (V4TimeLine *) GetParent();
- SetSizeHints(line->GetOffset() + 20 * length_, -1);
- line->Layout();
-
- if (L <= length_) {
-
- for (int i = L; i < length_; i++) {
- cells.push_back(new V4TimeLineCell(this,i, GetType()));
- sizer->Add(cells.back(), 1, wxALL, 0);
- }
- } else {
- for (int i = L-1; i >= length_; i--) {
- if (cells.back()->GetCommand(0)) cells.back()->DeleteCommands();
- delete cells.back();
- cells.pop_back();
- }
- }
-
-}
\ No newline at end of file
+++ /dev/null
-/*
- V4TimeLineLine.h
-
- Defines generic behaviour for a line in the timeline
- There are two child classes: V4TimeLineElt and V4TimeLineHdr
-
-*/
-
-#ifndef _V4TimeLineLine_
-#define _V4TimeLineLine_
-
-#include "../safe_include.h"
-
-#include <wx/wx.h>
-#include <vector>
-#include "V4TimeLineCase.h"
-
-
-#define LINE_TYPE_HDR 0
-#define LINE_TYPE_ELT 1
-
-class V4TimeLine;
-
-
-// macro that creates the sizer and the grid for a line
-#define CreateLine(CELL_TYPE) \
- SetSizeHints(parent->GetOffset() + 20 * GetLength(), -1); \
- \
- for (u32 i=0; i<GetLength(); i++) { \
- cells.push_back(new V4TimeLineCell(this,i, CELL_TYPE)); \
- sizer->Add(cells.back(), 1, wxALL, 0); \
- } \
- SetFrame(frame);
-
-
-class V4TimeLineLine : public wxWindow {
- public:
- // Constructor
- V4TimeLineLine(V4TimeLine * parent, unsigned int _pos, unsigned long frame=0);
-
- // retrieves the X positon of the grid
- unsigned int GetOffset() const;
-
- // returns the Y position of the line
- unsigned int GetPos() const;
-
- // accesses the length of the grid
- unsigned int GetLength() const;
- void SetLength(const unsigned int length_);
-
- // Update display to match new time
- void SetFrame(unsigned long _frame);
- unsigned long GetFrame() const;
-
- virtual unsigned char GetType() PURE;
-
-
- protected:
- std::vector<V4TimeLineCell *> cells; // cases of the grid
- wxBoxSizer * sizer;
-
- unsigned int pos; // Y position of the line in the grid
-
- unsigned long frame; // current frame
-
-};
-
-#endif
\ No newline at end of file
+++ /dev/null
-What is V4Studio?
-------------------
-
-This piece of software is an authoring tool to design and encode MPEG-4 content
-at large (audio, video, still picture, vector graphics and text). The current
-version has no support for audio, video or still picture. But if you edit an
-existing mp4 files that contains some media, they will remain in the output mp4.
-
-This tool was design based on the rendering system of the gpac project but the
-GUI is written using wxWindows (www.wxwindows.org).
-
-The current version allows you to open an mp4 file or a bt file, to edit the
-graphical elements (vector graphics, text) of the initial BIFS scene. You can
-then save the result to an mp4 file. Editing is very limited for the moment, you
-can:
-- add nodes within a node depending on the context.
-- delete nodes
-- change some field values (float, int, string, colours, points)
-- move objects.
-
-Problems:
----------
-Since it is in a version early stage, this software has known bugs (fields list
-view, node drag and drop, node deletions) and may have some more unknown ones.
-
-How to install V4Studio?
---------------------------
-I'm using Windows 2000 and I haven't tried it yet on other platforms. Please
-report any problem. Only the Debug version has been tested.
-
-On Windows:
-Get the source from the gpac project http://gpac.sourceforge.net
-
-Compiling:
----------
-Open the GPAC.dsw file. Set the V4Studio project active and build it. It will
-build also libgpac.dll.
-
-The current version uses a hard-coded path to a configuration file GPAC.cfg.
-Before compiling, you should change that path to your path. In the file
-wxGPACPanel.cpp, change:
- strcpy(config_path, "E:\\MesProjets\\gpac\\gpac\\bin\\Debug");
-into:
- strcpy(config_path, <gpac_path_with_double_backslash>\\gpac\\bin\\w32_deb");
-
-To link, it needs the js32.lib. Place it under gpac/extra_lib/lib/w32_deb.
-
-To link, you also need some elements from wxWidgets, version 2.5.2. You need to change the path
-to the wxWidgets include and library directories, in tools->options, Directories tab
-Add to include directories:
-<wxWidgets_path>\wxWidgets\include
-<wxWidgets_path>\wxWidgets\contrib\include
-<wxWidgets_path>\wxWidgets\lib\mswd
-
-Add to library directories:
-<wxWidgets_path>\wxWidgets\lib
-<wxWidgets_path>\wxWidgets\contrib\lib
-
-The following libs from wxWidgets are required and should be present in V4Studio project linker settings:
-wxmsw25d_html.lib wxbase25d.lib wxmsw25d_core.lib wxmsw25d_adv.lib wxbase25d_xml.lib wxexpatd.lib wxmsw25d_xrc.lib
-(remove the 'd' for release versions)
-
-
-Once this is done, you should be able to compile V4Studio.exe.
-
-Running:
---------
-To run the tool, you should have a valid GPAC.cfg file. If you don't have the
-GPAC.CFG file, here a default content, where you should change <gpac_root_path>
-------------------------------------
-[General]
-ModulesDirectory=<gpac_root_path>\gpac\bin\Debug\
-CacheDirectory=<gpac_root_path>\gpac\bin\Debug\cache
-
-[Rendering]
-DriverName=gdip_rend
-AntiAlias=All
-
-[Audio]
-ForceConfig=yes
-NumBuffers=8
-TotalDuration=400
-DriverName=dx_hw
-
-[FontEngine]
-DriverName=gdip_rend
-FontDirectory=C:\WINNT\Fonts
-
-[Video]
-DriverName=dx_hw
-
-[System]
-ThreadingPolicy=Free
-Priority=normal
------------------------------------------
-
-You need also at least the plugin for the Rendering section (here gdip_rend),
-the Video section (here dx_hw), the audio section (here dx_hw). So you should
-also compile the dll for the 2 projects gdip_rend, and dx_hw. Then put the dll
-in the modules Directory.
-
-To run the tool outside VC++, copy the V4Studio.exe file in a PATH and copy the
-rc directory into the same PATH. The program should run without error messages.
-
-If GPAC has been compiled with ECMAScript support, you will
-also have to copy the js32.dll into the execution directory (or any directory in
-the machine PATH)
-
-Other platforms:
-To be tested ...
\ No newline at end of file
+++ /dev/null
-#include "wx/msw/wx.rc"
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<resource version="2.3.0.1">
- <object class="wxMenuBar" name="MB_V4STUDIO">
- <object class="wxMenu" name="Menu_1">
- <label>_File</label>
- <object class="wxMenuItem" name="MENU_FILE_NEW">
- <label>_New\tCtrl+N</label>
- <help>Create a new document</help>
- </object>
- <object class="wxMenuItem" name="MENU_FILE_OPEN">
- <label>_Open...\tCtrl+O</label>
- <help>Open an existing document</help>
- </object>
- <object class="wxMenuItem" name="MENU_FILE_SAVE">
- <label>_Save\tCtrl+S</label>
- <help>Save the active document</help>
- </object>
- <object class="separator"/>
- <object class="wxMenuItem" name="MENU_FILE_QUIT">
- <label>E_xit</label>
- <help>Quit the application; prompts to save documents</help>
- </object>
- </object>
- <object class="wxMenu" name="Menu_2">
- <label>_Edit</label>
- <object class="wxMenuItem" name="wxID_UNDO">
- <label>_Undo\tCtrl+Z</label>
- <help>Undo the last action</help>
- </object>
- <object class="wxMenuItem" name="ID_EDIT_REDO">
- <label>_Redo\tCtrl+Y</label>
- <help>Redo the previously undone action</help>
- </object>
- <object class="separator"/>
- <object class="wxMenuItem" name="wxID_CUT">
- <label>Cu_t\tCtrl+X</label>
- <help>Cut the selection and put it on the Clipboard</help>
- </object>
- <object class="wxMenuItem" name="wxID_COPY">
- <label>_Copy\tCtrl+C</label>
- <help>Copy the selection and put it on the Clipboard</help>
- </object>
- <object class="wxMenuItem" name="wxID_PASTE">
- <label>_Paste\tCtrl+V</label>
- <help>Insert Clipboard contents</help>
- </object>
- <object class="wxMenuItem" name="ID_EDIT_DELETE">
- <label>_Delete\tDel</label>
- <help>Delete the selection</help>
- </object>
- </object>
- <object class="wxMenu" name="Menu_3">
- <label>_View</label>
- <object class="wxMenuItem" name="ID_VIEW_SCENE_TREE">
- <label>Scene _Tree</label>
- <help>Show or hide the Scene Tree</help>
- </object>
- <object class="wxMenuItem" name="ID_VIEW_SCENE_GRAPH">
- <label>_Route View</label>
- <help>Show or hide the GF_Route View</help>
- </object>
- <object class="wxMenuItem" name="ID_VIEW_FIELD_VIEW">
- <label>_Field View</label>
- <help>Show or hide the Field View</help>
- </object>
- </object>
- <object class="wxMenu" name="Menu_5">
- <label>_Help</label>
- <object class="wxMenuItem" name="wxID_ABOUT">
- <label>_About V4Studio</label>
- <help>Display program information, version number and copyright</help>
- </object>
- </object>
- </object>
-</resource>
+++ /dev/null
-#ifndef _SAFE_INCLUDE_H
-#define _SAFE_INCLUDE_H
-
-#include <gpac/setup.h>
-
-#endif
-
+++ /dev/null
-/* XPM */
-static char *icon1_xpm[] = {
-/* width height num_colors chars_per_pixel */
-" 32 32 2 1",
-/* colors */
-". c #000000",
-"# c #ffffff",
-/* pixels */
-"################################",
-"################################",
-"####................############",
-"####................############",
-"####..############....##########",
-"####..############....##########",
-"####..##..##..####..##..########",
-"####..##..##..####..##..########",
-"####..############........######",
-"####..############........######",
-"####..##..##..##########..######",
-"####..##..##..##########..######",
-"####..##################..######",
-"###...##################..######",
-"####..##..##..##..##..##..######",
-"####..##..##..##..##..##..######",
-"####..##################..######",
-"####..##################..######",
-"####..##..##..##..##..##..######",
-"####..##..##..##..##..##..######",
-"####..##################..######",
-"####..##################..######",
-"####..##..##..##..##..##..######",
-"####..##..##..##..##..##..######",
-"####..##################..######",
-"####..##################..######",
-"####......................######",
-"####......................######",
-"################################",
-"################################",
-"################################",
-"################################"
-};
+++ /dev/null
-/* XPM */
-static char *icon2_xpm[] = {
-/* width height num_colors chars_per_pixel */
-" 32 32 3 1",
-/* colors */
-". c #000000",
-"# c #ff0000",
-"a c None",
-/* pixels */
-"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
-"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
-"aaaa................aaaaaaaaaaaa",
-"aaaa................aaaaaaaaaaaa",
-"aaaa..############....aaaaaaaaaa",
-"aaaa..############....aaaaaaaaaa",
-"aaaa..##..##..####..aa..aaaaaaaa",
-"aaaa..##..##..####..aa..aaaaaaaa",
-"aaaa..############........aaaaaa",
-"aaaa..############........aaaaaa",
-"aaaa..##..##..##########..aaaaaa",
-"aaaa..##..##..##########..aaaaaa",
-"aaaa..##################..aaaaaa",
-"aaaa..##################..aaaaaa",
-"aaaa..##..##..##..##..##..aaaaaa",
-"aaaa..##..##..##..##..##..aaaaaa",
-"aaaa..##################..aaaaaa",
-"aaaa..##################..aaaaaa",
-"aaaa..##..##..##..##..##..aaaaaa",
-"aaaa..##..##..##..##..##..aaaaaa",
-"aaaa..##################..aaaaaa",
-"aaaa..##################..aaaaaa",
-"aaaa..##..##..##..##..##..aaaaaa",
-"aaaa..##..##..##..##..##..aaaaaa",
-"aaaa..##################..aaaaaa",
-"aaaa..##################..aaaaaa",
-"aaaa......................aaaaaa",
-"aaaa......................aaaaaa",
-"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
-"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
-"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
-"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
-};
+++ /dev/null
-/* XPM */
-static char *icon3_xpm[] = {
-/* width height num_colors chars_per_pixel */
-" 32 32 5 1",
-/* colors */
-". c #000000",
-"# c #c0c0c0",
-"a c #808080",
-"b c #ffff00",
-"c c None",
-/* pixels */
-"cccccccccccccccccccccccccccccccc",
-"cccccccccccccccccccccccccccccccc",
-"ccccccaaaaaaaaaacccccccccccccccc",
-"ccccccaaaaaaaaaacccccccccccccccc",
-"ccccaabb##bb##bbaacccccccccccccc",
-"ccccaabb##bb##bbaacccccccccccccc",
-"ccaabb##bb##bb##bbaaaaaaaaaaaacc",
-"ccaabb##bb##bb##bbaaaaaaaaaaaacc",
-"ccaaccccccccccccccccccccccccaa..",
-"ccaaccccccccccccccccccccccccaa..",
-"ccaaccbb##bb##bb##bb##bb##bbaa..",
-"ccaaccbb##bb##bb##bb##bb##bbaa..",
-"ccaacc##bb##bb##bb##bb##bb##aa..",
-"ccaacc##bb##bb##bb##bb##bb##aa..",
-"ccaaccbb##bb##bb##bb##bb##bbaa..",
-"ccaaccbb##bb##bb##bb##bb##bbaa..",
-"ccaacc##bb##bb##bb##bb##bb##aa..",
-"ccaacc##bb##bb##bb##bb##bb##aa..",
-"ccaaccbb##bb##bb##bb##bb##bbaa..",
-"ccaaccbb##bb##bb##bb##bb##bbaa..",
-"ccaacc##bb##bb##bb##bb##bb##aa..",
-"ccaacc##bb##bb##bb##bb##bb##aa..",
-"ccaaccbb##bb##bb##bb##bb##bbaa..",
-"ccaaccbb##bb##bb##bb##bb##bbaa..",
-"ccaaaaaaaaaaaaaaaaaaaaaaaaaaaa..",
-"ccaaaaaaaaaaaaaaaaaaaaaaaaaaaa..",
-"cccc............................",
-"cccc............................",
-"cccccccccccccccccccccccccccccccc",
-"cccccccccccccccccccccccccccccccc",
-"cccccccccccccccccccccccccccccccc",
-"cccccccccccccccccccccccccccccccc"
-};
+++ /dev/null
-/* XPM */
-static char *icon4_xpm[] = {
-/* width height num_colors chars_per_pixel */
-" 32 32 5 1",
-/* colors */
-". c #000000",
-"# c #c0c0c0",
-"a c #808080",
-"b c #ff0000",
-"c c #ffffff",
-/* pixels */
-"cccccccccccccccccccccccccccccccc",
-"cccccccccccccccccccccccccccccccc",
-"ccccccaaaaaaaaaacccccccccccccccc",
-"ccccccaaaaaaaaaacccccccccccccccc",
-"ccccaabb##bb##bbaacccccccccccccc",
-"ccccaabb##bb##bbaacccccccccccccc",
-"ccaabb##bb##bb##bbaaaaaaaaaaaacc",
-"ccaabb##bb##bb##bbaaaaaaaaaaaacc",
-"ccaaccccccccccccccccccccccccaa..",
-"ccaaccccccccccccccccccccccccaa..",
-"ccaaccbb##bb##bb##bb##bb##bbaa..",
-"ccaaccbb##bb##bb##bb##bb##bbaa..",
-"ccaacc##bb##bb##bb##bb##bb##aa..",
-"ccaacc##bb##bb##bb##bb##bb##aa..",
-"ccaaccbb##bb##bb##bb##bb##bbaa..",
-"ccaaccbb##bb##bb##bb##bb##bbaa..",
-"ccaacc##bb##bb##bb##bb##bb##aa..",
-"ccaacc##bb##bb##bb##bb##bb##aa..",
-"ccaaccbb##bb##bb##bb##bb##bbaa..",
-"ccaaccbb##bb##bb##bb##bb##bbaa..",
-"ccaacc##bb##bb##bb##bb##bb##aa..",
-"ccaacc##bb##bb##bb##bb##bb##aa..",
-"ccaaccbb##bb##bb##bb##bb##bbaa..",
-"ccaaccbb##bb##bb##bb##bb##bbaa..",
-"ccaaaaaaaaaaaaaaaaaaaaaaaaaaaa..",
-"ccaaaaaaaaaaaaaaaaaaaaaaaaaaaa..",
-"cccc............................",
-"cccc............................",
-"cccccccccccccccccccccccccccccccc",
-"cccccccccccccccccccccccccccccccc",
-"cccccccccccccccccccccccccccccccc",
-"cccccccccccccccccccccccccccccccc"
-};
+++ /dev/null
-/* XPM */
-static char *icon5_xpm[] = {
-/* width height num_colors chars_per_pixel */
-" 32 32 4 1",
-/* colors */
-". c #000000",
-"# c #808000",
-"a c None",
-"b c #ffff00",
-/* pixels */
-"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
-"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
-"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
-"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
-"aa..........aaaaaaaaaaaaaaaaaaaa",
-"aa..........aaaaaaaaaaaaaaaaaaaa",
-"aa..bbbbbb................aaaaaa",
-"aa..bbbbbb................aaaaaa",
-"aa..bbbbbbbbbbbbbbbbbbbb..aaaaaa",
-"aa..bbbbbbbbbbbbbbbbbbbb..aaaaaa",
-"aa..bbbbbbbbbbbbbbbbbbbb..aaaaaa",
-"aa..bbbbbbbbbbbbbbbbbbbb..aaaaaa",
-"aa..bbbb......................aa",
-"aa..bbbb......................aa",
-"aa..bbb.####################..aa",
-"aa..bbb.####################..aa",
-"aa..bb..####################.aaa",
-"aa..bb..####################.aaa",
-"aa..b.####################..aaaa",
-"aa..b.####################..aaaa",
-"aa....####################.aaaaa",
-"aa....####################.aaaaa",
-"aa..####################..aaaaaa",
-"aa..####################..aaaaaa",
-"aa......................aaaaaaaa",
-"aa......................aaaaaaaa",
-"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
-"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
-"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
-"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
-"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
-"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
-};
+++ /dev/null
-#include "safe_include.h"
-#include <gpac/terminal.h>
-#include <gpac/options.h>
-
-#include "wx/wxprec.h"
-
-#ifndef WX_PRECOMP
- #include "wx/wx.h"
-#endif
-
-#include "wxGPACPanel.h"
-#include "V4StudioFrame.h"
-#include "V4StudioApp.h"
-#include "V4Service.h"
-
-
-bool GPACInit(void *application, GF_Terminal **term, GF_User *user, bool quiet);
-
-wxGPACPanel::wxGPACPanel(V4SceneManager *parent, const char *path)
-{
- this->parent = parent;
- m_term = NULL;
- m_pService = NULL;
-
- // Initializes the MPEG-4 terminal
- GPACInit(this, &m_term, &m_user, true);
- if (!m_term) return;
-
- // Setting all the variables needed for picking of objects.
- m_iDragging = 0;
- m_transformMode = 0;
- dragX = dragY = 0;
- picked = NULL;
-
- if (path) {
- m_pService = new V4Service(path);
- gf_term_attach_service(m_term, m_pService->GetServiceInterface());
- }
-}
-
-wxGPACPanel::~wxGPACPanel()
-{
- if (m_pService) delete m_pService;
- if (m_term) gf_term_del(m_term);
- if (m_user.modules) gf_modules_del(m_user.modules);
- if (m_user.config) gf_cfg_del(m_user.config);
-}
-
-
-Bool V4S_EventProc(void *par, GF_Event *evt)
-{
- wxGPACPanel *panel = (wxGPACPanel *)par;
- if (!panel->GetMPEG4Terminal()) return 0;
-
- switch (evt->type) {
- case GF_EVENT_REFRESH:
- gf_term_set_option(panel->GetMPEG4Terminal(), GF_OPT_REFRESH, 0);
- break;
- case GF_EVENT_SCENE_SIZE:
- case GF_EVENT_SIZE:
- gf_sc_set_size(panel->GetSceneCompositor(), evt->size.width, evt->size.height);
- panel->Update();
- break;
- case GF_EVENT_MOUSEDOWN:
- if (evt->mouse.button==GF_MOUSE_LEFT) {
- panel->picked = gf_sc_pick_node(panel->GetSceneCompositor(), evt->mouse.x, evt->mouse.y);
- panel->m_iDragging ++;
- if (panel->picked) {
- panel->GetV4SceneManager()->GetV4StudioFrame()->GetTreeView()->SetSelectedItem(panel->picked);
- panel->dragX = evt->mouse.x;
- panel->dragY = evt->mouse.y;
- panel->m_transformMode = 0;
- }
- }
- else if (evt->mouse.button==GF_MOUSE_MIDDLE) {
- panel->m_iDragging ++;
- panel->picked = gf_sc_pick_node(panel->GetSceneCompositor(), evt->mouse.x, evt->mouse.y);
- if (panel->picked) {
- panel->GetV4SceneManager()->GetV4StudioFrame()->GetTreeView()->SetSelectedItem(panel->picked);
- panel->dragX = evt->mouse.x;
- panel->dragY = evt->mouse.y;
- panel->m_transformMode = 2;
- }
- }
- else if (evt->mouse.button==GF_MOUSE_RIGHT) {
- panel->m_iDragging ++;
- panel->picked = gf_sc_pick_node(panel->GetSceneCompositor(), evt->mouse.x, evt->mouse.y);
- if (panel->picked) {
- panel->GetV4SceneManager()->GetV4StudioFrame()->GetTreeView()->SetSelectedItem(panel->picked);
- panel->dragX = evt->mouse.x;
- panel->dragY = evt->mouse.y;
- panel->m_transformMode = 1;
- }
- }
- break;
- case GF_EVENT_MOUSEUP:
- if (evt->mouse.button==GF_MOUSE_LEFT) {
- panel->m_iDragging --;
- if (panel->picked) {
- int dX = evt->mouse.x - panel->dragX;
- int dY = evt->mouse.y - panel->dragY;
- panel->dragX = evt->mouse.x;
- panel->dragY = evt->mouse.y;
- wxString pos;
- pos << dX;
- pos << ',';
- pos << dY;
- panel->GetV4SceneManager()->GetV4StudioFrame()->GetTreeView()->Translate(dX,dY);
- panel->GetV4SceneManager()->GetV4StudioFrame()->GetStatusBar()->SetStatusText(pos);
- }
- }
- else if (evt->mouse.button==GF_MOUSE_MIDDLE) {
- panel->m_iDragging --;
- if (panel->picked) {
- int dX = evt->mouse.x - panel->dragX;
- int dY = evt->mouse.y - panel->dragY;
- panel->dragX = evt->mouse.x;
- panel->dragY = evt->mouse.y;
- wxString pos;
- pos << dX;
- pos << ',';
- pos << dY;
- panel->GetV4SceneManager()->GetV4StudioFrame()->GetTreeView()->Rotate(dX,dY);
- panel->GetV4SceneManager()->GetV4StudioFrame()->GetStatusBar()->SetStatusText(pos);
- }
- }
- else if (evt->mouse.button==GF_MOUSE_RIGHT) {
- panel->m_iDragging --;
- if (panel->picked) {
- int dX = evt->mouse.x - panel->dragX;
- int dY = evt->mouse.y - panel->dragY;
- panel->dragX = evt->mouse.x;
- panel->dragY = evt->mouse.y;
- wxString pos;
- pos << dX;
- pos << ',';
- pos << dY;
- panel->GetV4SceneManager()->GetV4StudioFrame()->GetTreeView()->Scale(dX,dY);
- panel->GetV4SceneManager()->GetV4StudioFrame()->GetStatusBar()->SetStatusText(pos);
- }
- }
- break;
- case GF_EVENT_MOUSEMOVE:
- {
- wxString pos;
- if (panel->picked && panel->m_iDragging) {
- int dX = evt->mouse.x - panel->dragX;
- int dY = evt->mouse.y - panel->dragY;
- panel->dragX = evt->mouse.x;
- panel->dragY = evt->mouse.y;
- pos << dX;
- pos << ',';
- pos << dY;
- switch (panel->m_transformMode) {
- case 0:
- panel->GetV4SceneManager()->GetV4StudioFrame()->GetTreeView()->Translate(dX,dY);
- break;
- case 1:
- panel->GetV4SceneManager()->GetV4StudioFrame()->GetTreeView()->Scale(dX,dY);
- break;
- case 2:
- panel->GetV4SceneManager()->GetV4StudioFrame()->GetTreeView()->Rotate(dX,dY);
- break;
- }
- } else {
- pos << evt->mouse.x;
- pos << ',';
- pos << evt->mouse.y;
- }
- panel->GetV4SceneManager()->GetV4StudioFrame()->GetStatusBar()->SetStatusText(pos);
- }
- break;
- case GF_EVENT_QUIT:
- panel->GetV4SceneManager()->GetV4StudioFrame()->Close(TRUE);
- break;
- }
- return 0;
-}
-
-void wxGPACPanel::Update()
-{
- if (m_term) {
- //gf_term_set_option(m_term, GF_OPT_PLAY_STATE, GF_STATE_STEP_PAUSE);
- gf_sc_invalidate(m_term->compositor, NULL);
- gf_sc_draw_frame(m_term->compositor);
- }
-}
-
-bool GPACInit(void *application, GF_Terminal **term, GF_User *user, bool quiet)
-{
- memset(user, 0, sizeof(GF_User));
-
- /*locate exec dir for cfg file*/
- wxPathList pathList;
- wxString currentDir(wxGetCwd());
- wxString abs_gpac_path = "";
- const char *gpac_cfg;
-
- if (!quiet) ::wxLogMessage("Looking for GPAC configuration file");
-
-#if defined(__WXMAC__) && !defined(__DARWIN__)
- // On Mac, the current directory is the relevant one when the application starts.
- abs_gpac_path = wxGetCwd();
- gpac_cfg = "GPAC.cfg";
-#else
-
-#ifdef WIN32
- V4StudioApp &app = wxGetApp();
- gpac_cfg = "GPAC.cfg";
- /*locate exe*/
- if (wxIsAbsolutePath(app.argv[0])) {
- abs_gpac_path = wxPathOnly(app.argv[0]);
- } else {
- if (currentDir.Last() != wxFILE_SEP_PATH) currentDir += wxFILE_SEP_PATH;
- abs_gpac_path = currentDir + app.argv[0];
- if (wxFileExists(abs_gpac_path)) {
- abs_gpac_path = wxPathOnly(abs_gpac_path);
- } else {
- abs_gpac_path = "";
- pathList.AddEnvList(wxT("PATH"));
- abs_gpac_path = pathList.FindAbsoluteValidPath(app.argv[0]);
- if (!abs_gpac_path.IsEmpty()) {
- abs_gpac_path = wxPathOnly(abs_gpac_path);
- } else {
- /*ask user*/
- wxDirDialog dlg(NULL, "Locate GPAC config file directory");
- if ( dlg.ShowModal() != wxID_OK ) return 0;
- abs_gpac_path = dlg.GetPath();
- }
- }
- }
-#else
- gpac_cfg = ".gpacrc";
- char *cfg_dir = getenv("HOME");
- if (cfg_dir) {
- abs_gpac_path = cfg_dir;
- } else {
- /*ask user*/
- wxDirDialog dlg(NULL, "Locate GPAC config file directory");
- if ( dlg.ShowModal() != wxID_OK ) return 0;
- abs_gpac_path = dlg.GetPath();
- }
-
-#endif
-
-#endif
-
- /*load config*/
- Bool first_launch = 0;
- user->config = gf_cfg_init(NULL, &first_launch);
-
- if (!user->config) {
- wxMessageDialog(NULL, "Cannot create GPAC config file", "Init error", wxOK).ShowModal();
- }
- if (!quiet) ::wxLogMessage("GPAC configuration file opened - looking for modules");
- const char *str = gf_cfg_get_key(user->config, "General", "ModulesDirectory");
- user->modules = gf_modules_new(str, user->config);
-
- if (! gf_modules_get_count(user->modules) ) {
- wxMessageDialog(NULL, "No modules available - system cannot work", "Fatal Error", wxOK).ShowModal();
- gf_modules_del(user->modules);
- gf_cfg_del(user->config);
- return 0;
- }
-
- if (!quiet) ::wxLogMessage("%d modules found:", gf_modules_get_count(user->modules));
- for (u32 i=0; i<gf_modules_get_count(user->modules); i++) {
- if (!quiet) ::wxLogMessage("\t%s", gf_modules_get_file_name(user->modules, i));
- }
-
- if (!quiet) ::wxLogMessage("Starting GPAC Terminal");
- /*now load terminal*/
- user->opaque = application;
- user->EventProc = V4S_EventProc;
-// user->os_window_handler = ((wxGPACPanel *)application)->GetV4SceneManager()->GetV4StudioFrame()->GetHandle();
-
- // Forces the renderer to not use a thread and do the rendering by itfe
- gf_cfg_set_key(user->config, "Systems", "NoVisualThread", "No");
-
- *term = gf_term_new(user);
- if (!*term) {
- wxMessageDialog(NULL, "Fatal Error", "Cannot load GPAC Terminal", wxOK).ShowModal();
- return 0;
- } else {
- if (!quiet) ::wxLogMessage("GPAC Terminal started");
- }
-
- return 1;
-}
-
+++ /dev/null
-#ifndef _GPACPANEL_H
-#define _GPACPANEL_H
-
-
-#include "safe_include.h"
-#include <gpac/scenegraph.h>
-#include <gpac/compositor.h>
-/*for service connection...*/
-#include <gpac/internal/terminal_dev.h>
-
-class V4SceneManager;
-class V4Service;
-
-class wxGPACPanel
-{
-
-public :
- // Constructor / Desctructor
- wxGPACPanel(V4SceneManager *parent, const char *path);
- ~wxGPACPanel();
-
- // Access to private members
- GF_Terminal *GetMPEG4Terminal() { return m_term; }
- GF_Compositor *GetSceneCompositor() { return m_term->compositor; }
- V4SceneManager *GetV4SceneManager() { return parent; }
- //
- void Update();
-
- // Variables used for drag, drop, move, ... picking ...
- s32 m_iDragging;
- u32 m_transformMode; // 0 Move, 1 Scale, 2 Rotate
- GF_Node *picked;
- u32 dragX, dragY;
-
-private:
- void TranslateCoordinates(long x, long y, int &sceneX, int &sceneY);
-
- V4SceneManager *parent;
-
- GF_Terminal *m_term;
- GF_User m_user;
-
- V4Service *m_pService;
-};
-
-#endif
case "$opt" in
--prefix=*) prefix=`echo $opt | cut -d '=' -f 2`
;;
+ --libdir=*) libdir=`echo $opt | cut -d '=' -f 2`
+ ;;
--mandir=*) mandir=`echo $opt | cut -d '=' -f 2`
;;
--source-path=*) source_path=`echo $opt | cut -d '=' -f 2`
if [ x"$canon_arch" = x"x86_64" -o x"$canon_arch" = x"amd64" ]; then
if [ -z "`echo $CFLAGS | grep -- -m32`" ]; then
cpu="x86_64"
- if test "$linux" = "yes" ; then
- libdir="lib64"
- fi
want_pic="yes"
fi
fi
;;
ppc64)
cpu="powerpc"
- libdir="lib64"
;;
"Power Macintosh"|ppc)
cpu="powerpc"