| /* poppler-movie.cc: glib interface to Movie |
| * |
| * Copyright (C) 2010 Carlos Garcia Campos <carlosgc@gnome.org> |
| * Copyright (C) 2008 Hugo Mercier <hmercier31[@]gmail.com> |
| * Copyright (C) 2017 Francesco Poli <invernomuto@paranoici.org> |
| * |
| * This program is free software; you can redistribute it and/or modify |
| * it under the terms of the GNU General Public License as published by |
| * the Free Software Foundation; either version 2, or (at your option) |
| * any later version. |
| * |
| * This program 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 General Public License for more details. |
| * |
| * You should have received a copy of the GNU General Public License |
| * along with this program; if not, write to the Free Software |
| * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. |
| */ |
| |
| #include "poppler-movie.h" |
| #include "poppler-private.h" |
| |
| /** |
| * SECTION: poppler-movie |
| * @short_description: Movies |
| * @title: PopplerMovie |
| */ |
| |
| typedef struct _PopplerMovieClass PopplerMovieClass; |
| |
| struct _PopplerMovie |
| { |
| GObject parent_instance; |
| |
| gchar *filename; |
| gboolean need_poster; |
| gboolean show_controls; |
| PopplerMoviePlayMode mode; |
| gboolean synchronous_play; |
| gdouble volume; |
| gdouble rate; |
| guint64 start; |
| guint64 duration; |
| gushort rotation_angle; |
| }; |
| |
| struct _PopplerMovieClass |
| { |
| GObjectClass parent_class; |
| }; |
| |
| G_DEFINE_TYPE (PopplerMovie, poppler_movie, G_TYPE_OBJECT) |
| |
| static void |
| poppler_movie_finalize (GObject *object) |
| { |
| PopplerMovie* movie = POPPLER_MOVIE(object); |
| |
| if (movie->filename) { |
| g_free (movie->filename); |
| movie->filename = nullptr; |
| } |
| |
| G_OBJECT_CLASS (poppler_movie_parent_class)->finalize (object); |
| } |
| |
| static void |
| poppler_movie_class_init (PopplerMovieClass *klass) |
| { |
| GObjectClass *gobject_class = G_OBJECT_CLASS (klass); |
| |
| gobject_class->finalize = poppler_movie_finalize; |
| } |
| |
| static void |
| poppler_movie_init (PopplerMovie *movie) |
| { |
| } |
| |
| PopplerMovie * |
| _poppler_movie_new (const Movie *poppler_movie) |
| { |
| PopplerMovie *movie; |
| |
| g_assert (poppler_movie != nullptr); |
| |
| movie = POPPLER_MOVIE (g_object_new (POPPLER_TYPE_MOVIE, nullptr)); |
| |
| movie->filename = g_strdup (poppler_movie->getFileName()->c_str()); |
| if (poppler_movie->getShowPoster()) { |
| Object tmp = poppler_movie->getPoster(); |
| movie->need_poster = (!tmp.isRef() && !tmp.isStream()); |
| } |
| |
| movie->show_controls = poppler_movie->getActivationParameters()->showControls; |
| |
| switch (poppler_movie->getActivationParameters()->repeatMode) { |
| case MovieActivationParameters::repeatModeOnce: |
| movie->mode = POPPLER_MOVIE_PLAY_MODE_ONCE; |
| break; |
| case MovieActivationParameters::repeatModeOpen: |
| movie->mode = POPPLER_MOVIE_PLAY_MODE_OPEN; |
| break; |
| case MovieActivationParameters::repeatModeRepeat: |
| movie->mode = POPPLER_MOVIE_PLAY_MODE_REPEAT; |
| break; |
| case MovieActivationParameters::repeatModePalindrome: |
| movie->mode = POPPLER_MOVIE_PLAY_MODE_PALINDROME; |
| break; |
| } |
| |
| movie->synchronous_play = poppler_movie->getActivationParameters()->synchronousPlay; |
| |
| // map 0 - 100 to 0.0 - 1.0 |
| movie->volume = poppler_movie->getActivationParameters()->volume / 100.0; |
| |
| movie->rate = poppler_movie->getActivationParameters()->rate; |
| |
| if (poppler_movie->getActivationParameters()->start.units_per_second > 0 && |
| poppler_movie->getActivationParameters()->start.units <= G_MAXUINT64 / 1000000000) { |
| movie->start = 1000000000L * |
| poppler_movie->getActivationParameters()->start.units / |
| poppler_movie->getActivationParameters()->start.units_per_second; |
| } else { |
| movie->start = 0L; |
| } |
| |
| if (poppler_movie->getActivationParameters()->duration.units_per_second > 0 && |
| poppler_movie->getActivationParameters()->duration.units <= G_MAXUINT64 / 1000000000) { |
| movie->duration = 1000000000L * |
| poppler_movie->getActivationParameters()->duration.units / |
| poppler_movie->getActivationParameters()->duration.units_per_second; |
| } else { |
| movie->duration = 0L; |
| } |
| |
| movie->rotation_angle = poppler_movie->getRotationAngle(); |
| |
| return movie; |
| } |
| |
| /** |
| * poppler_movie_get_filename: |
| * @poppler_movie: a #PopplerMovie |
| * |
| * Returns the local filename identifying a self-describing movie file |
| * |
| * Return value: a local filename, return value is owned by #PopplerMovie and |
| * should not be freed |
| * |
| * Since: 0.14 |
| */ |
| const gchar * |
| poppler_movie_get_filename (PopplerMovie *poppler_movie) |
| { |
| g_return_val_if_fail (POPPLER_IS_MOVIE (poppler_movie), NULL); |
| |
| return poppler_movie->filename; |
| } |
| |
| /** |
| * poppler_movie_need_poster: |
| * @poppler_movie: a #PopplerMovie |
| * |
| * Returns whether a poster image representing the Movie |
| * shall be displayed. The poster image must be retrieved |
| * from the movie file. |
| * |
| * Return value: %TRUE if move needs a poster image, %FALSE otherwise |
| * |
| * Since: 0.14 |
| */ |
| gboolean |
| poppler_movie_need_poster (PopplerMovie *poppler_movie) |
| { |
| g_return_val_if_fail (POPPLER_IS_MOVIE (poppler_movie), FALSE); |
| |
| return poppler_movie->need_poster; |
| } |
| |
| /** |
| * poppler_movie_show_controls: |
| * @poppler_movie: a #PopplerMovie |
| * |
| * Returns whether to display a movie controller bar while playing the movie |
| * |
| * Return value: %TRUE if controller bar should be displayed, %FALSE otherwise |
| * |
| * Since: 0.14 |
| */ |
| gboolean |
| poppler_movie_show_controls (PopplerMovie *poppler_movie) |
| { |
| g_return_val_if_fail (POPPLER_IS_MOVIE (poppler_movie), FALSE); |
| |
| return poppler_movie->show_controls; |
| } |
| |
| /** |
| * poppler_movie_get_play_mode: |
| * @poppler_movie: a #PopplerMovie |
| * |
| * Returns the play mode of @poppler_movie. |
| * |
| * Return value: a #PopplerMoviePlayMode. |
| * |
| * Since: 0.54 |
| */ |
| PopplerMoviePlayMode |
| poppler_movie_get_play_mode (PopplerMovie *poppler_movie) |
| { |
| g_return_val_if_fail (POPPLER_IS_MOVIE (poppler_movie), POPPLER_MOVIE_PLAY_MODE_ONCE); |
| |
| return poppler_movie->mode; |
| } |
| |
| /** |
| * poppler_movie_is_synchronous: |
| * @poppler_movie: a #PopplerMovie |
| * |
| * Returns whether the user must wait for the movie to be finished before |
| * the PDF viewer accepts any interactive action |
| * |
| * Return value: %TRUE if yes, %FALSE otherwise |
| * |
| * Since: 0.80 |
| */ |
| gboolean |
| poppler_movie_is_synchronous (PopplerMovie *poppler_movie) |
| { |
| g_return_val_if_fail (POPPLER_IS_MOVIE (poppler_movie), FALSE); |
| |
| return poppler_movie->synchronous_play; |
| } |
| |
| /** |
| * poppler_movie_get_volume: |
| * @poppler_movie: a #PopplerMovie |
| * |
| * Returns the playback audio volume |
| * |
| * Return value: volume setting for the movie (0.0 - 1.0) |
| * |
| * Since: 0.80 |
| */ |
| gdouble |
| poppler_movie_get_volume (PopplerMovie *poppler_movie) |
| { |
| g_return_val_if_fail (POPPLER_IS_MOVIE (poppler_movie), 0); |
| |
| return poppler_movie->volume; |
| } |
| |
| /** |
| * poppler_movie_get_rate: |
| * @poppler_movie: a #PopplerMovie |
| * |
| * Returns the relative speed of the movie |
| * |
| * Return value: the relative speed of the movie (1 means no change) |
| * |
| * Since: 0.80 |
| */ |
| gdouble |
| poppler_movie_get_rate (PopplerMovie *poppler_movie) |
| { |
| g_return_val_if_fail (POPPLER_IS_MOVIE (poppler_movie), 0); |
| |
| return poppler_movie->rate; |
| } |
| |
| /** |
| * poppler_movie_get_rotation_angle: |
| * @poppler_movie: a #PopplerMovie |
| * |
| * Returns the rotation angle |
| * |
| * Return value: the number of degrees the movie should be rotated (positive, |
| * multiples of 90: 0, 90, 180, 270) |
| * |
| * Since: 0.80 |
| */ |
| gushort |
| poppler_movie_get_rotation_angle (PopplerMovie *poppler_movie) |
| { |
| g_return_val_if_fail (POPPLER_IS_MOVIE (poppler_movie), 0); |
| |
| return poppler_movie->rotation_angle; |
| } |
| |
| /** |
| * poppler_movie_get_start: |
| * @poppler_movie: a #PopplerMovie |
| * |
| * Returns the start position of the movie playback |
| * |
| * Return value: the start position of the movie playback (in ns) |
| * |
| * Since: 0.80 |
| */ |
| guint64 |
| poppler_movie_get_start (PopplerMovie *poppler_movie) |
| { |
| g_return_val_if_fail (POPPLER_IS_MOVIE (poppler_movie), 0L); |
| |
| return poppler_movie->start; |
| } |
| |
| /** |
| * poppler_movie_get_duration: |
| * @poppler_movie: a #PopplerMovie |
| * |
| * Returns the duration of the movie playback |
| * |
| * Return value: the duration of the movie playback (in ns) |
| * |
| * Since: 0.80 |
| */ |
| guint64 |
| poppler_movie_get_duration (PopplerMovie *poppler_movie) |
| { |
| g_return_val_if_fail (POPPLER_IS_MOVIE (poppler_movie), 0L); |
| |
| return poppler_movie->duration; |
| } |