/* poppler-movie.cc: glib interface to Movie * * Copyright (C) 2010 Carlos Garcia Campos * Copyright (C) 2008 Hugo Mercier * Copyright (C) 2017 Francesco Poli * * 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; gint width; gint height; }; 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(); poppler_movie->getAspect(&movie->width, &movie->height); 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; } /** * poppler_movie_get_aspect: * @poppler_movie: a #PopplerMovie * @width: width of the movie's bounding box * @height: height of the movie's bounding box * * Returns the dimensions of the movie's bounding box (in pixels). * The respective PDF movie dictionary entry is optional; if missing, * -1x-1 will be returned. * * Since: 0.89 */ void poppler_movie_get_aspect(PopplerMovie *poppler_movie, gint *width, gint *height) { g_return_if_fail(POPPLER_IS_MOVIE(poppler_movie)); *width = poppler_movie->width; *height = poppler_movie->height; }