]> granicus.if.org Git - libx264/commitdiff
GTK: fix avs input
authorLoren Merritt <pengvado@videolan.org>
Sun, 26 Mar 2006 20:54:33 +0000 (20:54 +0000)
committerLoren Merritt <pengvado@videolan.org>
Sun, 26 Mar 2006 20:54:33 +0000 (20:54 +0000)
patch by Vincent Torri.

git-svn-id: svn://svn.videolan.org/x264/trunk@485 df754926-b1dd-0310-bc7b-ec298dee348c

gtk/x264_gtk_demuxers.h [new file with mode: 0644]
gtk/x264_gtk_encode_encode.c
gtk/x264_gtk_encode_main_window.c
gtk/x264_gtk_encode_private.h

diff --git a/gtk/x264_gtk_demuxers.h b/gtk/x264_gtk_demuxers.h
new file mode 100644 (file)
index 0000000..cc1056d
--- /dev/null
@@ -0,0 +1,17 @@
+#ifndef __X264_GTK_MUXERS_H__
+#define __X264_GTK_MUXERS_H__
+
+#include "../config.h"
+#include "../muxers.h"
+
+typedef enum {
+  X264_DEMUXER_YUV    = 0,
+  X264_DEMUXER_CIF,
+  X264_DEMUXER_QCIF,
+  X264_DEMUXER_AVI,
+  X264_DEMUXER_AVS,
+  X264_DEMUXER_UNKOWN
+} X264_Demuxer_Type;
+/* static int X264_Num_Demuxers = (int)X264_DEMUXER_UNKOWN; */
+
+#endif  /* __X264_GTK_MUXERS_H__ */
index 2c9617072bb0d80b0b544769a64ffb7eab07eee1..e23bc6679133807217a859efb14b1a59b0dca464 100644 (file)
@@ -7,9 +7,8 @@
 
 #include <gtk/gtk.h>
 
-#include "../config.h"
 #include "../x264.h"
-#include "../muxers.h"
+#include "x264_gtk_demuxers.h"
 #include "x264_gtk_encode_private.h"
 
 
@@ -31,7 +30,7 @@ static int (*p_write_nalu)        (void *handle, uint8_t *p_nal, int i_size);
 static int (*p_set_eop)           (void *handle, x264_picture_t *p_picture);
 static int (*p_close_outfile)     (void *handle);
 
-static int _set_drivers  (gint int_container, gint out_container);
+static int _set_drivers  (X264_Demuxer_Type in_container, gint out_container);
 static int _encode_frame (x264_t *h, void *handle, x264_picture_t *pic);
 
 
@@ -186,12 +185,12 @@ x264_gtk_encode_encode (X264_Thread_Data *thread_data)
 }
 
 static int
