--- libogmrip/ogmrip-mp4.c.orig Tue Jan 27 10:16:22 2009 +++ libogmrip/ogmrip-mp4.c Tue Jan 6 13:08:59 2009 @@ -22,7 +22,9 @@ #include "ogmrip-fs.h" #include "ogmrip-mp4.h" +#include "ogmrip-mplayer.h" #include "ogmrip-plugin.h" +#include "ogmrip-version.h" #include "ogmjob-exec.h" #include "ogmjob-queue.h" @@ -216,15 +218,36 @@ } static gchar ** -ogmrip_mp4_extract_command (OGMRipVideoCodec *video) +ogmrip_mp4_extract_command (OGMRipVideoCodec *video, const gchar *output) { GPtrArray *argv; const gchar *filename; argv = g_ptr_array_new (); - g_ptr_array_add (argv, g_strdup (PROGRAM)); - g_ptr_array_add (argv, g_strdup ("-aviraw")); - g_ptr_array_add (argv, g_strdup ("video")); + g_ptr_array_add (argv, g_strdup ("mencoder")); + g_ptr_array_add (argv, g_strdup ("-nocache")); + g_ptr_array_add (argv, g_strdup ("-noskip")); + + if (MPLAYER_CHECK_VERSION (1,0,3,0)) + { + g_ptr_array_add (argv, g_strdup ("-noconfig")); + g_ptr_array_add (argv, g_strdup ("all")); + } + + g_ptr_array_add (argv, g_strdup ("-mc")); + g_ptr_array_add (argv, g_strdup ("0")); + + g_ptr_array_add (argv, g_strdup ("-nosound")); + g_ptr_array_add (argv, g_strdup ("-ovc")); + g_ptr_array_add (argv, g_strdup ("copy")); + + g_ptr_array_add (argv, g_strdup ("-of")); + g_ptr_array_add (argv, g_strdup ("lavf")); + g_ptr_array_add (argv, g_strdup ("-lavfopts")); + g_ptr_array_add (argv, g_strdup ("format=mp4")); + + g_ptr_array_add (argv, g_strdup ("-o")); + g_ptr_array_add (argv, g_strdup (output)); filename = ogmrip_codec_get_output (OGMRIP_CODEC (video)); g_ptr_array_add (argv, g_strdup (filename)); @@ -234,16 +257,22 @@ return (gchar **) g_ptr_array_free (argv, FALSE); } -static gdouble -ogmrip_mp4_extract_watch (OGMJobExec *exec, const gchar *buffer, OGMRipContainer *mp4) +static gint +ogmrip_mp4_get_n_audio_files (OGMRipContainer *mp4) { - gchar *sep; - guint percent; + GSList *files, *file; + guint n_audio = 0; - if ((sep = strrchr (buffer, '(')) && sscanf (sep, "(%u/100)", &percent) == 1) - return percent / 100.0; + files = ogmrip_container_get_files (mp4); + for (file = files; file; file = file->next) + { + if (ogmrip_file_get_type (OGMRIP_FILE (file->data)) == OGMRIP_FILE_TYPE_AUDIO) + n_audio ++; + } - return -1.0; + g_slist_free (files); + + return n_audio; } static gchar ** @@ -282,6 +311,11 @@ argv = g_ptr_array_new (); g_ptr_array_add (argv, g_strdup (PROGRAM)); + + if (ogmrip_container_get_n_audio (mp4) + ogmrip_mp4_get_n_audio_files (mp4) <= 1) + g_ptr_array_add (argv, g_strdup ("-isma")); + + g_ptr_array_add (argv, g_strdup ("-nodrop")); g_ptr_array_add (argv, g_strdup ("-new")); g_ptr_array_add (argv, g_strdup ("-brand")); @@ -412,22 +446,6 @@ mp4->priv = OGMRIP_MP4_GET_PRIVATE (mp4); } -static gchar * -ogmrip_mp4_get_h264_filename (OGMRipVideoCodec *video) -{ - const gchar *name; - gchar *dot, *filename; - - name = ogmrip_codec_get_output (OGMRIP_CODEC (video)); - dot = strrchr (name, '.'); - - filename = g_new0 (gchar, dot - name + 12); - strncpy (filename, name, dot - name); - strcat (filename, "_video.h264"); - - return filename; -} - static void ogmrip_mp4_get_n_vobsub (OGMRipContainer *container, OGMRipCodec *codec, guint demuxer, gint language, gint *nvobsub) { @@ -461,16 +479,16 @@ video = ogmrip_container_get_video (OGMRIP_CONTAINER (spawn)); if (ogmrip_plugin_get_video_codec_format (G_TYPE_FROM_INSTANCE (video)) == OGMRIP_FORMAT_H264) { - argv = ogmrip_mp4_extract_command (video); + filename = ogmrip_fs_mktemp ("video.XXXXXX", NULL); + + argv = ogmrip_mp4_extract_command (video, filename); if (!argv) return OGMJOB_RESULT_ERROR; child = ogmjob_exec_newv (argv); - ogmjob_exec_add_watch_full (OGMJOB_EXEC (child), (OGMJobWatch) ogmrip_mp4_extract_watch, spawn, TRUE, FALSE, FALSE); + ogmjob_exec_add_watch_full (OGMJOB_EXEC (child), (OGMJobWatch) ogmrip_mencoder_container_watch, spawn, TRUE, FALSE, FALSE); ogmjob_container_add (OGMJOB_CONTAINER (queue), child); g_object_unref (child); - - filename = ogmrip_mp4_get_h264_filename (video); } argv = ogmrip_mp4_create_command (OGMRIP_CONTAINER (spawn), filename, output);