-_set_drivers (gint in_container, gint out_container)
+_set_drivers (X264_Demuxer_Type in_container, gint out_container)
 {
   switch (in_container) {
-  case 0: /* YUV */
-  case 1: /* CIF */
-  case 2: /* QCIF */
+  case X264_DEMUXER_YUV:
+  case X264_DEMUXER_CIF:
+  case X264_DEMUXER_QCIF:
       /*   Default input file driver */
       p_open_infile = open_file_yuv;
       p_get_frame_total = get_frame_total_yuv;
@@ -199,8 +198,8 @@ _set_drivers (gint in_container, gint out_container)
       p_close_infile = close_file_yuv;
       break;
 #ifdef AVIS_INPUT
-    case 3: /* AVI */
-    case 4: /* AVS */
+    case X264_DEMUXER_AVI:
+    case X264_DEMUXER_AVS:
       p_open_infile = open_file_avis;
       p_get_frame_total = get_frame_total_avis;
       p_read_frame = read_frame_avis;
index 04cee7e4fbd8bd445e6a351d9cacce6502517d9c..e273e39a90ccebd1886b68c071698570314a5aec 100644 (file)
@@ -7,14 +7,17 @@
 #ifdef _WIN32 /* Needed to define _O_BINARY */
 #  include <fcntl.h>
 #endif
+#include <errno.h>
+#include <string.h>
+#include <sys/stat.h>  /* For stat */
 
 #include <gtk/gtk.h>
 
 #include "../x264.h"
 #include "../config.h"
-#include "../muxers.h"
 #include "x264_icon.h"
 #include "x264_gtk.h"
+#include "x264_gtk_demuxers.h"
 #include "x264_gtk_encode_private.h"
 #include "x264_gtk_encode_encode.h"
 #include "x264_gtk_encode_status_window.h"
@@ -24,21 +27,22 @@ typedef struct X264_Gtk_Encode_ X264_Gtk_Encode;
 
 struct X264_Gtk_Encode_
 {
-  GtkWidget *main_dialog;
+  GtkWidget         *main_dialog;
 
   /* input */
-  gint       container;
-  GtkWidget *file_input;
-  GtkWidget *width;
-  GtkWidget *height;
-  GtkWidget *fps_num;
-  GtkWidget *fps_den;
-  GtkWidget *frame_count;
+  X264_Demuxer_Type  container;
+  guint64            size; /* For YUV formats */
+  GtkWidget         *file_input;
+  GtkWidget         *width;
+  GtkWidget         *height;
+  GtkWidget         *fps_num;
+  GtkWidget         *fps_den;
+  GtkWidget         *frame_count;
   
   /* output */
-  GtkWidget *path_output;
-  GtkWidget *file_output;
-  GtkWidget *combo;
+  GtkWidget         *path_output;
+  GtkWidget         *file_output;
+  GtkWidget         *combo;
 };
 
 
@@ -48,18 +52,33 @@ static gboolean _delete_window_cb    (GtkWidget *widget,
                                       gpointer   user_data);
 static void     _configure_window_cb (GtkButton *button,
                                       gpointer   user_data);
-static void     _chooser_window_cb  (GtkDialog *dialog,
+static void     _chooser_window_cb   (GtkDialog *dialog,
                                       gint       res,
                                       gpointer   user_data);
 static void     _response_window_cb  (GtkDialog *dialog,
                                       gint       res,
                                       gpointer   user_data);
-
+static void     _dimension_entry_cb  (GtkEditable *editable,
+                                      gpointer     user_data);
 
 static gboolean _fill_status_window (GIOChannel  *io,
                                      GIOCondition condition,
                                      gpointer     user_data);
 /* Code */
+guint64
+_file_size(const char* name)
+{
+  struct stat buf;
+  memset(&buf, 0, sizeof(struct stat));
+
+  if (stat(name, &buf) < 0)
+  {
+    fprintf(stderr, "Can't stat file\n");
+    return 0;
+  }
+  return buf.st_size;
+}
+
 void
 x264_gtk_encode_main_window ()
 {
@@ -182,8 +201,11 @@ x264_gtk_encode_main_window ()
   gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 1, 1, 2);
   gtk_widget_show (label);
 
-  encode->width = gtk_entry_new_with_max_length (4095);
+  encode->width = gtk_entry_new_with_max_length (255);
   gtk_entry_set_text (GTK_ENTRY (encode->width), "352");
+  g_signal_connect_after(G_OBJECT (encode->width), "changed",
+                   G_CALLBACK (_dimension_entry_cb),
+                   encode);
   gtk_table_attach_defaults (GTK_TABLE (table), encode->width, 1, 2, 1, 2);
   gtk_widget_show (encode->width);
 
@@ -192,9 +214,12 @@ x264_gtk_encode_main_window ()
   gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 1, 2, 3);
   gtk_widget_show (label);
 
-  encode->height = gtk_entry_new_with_max_length (4095);
+  encode->height = gtk_entry_new_with_max_length (255);
   gtk_entry_set_text (GTK_ENTRY (encode->height), "288");
   gtk_table_attach_defaults (GTK_TABLE (table), encode->height, 1, 2, 2, 3);
+  g_signal_connect_after(G_OBJECT (encode->height), "changed",
+                   G_CALLBACK (_dimension_entry_cb),
+                   encode);
   gtk_widget_show (encode->height);
 
   label = gtk_label_new ("Frame rate num:");
@@ -202,7 +227,7 @@ x264_gtk_encode_main_window ()
   gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 1, 3, 4);
   gtk_widget_show (label);
 
-  encode->fps_num = gtk_entry_new_with_max_length (4095);
+  encode->fps_num = gtk_entry_new_with_max_length (255);
   gtk_entry_set_text (GTK_ENTRY (encode->fps_num), "25");
   gtk_table_attach_defaults (GTK_TABLE (table), encode->fps_num, 1, 2, 3, 4);
   gtk_widget_show (encode->fps_num);
@@ -212,7 +237,7 @@ x264_gtk_encode_main_window ()
   gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 1, 4, 5);
   gtk_widget_show (label);
 
-  encode->fps_den = gtk_entry_new_with_max_length (4095);
+  encode->fps_den = gtk_entry_new_with_max_length (255);
   gtk_entry_set_text (GTK_ENTRY (encode->fps_den), "1");
   gtk_table_attach_defaults (GTK_TABLE (table), encode->fps_den, 1, 2, 4, 5);
   gtk_widget_show (encode->fps_den);
@@ -222,7 +247,7 @@ x264_gtk_encode_main_window ()
   gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 1, 5, 6);
   gtk_widget_show (label);
 
-  encode->frame_count = gtk_entry_new_with_max_length (4095);
+  encode->frame_count = gtk_entry_new_with_max_length (255);
   gtk_entry_set_text (GTK_ENTRY (encode->frame_count), "0");
   gtk_table_attach_defaults (GTK_TABLE (table), encode->frame_count, 1, 2, 5, 6);
   gtk_widget_show (encode->frame_count);
@@ -310,12 +335,12 @@ _chooser_window_cb (GtkDialog *dialog,
                     gpointer   user_data)
 {
   X264_Gtk_Encode *encode;
-  gboolean         sensitivity = FALSE;
+  gboolean         sensitivity = TRUE;
   x264_param_t     param;
+  hnd_t            hin;
   char            *in;
 #define       BUFFER_LENGTH  64
-  gchar         buffer[BUFFER_LENGTH];
-
+  gchar            buffer[BUFFER_LENGTH];
 
   /* input interface */
   int              (*p_open_infile)( char *psz_filename, hnd_t *p_handle, x264_param_t *p_param );
@@ -323,13 +348,15 @@ _chooser_window_cb (GtkDialog *dialog,
   int              (*p_close_infile)( hnd_t handle );
 
   encode = (X264_Gtk_Encode *)user_data;
-  if (!encode || !encode->file_input) return;
   in = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (encode->file_input));
   if (!in) return;
 
   /* Set defaults */
-  param.i_width = 352;
-  param.i_height = 288;
+  p_open_infile = open_file_yuv;
+  p_get_frame_total = get_frame_total_yuv;
+  p_close_infile = close_file_yuv;
+  param.i_width = (gint)(g_ascii_strtod (gtk_entry_get_text (GTK_ENTRY (encode->width)), NULL));
+  param.i_height = (gint)(g_ascii_strtod (gtk_entry_get_text (GTK_ENTRY (encode->height)), NULL));
   param.i_fps_num = 25;
   param.i_fps_den = 1;
   param.i_frame_total = 0;
@@ -341,37 +368,62 @@ _chooser_window_cb (GtkDialog *dialog,
     X264_Gtk_Encode  *encode = (X264_Gtk_Encode *)user_data;
     GSList           *filters;
     GtkFileFilter    *selected;
+    int               container;
     
     filters = gtk_file_chooser_list_filters(GTK_FILE_CHOOSER (encode->file_input));
     selected = gtk_file_chooser_get_filter(GTK_FILE_CHOOSER (encode->file_input));
-    encode->container = g_slist_index(filters, selected);
+    container = g_slist_index(filters, selected);
     g_slist_free (filters);
 
+    if (container == 0)
+    {
+      /* All format needed, search for extension */
+      const char *ext = strrchr(in, '.');
+      if (!strncmp(ext, ".avs", 4) || !strncmp(ext, ".AVS", 4))
+        encode->container = X264_DEMUXER_AVS;
+      else if (!strncmp(ext, ".avi", 4) || !strncmp(ext, ".AVI", 4))
+        encode->container = X264_DEMUXER_AVS;
+      else if (!strncmp(ext, ".cif", 4) || !strncmp(ext, ".CIF", 4))
+        encode->container = X264_DEMUXER_CIF;
+      else if (!strncmp(ext, ".qcif", 4) || !strncmp(ext, ".QCIF", 4))
+        encode->container = X264_DEMUXER_QCIF;
+      else
+        encode->container = X264_DEMUXER_YUV;
+    }
+    else
+    {
+      /* The all supproted type is 0 => shift of 1 */
+      encode->container = (X264_Demuxer_Type)container-1;
+    }
+        
     switch (encode->container) {
-    case 0: /* YUV */
-    case 1: /* CIF */
-    case 2: /* QCIF */
+    case X264_DEMUXER_YUV: /* YUV */
+      break;
+    case X264_DEMUXER_CIF: /* CIF */
+      param.i_width = 352;
+      param.i_height = 288;
+      break;
+    case X264_DEMUXER_QCIF: /* QCIF */
       /*   Default input file driver */
-      sensitivity = TRUE;
-      p_open_infile = open_file_yuv;
-      p_get_frame_total = get_frame_total_yuv;
-      p_close_infile = close_file_yuv;
+      param.i_width = 176;
+      param.i_height = 144;
       break;
 #ifdef AVIS_INPUT
-    case 3: /* AVI */
-    case 4: /* AVS */
+    case X264_DEMUXER_AVI: /* AVI */
+    case X264_DEMUXER_AVS: /* AVS */
+      sensitivity = FALSE;
       p_open_infile = open_file_avis;
       p_get_frame_total = get_frame_total_avis;
       p_close_infile = close_file_avis;
     break;
 #endif
     default: /* Unknown */
-      sensitivity = TRUE;
+      break;
     }
     break;
   }
   default:
-    sensitivity = TRUE;
+    break;
   }
 
   /* Modify dialog */
@@ -381,14 +433,25 @@ _chooser_window_cb (GtkDialog *dialog,
   gtk_widget_set_sensitive(encode->fps_den, sensitivity);
   gtk_widget_set_sensitive(encode->frame_count, sensitivity);
 
-  if (sensitivity == FALSE && encode->container > 2 /* QCIF */) {
-    /* Inquire input format */
-    hnd_t         hin;
-
-    p_open_infile (in, &hin, &param);
+  /* Inquire input format */
+  if (param.i_width < 2) param.i_width = 352;
+  if (param.i_height < 2) param.i_height = 288;
+  if (p_open_infile (in, &hin, &param) >= 0) {
     param.i_frame_total = p_get_frame_total(hin);
     p_close_infile (hin);
+  } else {
+    GtkWidget *dialog_message;
+
+    dialog_message = gtk_message_dialog_new (GTK_WINDOW (dialog),
+                                             GTK_DIALOG_DESTROY_WITH_PARENT,
+                                             GTK_MESSAGE_ERROR,
+                                             GTK_BUTTONS_CLOSE,
+                                             strerror(errno));
+    gtk_dialog_run (GTK_DIALOG (dialog_message));
+    gtk_widget_destroy (dialog_message);      
   }
+  encode->size = _file_size(in);
+
   if (g_snprintf(buffer, BUFFER_LENGTH, "%i", param.i_width) > 0)
     gtk_entry_set_text (GTK_ENTRY (encode->width), buffer);
   if (g_snprintf(buffer, BUFFER_LENGTH, "%i", param.i_height) > 0)
@@ -401,6 +464,26 @@ _chooser_window_cb (GtkDialog *dialog,
   if (g_snprintf(buffer, BUFFER_LENGTH, "%i", param.i_frame_total) > 0)
     gtk_entry_set_text (GTK_ENTRY (encode->frame_count), buffer);
 }
+static void
+_dimension_entry_cb (GtkEditable *editable,
+                     gpointer     user_data)
+{
+  X264_Gtk_Encode *encode = (X264_Gtk_Encode *)user_data;
+  char             buffer[32];
+  gint             width;
+  gint             height;
+  gint             frame_size;
+
+  width = (gint)(g_ascii_strtod (gtk_entry_get_text (GTK_ENTRY (encode->width)), NULL));
+  height = (gint)(g_ascii_strtod (gtk_entry_get_text (GTK_ENTRY (encode->height)), NULL));
+  frame_size = (3*width*height)/2;
+
+  if (frame_size > 0 && encode->container <= X264_DEMUXER_QCIF)
+  {
+    snprintf(buffer, 32, "%lu", (long unsigned int)((encode->size+frame_size/2)/frame_size));
+    gtk_entry_set_text (GTK_ENTRY (encode->frame_count), buffer);
+  }
+}
 
 static void
 _configure_window_cb (GtkButton *button __UNUSED__,
@@ -568,9 +651,9 @@ _fill_status_window (GIOChannel  *io __UNUSED__,
 
   thread_data = (X264_Thread_Data *)user_data;
   status = g_io_channel_read_chars (thread_data->io_read,
-                           (gchar *)&pipe_data,
-                           sizeof (X264_Pipe_Data),
-                           &size, NULL);
+                                    (gchar *)&pipe_data,
+                                    sizeof (X264_Pipe_Data),
+                                    &size, NULL);
   if (status != G_IO_STATUS_NORMAL) {
     g_print ("Error ! %d %d %d\n", status, sizeof (X264_Pipe_Data), size);
     return FALSE;
index e2ce344f21b53746187f488f76e64904c43d8379..a90dd3ea8a5e36f52e1ae2a075504dccd9c9b410 100644 (file)
@@ -4,33 +4,34 @@
 
 #define __UNUSED__ __attribute__((unused))
 
+#include "x264_gtk_demuxers.h"
 
 typedef struct X264_Thread_Data_ X264_Thread_Data;
 typedef struct X264_Pipe_Data_ X264_Pipe_Data;
 
 struct X264_Thread_Data_
 {
-  GtkWidget *current_video_frame;
-  GtkWidget *video_data;
-  GtkWidget *video_rendering_rate;
-  GtkWidget *time_elapsed;
-  GtkWidget *time_remaining;
-  GtkWidget *progress;
+  GtkWidget         *current_video_frame;
+  GtkWidget         *video_data;
+  GtkWidget         *video_rendering_rate;
+  GtkWidget         *time_elapsed;
+  GtkWidget         *time_remaining;
+  GtkWidget         *progress;
 
-  GtkWidget *dialog;
-  GtkWidget *button;
-  GtkWidget *end_button;
+  GtkWidget         *dialog;
+  GtkWidget         *button;
+  GtkWidget         *end_button;
 
-  x264_param_t *param;
-  gchar        *file_input;
-  gint          in_container;
+  x264_param_t      *param;
+  gchar             *file_input;
+  X264_Demuxer_Type  in_container;
 
-  gchar        *file_output;
-  gint          out_container;
+  gchar             *file_output;
+  gint               out_container;
 
   /* file descriptors */
-  GIOChannel *io_read;  /* use it with read */
-  GIOChannel *io_write; /* use it with write */
+  GIOChannel        *io_read;  /* use it with read */
+  GIOChannel        *io_write; /* use it with write */
 };
 
 struct X264_Pipe_Data_