From ed5f11654baf824ed4438fdd29680aea63a70bad Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Mon, 21 Apr 2014 20:26:20 +0100 Subject: Update to es_ES translation from Manual AC. Signed-off-by: Manual AC --- src/lib/po/es_ES.po | 178 +++++++++++++++++++++++----------------------------- 1 file changed, 80 insertions(+), 98 deletions(-) (limited to 'src/lib') diff --git a/src/lib/po/es_ES.po b/src/lib/po/es_ES.po index 5144bbb0f..337185c5f 100644 --- a/src/lib/po/es_ES.po +++ b/src/lib/po/es_ES.po @@ -8,35 +8,34 @@ msgstr "" "Project-Id-Version: LIBDCPOMATIC\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2014-03-31 16:10+0100\n" -"PO-Revision-Date: 2013-11-09 03:09-0500\n" +"PO-Revision-Date: 2014-04-20 10:12-0500\n" "Last-Translator: Manuel AC \n" "Language-Team: Manuel AC \n" -"Language: es-ES\n" +"Language: es_ES\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: Poedit 1.5.7\n" +"X-Generator: Poedit 1.6.4\n" #: src/lib/sndfile_content.cc:62 msgid "%1 [audio]" -msgstr "" +msgstr "%1 [audio]" #: src/lib/ffmpeg_content.cc:207 msgid "%1 [movie]" -msgstr "" +msgstr "%1 [película]" #: src/lib/sndfile_content.cc:83 msgid "%1 channels, %2kHz, %3 samples" -msgstr "" +msgstr "%1 canales, %2kHz, %3 muestras" #: src/lib/ffmpeg_content.cc:242 -#, fuzzy msgid "%1 frames; %2 frames per second" -msgstr "fotogramas por segundo" +msgstr "%1 imágenes; %2 imágenes per second" #: src/lib/video_content.cc:205 msgid "%1x%2 pixels (%3:1)" -msgstr "" +msgstr "%1x%2 pixels (%3:1)" #: src/lib/ratio.cc:35 msgid "1.19" @@ -60,7 +59,7 @@ msgstr "reducción de ruido 3D" #: src/lib/ratio.cc:36 msgid "4:3" -msgstr "" +msgstr "4:3" #: src/lib/ratio.cc:37 msgid "Academy" @@ -75,9 +74,8 @@ msgid "An error occurred whilst handling the file %1." msgstr "Ha ocurrido un error con el fichero %1." #: src/lib/analyse_audio_job.cc:48 -#, fuzzy msgid "Analyse audio" -msgstr "Analizar audio de %1" +msgstr "Analizar audio" #: src/lib/scaler.cc:64 msgid "Area" @@ -105,79 +103,77 @@ msgstr "Centro" #: src/lib/writer.cc:77 msgid "Checking existing image data" -msgstr "" +msgstr "Comprobando las imágenes existentes" #: src/lib/writer.cc:460 msgid "Computing audio digest" -msgstr "" +msgstr "Calculando la firma resumen del audio" #: src/lib/image_content.cc:100 msgid "Computing digest" -msgstr "" +msgstr "Calculando la firma resumen" #: src/lib/writer.cc:456 msgid "Computing image digest" -msgstr "" +msgstr "Calculando la firma resumen de imagen" #: src/lib/util.cc:838 -#, fuzzy msgid "Content and DCP have the same rate.\n" msgstr "La fuente y el DCP tienen la misma velocidad.\n" #: src/lib/audio_content.cc:82 msgid "Content to be joined must have the same audio delay." -msgstr "" +msgstr "Para unir contenido debe tener el mismo retardo de audio." #: src/lib/audio_content.cc:78 msgid "Content to be joined must have the same audio gain." -msgstr "" +msgstr "Para unir contenido debe tener la misma ganancia de audio." #: src/lib/video_content.cc:140 msgid "Content to be joined must have the same colour conversion." -msgstr "" +msgstr "Para unir contenido debe tener la misma conversión de color." #: src/lib/video_content.cc:132 msgid "Content to be joined must have the same crop." -msgstr "" +msgstr "Para unir contenido debe tener el mismo recorte." #: src/lib/video_content.cc:120 msgid "Content to be joined must have the same picture size." -msgstr "" +msgstr "Para unir contenido debe tener el mismo tamaño de imagen." #: src/lib/video_content.cc:136 -#, fuzzy msgid "Content to be joined must have the same scale setting." -msgstr "La fuente y el DCP tienen la misma velocidad." +msgstr "Para unir contenido debe tener la misma redimensión." #: src/lib/subtitle_content.cc:74 -#, fuzzy msgid "Content to be joined must have the same subtitle X offset." -msgstr "La fuente y el DCP tienen la misma velocidad." +msgstr "" +"Para unir contenido debe tener el mismo desplazamiento de subtítulo en X." #: src/lib/subtitle_content.cc:78 -#, fuzzy msgid "Content to be joined must have the same subtitle Y offset." -msgstr "La fuente y el DCP tienen la misma velocidad." +msgstr "" +"Para unir contenido debe tener el mismo desplazamiento de subtítulo en Y." #: src/lib/subtitle_content.cc:82 msgid "Content to be joined must have the same subtitle scale." -msgstr "" +msgstr "Para unir contenido debe tener el mismo tamaño de subtítulo." #: src/lib/video_content.cc:124 msgid "Content to be joined must have the same video frame rate." -msgstr "" +msgstr "Para unir contenido debe tener la misma velocidad de imagen." #: src/lib/video_content.cc:128 msgid "Content to be joined must have the same video frame type." -msgstr "" +msgstr "Para unir contenido debe tener el mismo tamaño de imagen." #: src/lib/ffmpeg_content.cc:112 msgid "Content to be joined must use the same audio stream." -msgstr "" +msgstr "Para unir contenido debe usar el mismo tipo de audio." #: src/lib/ffmpeg_content.cc:108 msgid "Content to be joined must use the same subtitle stream." -msgstr "" +msgstr "Para unir contenido debe tener el mismo tipo de subtítulos." #: src/lib/scp_dcp_job.cc:110 msgid "Copy DCP to TMS" @@ -192,18 +188,16 @@ msgid "Could not create remote directory %1 (%2)" msgstr "No se pudo crear la carpeta remota %1 (%2)" #: src/lib/job.cc:90 -#, fuzzy msgid "Could not open %1" -msgstr "no se pudo abrir el fichero %1" +msgstr "No se pudo abrir %1" #: src/lib/scp_dcp_job.cc:182 msgid "Could not open %1 to send" msgstr "No se pudo abrir %1 para enviar" #: src/lib/internet.cc:72 -#, fuzzy msgid "Could not open downloaded ZIP file" -msgstr "no se pudo abrir el fichero %1" +msgstr "No se puedo abrir el fichero ZIP descargado" #: src/lib/film.cc:990 msgid "Could not read DCP to make KDM for" @@ -218,14 +212,12 @@ msgid "Could not write to remote file (%1)" msgstr "No se pudo escribir el fichero remoto (%1)" #: src/lib/util.cc:850 -#, fuzzy msgid "DCP will run at %1%% of the content speed.\n" msgstr "El DCP se reproducirá al %1%% de la velocidad de la fuente.\n" #: src/lib/util.cc:841 -#, fuzzy msgid "DCP will use every other frame of the content.\n" -msgstr "El DCP usará fotogramas alternos de la fuente.\n" +msgstr "El DCP usará imágenes alternas de la fuente.\n" #: src/lib/job.cc:91 msgid "" @@ -238,7 +230,7 @@ msgstr "" #: src/lib/ffmpeg_content.cc:89 msgid "" "DCP-o-matic no longer supports the `%1' filter, so it has been turned off." -msgstr "" +msgstr "DCP-o-matic ya no ofrece el filtro `%1', así que ha sido desactivado." #: src/lib/filter.cc:65 src/lib/filter.cc:66 src/lib/filter.cc:67 msgid "De-interlacing" @@ -255,33 +247,38 @@ msgid "" "Best regards,\n" "DCP-o-matic" msgstr "" +"Estimado proyeccionista\n" +"\n" +"Adjuntas encontrará las llaves KDM para $CPL_NAME.\n" +"\n" +"Estas llaves KDM son válidas desde $START_TIME hasta $END_TIME.\n" +"\n" +"Atentamente,\n" +"DCP-o-matic" #: src/lib/dolby_cp750.cc:27 -#, fuzzy msgid "Dolby CP650 and CP750" -msgstr "Dolby CP750" +msgstr "Dolby CP650 and CP750" #: src/lib/internet.cc:65 msgid "Download failed (%1/%2 error %3)" -msgstr "" +msgstr "Descarga fallida (%1/%2 error %3)" #: src/lib/util.cc:843 -#, fuzzy msgid "Each content frame will be doubled in the DCP.\n" -msgstr "Se doblará cada fotograma de la fuente en el DCP.\n" +msgstr "Se doblará cada imagen en el DCP.\n" #: src/lib/util.cc:845 -#, fuzzy msgid "Each content frame will be repeated %1 more times in the DCP.\n" -msgstr "Se doblará cada fotograma de la fuente en el DCP.\n" +msgstr "Cada imagen será repetida otras %1 veces en el DCP.\n" #: src/lib/send_kdm_email_job.cc:50 msgid "Email KDMs for %1" -msgstr "" +msgstr "Enviar por email las KDM para %1" #: src/lib/writer.cc:120 msgid "Encoding image data" -msgstr "" +msgstr "Codificando imagen" #: src/lib/job.cc:320 msgid "Error (%1)" @@ -309,7 +306,7 @@ msgstr "Flat" #: src/lib/ratio.cc:43 msgid "Full frame" -msgstr "" +msgstr "Frame completo" #: src/lib/scaler.cc:65 msgid "Gaussian" @@ -321,7 +318,7 @@ msgstr "Gradient debander" #: src/lib/util.cc:806 msgid "Hearing impaired" -msgstr "" +msgstr "Sordos" #: src/lib/filter.cc:71 msgid "High quality 3D denoiser" @@ -349,12 +346,11 @@ msgstr "Izquierda" #: src/lib/util.cc:808 msgid "Left centre" -msgstr "" +msgstr "Centro izquierda" #: src/lib/util.cc:810 -#, fuzzy msgid "Left rear surround" -msgstr "Surround izquierda" +msgstr "Surround trasero izquierda" #: src/lib/util.cc:804 msgid "Left surround" @@ -362,7 +358,7 @@ msgstr "Surround izquierda" #: src/lib/util.cc:803 msgid "Lfe (sub)" -msgstr "" +msgstr "Lfe (bajos)" #: src/lib/filter.cc:68 src/lib/filter.cc:69 src/lib/filter.cc:72 msgid "Misc" @@ -374,12 +370,11 @@ msgstr "Motion compensating deinterlacer" #: src/lib/video_content.cc:447 msgid "No scale" -msgstr "" +msgstr "No redimensionar" #: src/lib/video_content.cc:444 -#, fuzzy msgid "No stretch" -msgstr "Flat sin deformación" +msgstr "Sin deformación" #: src/lib/filter.cc:70 src/lib/filter.cc:71 src/lib/filter.cc:73 msgid "Noise reduction" @@ -392,14 +387,15 @@ msgstr "OK (ejecución %1)" #: src/lib/content.cc:100 msgid "Only the first piece of content to be joined can have a start trim." msgstr "" +"Solo la primera pieza a ser unida puede tener un recorte en su comienzo." #: src/lib/content.cc:104 msgid "Only the last piece of content to be joined can have an end trim." -msgstr "" +msgstr "Solo la última pieza a ser unida puede tener un recorte en su final." #: src/lib/job.cc:103 msgid "Out of memory" -msgstr "" +msgstr "Falta de memoria" #: src/lib/filter.cc:73 msgid "Overcomplete wavelet denoiser" @@ -418,9 +414,8 @@ msgid "Rating" msgstr "Clasificación" #: src/lib/config.cc:84 src/lib/config.cc:168 -#, fuzzy msgid "Rec. 709" -msgstr "Rec 709" +msgstr "Rec. 709" #: src/lib/util.cc:801 msgid "Right" @@ -428,12 +423,11 @@ msgstr "Derecha" #: src/lib/util.cc:809 msgid "Right centre" -msgstr "" +msgstr "Centro derecha" #: src/lib/util.cc:811 -#, fuzzy msgid "Right rear surround" -msgstr "Surround derecha" +msgstr "Surround trasero derecha" #: src/lib/util.cc:805 msgid "Right surround" @@ -481,15 +475,14 @@ msgstr "" #: src/lib/job.cc:103 msgid "There was not enough memory to do this." -msgstr "" +msgstr "No hubo suficiente memoria para hacer esto." #: src/lib/film.cc:406 -#, fuzzy msgid "" "This film was created with a newer version of DCP-o-matic, and it cannot be " "loaded into this version. Sorry!" msgstr "" -"Esta película se creó con una versión antigua de DCP-o-matic, y " +"Esta película se creó con una versión más reciente de DCP-o-matic, y " "desgraciadamente no s puede cargar. Necesitas crear una nueva película, " "volver a añadir y configurar ton contenido. ¡Lo siento!" @@ -517,7 +510,7 @@ msgstr "Transitional" #: src/lib/internet.cc:77 msgid "Unexpected ZIP file contents" -msgstr "" +msgstr "Contenidos inesperados del fichero ZIP" #: src/lib/job.cc:120 msgid "Unknown error" @@ -537,7 +530,7 @@ msgstr "Sin título" #: src/lib/util.cc:807 msgid "Visually impaired" -msgstr "" +msgstr "Ciegos" #: src/lib/scp_dcp_job.cc:102 msgid "Waiting" @@ -557,12 +550,11 @@ msgstr "Tienes que añadir contenido al DCP antes de crearlo." #: src/lib/image_content.cc:68 msgid "[moving images]" -msgstr "" +msgstr "[imágenes en movimiento]" #: src/lib/image_content.cc:66 -#, fuzzy msgid "[still]" -msgstr "imagen fija" +msgstr "[imagen fija]" #: src/lib/film.cc:247 msgid "cannot contain slashes" @@ -577,9 +569,8 @@ msgid "connecting" msgstr "conectando" #: src/lib/film.cc:295 -#, fuzzy msgid "container" -msgstr "contenido" +msgstr "continente" #: src/lib/film.cc:303 msgid "content type" @@ -590,9 +581,8 @@ msgid "copying %1" msgstr "copiando %1" #: src/lib/exceptions.cc:36 -#, fuzzy msgid "could not create file %1" -msgstr "No se pudo escribir el fichero remoto (%1)" +msgstr "No se pudo crear el fichero (%1)" #: src/lib/ffmpeg.cc:176 msgid "could not find audio decoder" @@ -608,15 +598,13 @@ msgstr "no se pudo encontrar decodificador de vídeo" #: src/lib/writer.cc:424 msgid "could not move audio MXF into the DCP (%1)" -msgstr "" +msgstr "no s puedo mover el audio MXF en el DCP (%1)" #: src/lib/sndfile_decoder.cc:56 -#, fuzzy msgid "could not open audio file for reading" -msgstr "no se pudo abrir el fichero para lectura" +msgstr "no se pudo abrir el fichero de audio para lectura" #: src/lib/exceptions.cc:29 -#, fuzzy msgid "could not open file %1" msgstr "no se pudo abrir el fichero %1" @@ -625,21 +613,18 @@ msgid "could not open file for reading" msgstr "no se pudo abrir el fichero para lectura" #: src/lib/dcp_video_frame.cc:358 -#, fuzzy msgid "could not read encoded data" -msgstr "no se encontró el decodificador de audio" +msgstr "no se pudo leer la información codificada" #: src/lib/exceptions.cc:42 -#, fuzzy msgid "could not read from file %1 (%2)" -msgstr "No se pudo crear la carpeta remota %1 (%2)" +msgstr "No se pudo leer del fichero %1 (%2)" #: src/lib/resampler.cc:102 msgid "could not run sample-rate converter" msgstr "no se pudo ejecutar el conversor de velocidad" #: src/lib/resampler.cc:83 -#, fuzzy msgid "could not run sample-rate converter for %1 samples (%2) (%3)" msgstr "no se pudo ejecutar el conversor de velocidad" @@ -652,29 +637,28 @@ msgid "could not start SSH session" msgstr "no se pudo abrir la sesión SSH" #: src/lib/exceptions.cc:48 -#, fuzzy msgid "could not write to file %1 (%2)" -msgstr "No se pudo escribir el fichero remoto (%1)" +msgstr "No se pudo escribir en el fichero (%1)" #: src/lib/util.cc:601 msgid "error during async_accept (%1)" -msgstr "" +msgstr "error durante async_accept (%1)" #: src/lib/util.cc:577 msgid "error during async_connect (%1)" -msgstr "" +msgstr "error durante async_connect (%1)" #: src/lib/util.cc:650 msgid "error during async_read (%1)" -msgstr "" +msgstr "error durante async_read (%1)" #: src/lib/util.cc:622 msgid "error during async_write (%1)" -msgstr "" +msgstr "error durante async_write (%1)" #: src/lib/transcode_job.cc:100 msgid "frames per second" -msgstr "fotogramas por segundo" +msgstr "imágenes por segundo" #: src/lib/util.cc:152 msgid "hour" @@ -702,7 +686,7 @@ msgstr "falta una configuración obligatoria %1" #: src/lib/image_content.cc:83 msgid "moving" -msgstr "" +msgstr "moviendo" #: src/lib/ffmpeg_decoder.cc:575 msgid "multi-part subtitles not yet supported" @@ -735,14 +719,12 @@ msgid "seconds" msgstr "segundos" #: src/lib/image_content.cc:81 -#, fuzzy msgid "still" msgstr "imagen fija" #: src/lib/ffmpeg_examiner.cc:168 -#, fuzzy msgid "unknown" -msgstr "Error desconocido" +msgstr "desconocido" #~ msgid "Cubic interpolating deinterlacer" #~ msgstr "Desentrelazado por interpolación cúbica" -- cgit v1.2.3 From 879afabeff6f8675c57e6c88fde8023fbc19f55a Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Mon, 21 Apr 2014 20:37:43 +0100 Subject: Update to fr_FR translation from Thierry Journet. --- ChangeLog | 2 ++ src/lib/po/fr_FR.po | 2 +- src/tools/po/fr_FR.po | 2 +- src/wx/po/fr_FR.po | 32 ++++++++++++++++---------------- 4 files changed, 20 insertions(+), 18 deletions(-) (limited to 'src/lib') diff --git a/ChangeLog b/ChangeLog index 46865e635..890e59402 100644 --- a/ChangeLog +++ b/ChangeLog @@ -2,6 +2,8 @@ * Update to es_ES translation from Manuel AC. + * Update to fr_FR translation from Thierry Journet. + 2014-04-17 Carl Hetherington * Fix update of the gain control when using the gain calculator diff --git a/src/lib/po/fr_FR.po b/src/lib/po/fr_FR.po index b96ca580d..b88099016 100644 --- a/src/lib/po/fr_FR.po +++ b/src/lib/po/fr_FR.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: DCP-o-matic FRENCH\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2014-03-31 16:10+0100\n" -"PO-Revision-Date: 2014-04-06 03:02+0100\n" +"PO-Revision-Date: 2014-04-18 22:51+0100\n" "Last-Translator: \n" "Language-Team: \n" "Language: fr_FR\n" diff --git a/src/tools/po/fr_FR.po b/src/tools/po/fr_FR.po index 91c0ef78e..b573e5b7d 100644 --- a/src/tools/po/fr_FR.po +++ b/src/tools/po/fr_FR.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: DCP-o-matic FRENCH\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2014-03-31 16:10+0100\n" -"PO-Revision-Date: 2014-04-06 03:07+0100\n" +"PO-Revision-Date: 2014-04-18 22:54+0100\n" "Last-Translator: \n" "Language-Team: \n" "Language: fr_FR\n" diff --git a/src/wx/po/fr_FR.po b/src/wx/po/fr_FR.po index 5c934fdc5..ee75de991 100644 --- a/src/wx/po/fr_FR.po +++ b/src/wx/po/fr_FR.po @@ -8,7 +8,7 @@ msgstr "" "Project-Id-Version: DCP-o-matic FRENCH\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2014-03-31 16:10+0100\n" -"PO-Revision-Date: 2014-04-06 03:30+0100\n" +"PO-Revision-Date: 2014-04-18 22:50+0100\n" "Last-Translator: \n" "Language-Team: \n" "Language: fr_FR\n" @@ -107,7 +107,7 @@ msgstr "Ajouter..." #: src/wx/about_dialog.cc:107 msgid "Artwork by" -msgstr "Thème artistique par" +msgstr "Thème par" #: src/wx/audio_dialog.cc:33 src/wx/audio_panel.cc:40 msgid "Audio" @@ -205,7 +205,7 @@ msgstr "Canaux" #: src/wx/config_dialog.cc:137 msgid "Check for testing updates as well as stable ones" -msgstr "Recherche de mises à jour - version test et stables." +msgstr "Recherche toutes mises à jour : test et stables." #: src/wx/config_dialog.cc:133 msgid "Check for updates on startup" @@ -229,16 +229,16 @@ msgstr "Cinéma" #: src/wx/config_dialog.cc:561 msgid "Colour Conversions" -msgstr "Conversions couleurs" +msgstr "Conversions Couleurs" #: src/wx/content_colour_conversion_dialog.cc:34 #: src/wx/preset_colour_conversion_dialog.cc:30 src/wx/video_panel.cc:161 msgid "Colour conversion" -msgstr "Conversion colorimétrique" +msgstr "Espace Couleurs" #: src/wx/film_editor.cc:134 msgid "Container" -msgstr "Contenu" +msgstr "Format" #: src/wx/audio_mapping_view.cc:273 src/wx/film_editor.cc:85 msgid "Content" @@ -328,11 +328,11 @@ msgstr "Délais audio par défaut" #: src/wx/config_dialog.cc:335 msgid "Default container" -msgstr "Type de contenu par défaut" +msgstr "Format par défaut" #: src/wx/config_dialog.cc:339 msgid "Default content type" -msgstr "Type de contenu par défaut" +msgstr "Catégorie par défaut" #: src/wx/config_dialog.cc:365 msgid "Default creator" @@ -340,7 +340,7 @@ msgstr "Créateur par défaut" #: src/wx/config_dialog.cc:323 msgid "Default directory for new films" -msgstr "Dossier par défaut pour nouveaux films" +msgstr "Dossier par défaut pour les DCP" #: src/wx/config_dialog.cc:315 msgid "Default duration of still images" @@ -571,7 +571,7 @@ msgstr "Chargement depuis fichier..." #: src/wx/audio_mapping_view.cc:296 msgid "Ls" -msgstr "SG" +msgstr "Sr.G" #: src/wx/film_editor.cc:749 msgid "MISSING: " @@ -743,7 +743,7 @@ msgstr "Découpe droite" #: src/wx/audio_mapping_view.cc:300 msgid "Rs" -msgstr "SD" +msgstr "Sr.D" #: src/wx/film_editor.cc:223 msgid "SMPTE" @@ -836,11 +836,11 @@ msgstr "Flux de sous-titre" #: src/wx/subtitle_panel.cc:44 msgid "Subtitle X Offset" -msgstr "Position Horiz." +msgstr "Position Horizontale" #: src/wx/subtitle_panel.cc:53 msgid "Subtitle Y Offset" -msgstr "Position Vertic." +msgstr "Position Verticale" #: src/wx/subtitle_panel.cc:34 msgid "Subtitles" @@ -922,11 +922,11 @@ msgstr "Traduit par" #: src/wx/timing_panel.cc:49 msgid "Trim from end" -msgstr "Images coupées depuis la fin" +msgstr "Exclure à la fin" #: src/wx/timing_panel.cc:46 msgid "Trim from start" -msgstr "Images coupées depuis le début" +msgstr "Exclure au début" #: src/wx/audio_dialog.cc:55 src/wx/video_panel.cc:74 msgid "Type" @@ -982,7 +982,7 @@ msgstr "Vidéo" #: src/wx/timing_panel.cc:57 msgid "Video frame rate" -msgstr "Cadence images vidéo" +msgstr "Cadence vidéo" #: src/wx/subtitle_panel.cc:39 msgid "With Subtitles" -- cgit v1.2.3 From d19ba00f1995495977bdee206305c42a96eb0f57 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Fri, 25 Apr 2014 23:03:30 +0100 Subject: Put Piece class in its own file. --- src/lib/piece.cc | 83 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/lib/piece.h | 65 +++++++++++++++++++++++++++++++++++++++++++ src/lib/player.cc | 66 ------------------------------------------- src/lib/player.h | 19 +++---------- src/lib/wscript | 1 + 5 files changed, 153 insertions(+), 81 deletions(-) create mode 100644 src/lib/piece.cc create mode 100644 src/lib/piece.h (limited to 'src/lib') diff --git a/src/lib/piece.cc b/src/lib/piece.cc new file mode 100644 index 000000000..3c39ecfb8 --- /dev/null +++ b/src/lib/piece.cc @@ -0,0 +1,83 @@ +/* + Copyright (C) 2013-2014 Carl Hetherington + + 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 of the License, 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., 675 Mass Ave, Cambridge, MA 02139, USA. + +*/ + +#include "piece.h" +#include "player.h" + +using boost::shared_ptr; + +Piece::Piece (shared_ptr c) + : content (c) + , video_position (c->position ()) + , audio_position (c->position ()) + , repeat_to_do (0) + , repeat_done (0) +{ + +} + +Piece::Piece (shared_ptr c, shared_ptr d) + : content (c) + , decoder (d) + , video_position (c->position ()) + , audio_position (c->position ()) + , repeat_to_do (0) + , repeat_done (0) +{ + +} + +/** Set this piece to repeat a video frame a given number of times */ +void +Piece::set_repeat (IncomingVideo video, int num) +{ + repeat_video = video; + repeat_to_do = num; + repeat_done = 0; +} + +void +Piece::reset_repeat () +{ + repeat_video.image.reset (); + repeat_to_do = 0; + repeat_done = 0; +} + +bool +Piece::repeating () const +{ + return repeat_done != repeat_to_do; +} + +void +Piece::repeat (Player* player) +{ + player->process_video ( + repeat_video.weak_piece, + repeat_video.image, + repeat_video.eyes, + repeat_done > 0, + repeat_video.frame, + (repeat_done + 1) * (TIME_HZ / player->_film->video_frame_rate ()) + ); + + ++repeat_done; +} + diff --git a/src/lib/piece.h b/src/lib/piece.h new file mode 100644 index 000000000..76df909ff --- /dev/null +++ b/src/lib/piece.h @@ -0,0 +1,65 @@ +/* + Copyright (C) 2013-2014 Carl Hetherington + + 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 of the License, 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., 675 Mass Ave, Cambridge, MA 02139, USA. + +*/ + +#ifndef DCPOMATIC_PIECE_H +#define DCPOMATIC_PIECE_H + +#include "types.h" +#include "video_content.h" + +class Content; +class Decoder; +class Piece; +class Image; +class Player; + +struct IncomingVideo +{ +public: + boost::weak_ptr weak_piece; + boost::shared_ptr image; + Eyes eyes; + bool same; + VideoContent::Frame frame; + Time extra; +}; + +class Piece +{ +public: + Piece (boost::shared_ptr c); + Piece (boost::shared_ptr c, boost::shared_ptr d); + void set_repeat (IncomingVideo video, int num); + void reset_repeat (); + bool repeating () const; + void repeat (Player* player); + + boost::shared_ptr content; + boost::shared_ptr decoder; + /** Time of the last video we emitted relative to the start of the DCP */ + Time video_position; + /** Time of the last audio we emitted relative to the start of the DCP */ + Time audio_position; + + IncomingVideo repeat_video; + int repeat_to_do; + int repeat_done; +}; + +#endif diff --git a/src/lib/player.cc b/src/lib/player.cc index c4558f33f..7afe74831 100644 --- a/src/lib/player.cc +++ b/src/lib/player.cc @@ -46,72 +46,6 @@ using boost::shared_ptr; using boost::weak_ptr; using boost::dynamic_pointer_cast; -class Piece -{ -public: - Piece (shared_ptr c) - : content (c) - , video_position (c->position ()) - , audio_position (c->position ()) - , repeat_to_do (0) - , repeat_done (0) - {} - - Piece (shared_ptr c, shared_ptr d) - : content (c) - , decoder (d) - , video_position (c->position ()) - , audio_position (c->position ()) - , repeat_to_do (0) - , repeat_done (0) - {} - - /** Set this piece to repeat a video frame a given number of times */ - void set_repeat (IncomingVideo video, int num) - { - repeat_video = video; - repeat_to_do = num; - repeat_done = 0; - } - - void reset_repeat () - { - repeat_video.image.reset (); - repeat_to_do = 0; - repeat_done = 0; - } - - bool repeating () const - { - return repeat_done != repeat_to_do; - } - - void repeat (Player* player) - { - player->process_video ( - repeat_video.weak_piece, - repeat_video.image, - repeat_video.eyes, - repeat_done > 0, - repeat_video.frame, - (repeat_done + 1) * (TIME_HZ / player->_film->video_frame_rate ()) - ); - - ++repeat_done; - } - - shared_ptr content; - shared_ptr decoder; - /** Time of the last video we emitted relative to the start of the DCP */ - Time video_position; - /** Time of the last audio we emitted relative to the start of the DCP */ - Time audio_position; - - IncomingVideo repeat_video; - int repeat_to_do; - int repeat_done; -}; - Player::Player (shared_ptr f, shared_ptr p) : _film (f) , _playlist (p) diff --git a/src/lib/player.h b/src/lib/player.h index f7896d7d9..4368f48ba 100644 --- a/src/lib/player.h +++ b/src/lib/player.h @@ -29,6 +29,7 @@ #include "rect.h" #include "audio_merger.h" #include "audio_content.h" +#include "piece.h" class Job; class Film; @@ -38,21 +39,6 @@ class Piece; class Image; class Resampler; -/** @class Player - * @brief A class which can `play' a Playlist; emitting its audio and video. - */ - -struct IncomingVideo -{ -public: - boost::weak_ptr weak_piece; - boost::shared_ptr image; - Eyes eyes; - bool same; - VideoContent::Frame frame; - Time extra; -}; - /** A wrapper for an Image which contains some pending operations; these may * not be necessary if the receiver of the PlayerImage throws it away. */ @@ -75,6 +61,9 @@ private: Position _subtitle_position; }; +/** @class Player + * @brief A class which can `play' a Playlist; emitting its audio and video. + */ class Player : public boost::enable_shared_from_this, public boost::noncopyable { public: diff --git a/src/lib/wscript b/src/lib/wscript index a50216f6d..dc90e17f3 100644 --- a/src/lib/wscript +++ b/src/lib/wscript @@ -40,6 +40,7 @@ sources = """ kdm.cc json_server.cc log.cc + piece.cc player.cc playlist.cc ratio.cc -- cgit v1.2.3 From 588397fc600e888acf77375fe39c238ff2bf3649 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Fri, 25 Apr 2014 23:27:42 +0100 Subject: Collect player subtitle processing into a Subtitle class. --- src/lib/player.cc | 77 +++----------------------------------- src/lib/player.h | 16 +------- src/lib/subtitle.cc | 106 ++++++++++++++++++++++++++++++++++++++++++++++++++++ src/lib/subtitle.h | 59 +++++++++++++++++++++++++++++ src/lib/wscript | 1 + 5 files changed, 174 insertions(+), 85 deletions(-) create mode 100644 src/lib/subtitle.cc create mode 100644 src/lib/subtitle.h (limited to 'src/lib') diff --git a/src/lib/player.cc b/src/lib/player.cc index 7afe74831..d0653bc43 100644 --- a/src/lib/player.cc +++ b/src/lib/player.cc @@ -219,14 +219,14 @@ Player::process_video (weak_ptr weak_piece, shared_ptr image ) ); - if (_film->with_subtitles () && _out_subtitle.image && time >= _out_subtitle.from && time <= _out_subtitle.to) { + if (_film->with_subtitles () && _subtitle && _subtitle->out_image() && _subtitle->covers (time)) { Position const container_offset ( (_video_container_size.width - image_size.width) / 2, (_video_container_size.height - image_size.width) / 2 ); - pi->set_subtitle (_out_subtitle.image, _out_subtitle.position + container_offset); + pi->set_subtitle (_subtitle->out_image(), _subtitle->out_position() + container_offset); } @@ -466,7 +466,9 @@ Player::content_changed (weak_ptr w, int property, bool frequent) property == SubtitleContentProperty::SUBTITLE_SCALE ) { - update_subtitle (); + if (_subtitle) { + _subtitle->update (_film, _video_container_size); + } Changed (frequent); } else if ( @@ -574,74 +576,7 @@ Player::film_changed (Film::Property p) void Player::process_subtitle (weak_ptr weak_piece, shared_ptr image, dcpomatic::Rect rect, Time from, Time to) { - _in_subtitle.piece = weak_piece; - _in_subtitle.image = image; - _in_subtitle.rect = rect; - _in_subtitle.from = from; - _in_subtitle.to = to; - - update_subtitle (); -} - -void -Player::update_subtitle () -{ - shared_ptr piece = _in_subtitle.piece.lock (); - if (!piece) { - return; - } - - if (!_in_subtitle.image) { - _out_subtitle.image.reset (); - return; - } - - shared_ptr sc = dynamic_pointer_cast (piece->content); - assert (sc); - - dcpomatic::Rect in_rect = _in_subtitle.rect; - libdcp::Size scaled_size; - - in_rect.x += sc->subtitle_x_offset (); - in_rect.y += sc->subtitle_y_offset (); - - /* We will scale the subtitle up to fit _video_container_size, and also by the additional subtitle_scale */ - scaled_size.width = in_rect.width * _video_container_size.width * sc->subtitle_scale (); - scaled_size.height = in_rect.height * _video_container_size.height * sc->subtitle_scale (); - - /* Then we need a corrective translation, consisting of two parts: - * - * 1. that which is the result of the scaling of the subtitle by _video_container_size; this will be - * rect.x * _video_container_size.width and rect.y * _video_container_size.height. - * - * 2. that to shift the origin of the scale by subtitle_scale to the centre of the subtitle; this will be - * (width_before_subtitle_scale * (1 - subtitle_scale) / 2) and - * (height_before_subtitle_scale * (1 - subtitle_scale) / 2). - * - * Combining these two translations gives these expressions. - */ - - _out_subtitle.position.x = rint (_video_container_size.width * (in_rect.x + (in_rect.width * (1 - sc->subtitle_scale ()) / 2))); - _out_subtitle.position.y = rint (_video_container_size.height * (in_rect.y + (in_rect.height * (1 - sc->subtitle_scale ()) / 2))); - - _out_subtitle.image = _in_subtitle.image->scale ( - scaled_size, - Scaler::from_id ("bicubic"), - _in_subtitle.image->pixel_format (), - true - ); - - /* XXX: hack */ - Time from = _in_subtitle.from; - Time to = _in_subtitle.to; - shared_ptr vc = dynamic_pointer_cast (piece->content); - if (vc) { - from = rint (from * vc->video_frame_rate() / _film->video_frame_rate()); - to = rint (to * vc->video_frame_rate() / _film->video_frame_rate()); - } - - _out_subtitle.from = from + piece->content->position (); - _out_subtitle.to = to + piece->content->position (); + _subtitle = Subtitle (_film, _video_container_size, weak_piece, image, rect, from, to); } /** Re-emit the last frame that was emitted, using current settings for crop, ratio, scaler and subtitles. diff --git a/src/lib/player.h b/src/lib/player.h index 4368f48ba..5dad80ec7 100644 --- a/src/lib/player.h +++ b/src/lib/player.h @@ -30,6 +30,7 @@ #include "audio_merger.h" #include "audio_content.h" #include "piece.h" +#include "subtitle.h" class Job; class Film; @@ -142,20 +143,7 @@ private: boost::shared_ptr _black_frame; std::map, boost::shared_ptr > _resamplers; - struct { - boost::weak_ptr piece; - boost::shared_ptr image; - dcpomatic::Rect rect; - Time from; - Time to; - } _in_subtitle; - - struct { - boost::shared_ptr image; - Position position; - Time from; - Time to; - } _out_subtitle; + boost::optional _subtitle; #ifdef DCPOMATIC_DEBUG boost::shared_ptr _last_video; diff --git a/src/lib/subtitle.cc b/src/lib/subtitle.cc new file mode 100644 index 000000000..f348833b0 --- /dev/null +++ b/src/lib/subtitle.cc @@ -0,0 +1,106 @@ +/* + Copyright (C) 2013-2014 Carl Hetherington + + 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 of the License, 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., 675 Mass Ave, Cambridge, MA 02139, USA. + +*/ + +#include "subtitle.h" +#include "subtitle_content.h" +#include "piece.h" +#include "image.h" +#include "scaler.h" +#include "film.h" + +using boost::shared_ptr; +using boost::dynamic_pointer_cast; +using boost::weak_ptr; + +Subtitle::Subtitle (shared_ptr film, libdcp::Size video_container_size, weak_ptr weak_piece, shared_ptr image, dcpomatic::Rect rect, Time from, Time to) + : _piece (weak_piece) + , _in_image (image) + , _in_rect (rect) + , _in_from (from) + , _in_to (to) +{ + update (film, video_container_size); +} + +void +Subtitle::update (shared_ptr film, libdcp::Size video_container_size) +{ + shared_ptr piece = _piece.lock (); + if (!piece) { + return; + } + + if (!_in_image) { + _out_image.reset (); + return; + } + + shared_ptr sc = dynamic_pointer_cast (piece->content); + assert (sc); + + dcpomatic::Rect in_rect = _in_rect; + libdcp::Size scaled_size; + + in_rect.x += sc->subtitle_x_offset (); + in_rect.y += sc->subtitle_y_offset (); + + /* We will scale the subtitle up to fit _video_container_size, and also by the additional subtitle_scale */ + scaled_size.width = in_rect.width * video_container_size.width * sc->subtitle_scale (); + scaled_size.height = in_rect.height * video_container_size.height * sc->subtitle_scale (); + + /* Then we need a corrective translation, consisting of two parts: + * + * 1. that which is the result of the scaling of the subtitle by _video_container_size; this will be + * rect.x * _video_container_size.width and rect.y * _video_container_size.height. + * + * 2. that to shift the origin of the scale by subtitle_scale to the centre of the subtitle; this will be + * (width_before_subtitle_scale * (1 - subtitle_scale) / 2) and + * (height_before_subtitle_scale * (1 - subtitle_scale) / 2). + * + * Combining these two translations gives these expressions. + */ + + _out_position.x = rint (video_container_size.width * (in_rect.x + (in_rect.width * (1 - sc->subtitle_scale ()) / 2))); + _out_position.y = rint (video_container_size.height * (in_rect.y + (in_rect.height * (1 - sc->subtitle_scale ()) / 2))); + + _out_image = _in_image->scale ( + scaled_size, + Scaler::from_id ("bicubic"), + _in_image->pixel_format (), + true + ); + + /* XXX: hack */ + Time from = _in_from; + Time to = _in_to; + shared_ptr vc = dynamic_pointer_cast (piece->content); + if (vc) { + from = rint (from * vc->video_frame_rate() / film->video_frame_rate()); + to = rint (to * vc->video_frame_rate() / film->video_frame_rate()); + } + + _out_from = from + piece->content->position (); + _out_to = to + piece->content->position (); +} + +bool +Subtitle::covers (Time t) const +{ + return _out_from <= t && t <= _out_to; +} diff --git a/src/lib/subtitle.h b/src/lib/subtitle.h new file mode 100644 index 000000000..7ba5912e0 --- /dev/null +++ b/src/lib/subtitle.h @@ -0,0 +1,59 @@ +/* + Copyright (C) 2013-2014 Carl Hetherington + + 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 of the License, 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., 675 Mass Ave, Cambridge, MA 02139, USA. + +*/ + +#include +#include +#include +#include "rect.h" +#include "types.h" + +class Film; +class Piece; +class Image; + +class Subtitle +{ +public: + + Subtitle (boost::shared_ptr, libdcp::Size, boost::weak_ptr, boost::shared_ptr, dcpomatic::Rect, Time, Time); + + void update (boost::shared_ptr, libdcp::Size); + + bool covers (Time t) const; + + boost::shared_ptr out_image () const { + return _out_image; + } + + Position out_position () const { + return _out_position; + } + +private: + boost::weak_ptr _piece; + boost::shared_ptr _in_image; + dcpomatic::Rect _in_rect; + Time _in_from; + Time _in_to; + + boost::shared_ptr _out_image; + Position _out_position; + Time _out_from; + Time _out_to; +}; diff --git a/src/lib/wscript b/src/lib/wscript index dc90e17f3..d4231fd30 100644 --- a/src/lib/wscript +++ b/src/lib/wscript @@ -53,6 +53,7 @@ sources = """ sndfile_content.cc sndfile_decoder.cc sound_processor.cc + subtitle.cc subtitle_content.cc subtitle_decoder.cc timer.cc -- cgit v1.2.3 From 9c1e0071803bf05f8c476d870e360c9e320ba696 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Fri, 25 Apr 2014 23:43:16 +0100 Subject: Fix subtitle display when the next subtitle is decoded before the previous one has finished; this requires that more than one subtitle be kept by the player. Reported-by: Matthias Damm --- ChangeLog | 5 +++++ src/lib/player.cc | 47 ++++++++++++++++++++++++++++++++++++----------- src/lib/player.h | 2 +- src/lib/subtitle.cc | 10 ++++++++++ src/lib/subtitle.h | 15 ++++++++++++++- 5 files changed, 66 insertions(+), 13 deletions(-) (limited to 'src/lib') diff --git a/ChangeLog b/ChangeLog index aaed91983..d8307c4f5 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2014-04-25 Carl Hetherington + + * Fix subtitle display when the next subtitle is decoded before the previous + one has finished. + 2014-04-24 Carl Hetherington * Version 1.66.14 released. diff --git a/src/lib/player.cc b/src/lib/player.cc index d0653bc43..1bb2e7cf4 100644 --- a/src/lib/player.cc +++ b/src/lib/player.cc @@ -219,17 +219,34 @@ Player::process_video (weak_ptr weak_piece, shared_ptr image ) ); - if (_film->with_subtitles () && _subtitle && _subtitle->out_image() && _subtitle->covers (time)) { + if (_film->with_subtitles ()) { + for (list::const_iterator i = _subtitles.begin(); i != _subtitles.end(); ++i) { + if (i->covers (time)) { + /* This may be true for more than one of _subtitles, but the last (latest-starting) + one is the one we want to use, so that's ok. + */ + Position const container_offset ( + (_video_container_size.width - image_size.width) / 2, + (_video_container_size.height - image_size.width) / 2 + ); + + pi->set_subtitle (i->out_image(), i->out_position() + container_offset); + } + } + } - Position const container_offset ( - (_video_container_size.width - image_size.width) / 2, - (_video_container_size.height - image_size.width) / 2 - ); + /* Clear out old subtitles */ + for (list::iterator i = _subtitles.begin(); i != _subtitles.end(); ) { + list::iterator j = i; + ++j; + + if (i->ends_before (time)) { + _subtitles.erase (i); + } - pi->set_subtitle (_subtitle->out_image(), _subtitle->out_position() + container_offset); + i = j; } - - + #ifdef DCPOMATIC_DEBUG _last_video = piece->content; #endif @@ -466,9 +483,10 @@ Player::content_changed (weak_ptr w, int property, bool frequent) property == SubtitleContentProperty::SUBTITLE_SCALE ) { - if (_subtitle) { - _subtitle->update (_film, _video_container_size); + for (list::iterator i = _subtitles.begin(); i != _subtitles.end(); ++i) { + i->update (_film, _video_container_size); } + Changed (frequent); } else if ( @@ -576,7 +594,14 @@ Player::film_changed (Film::Property p) void Player::process_subtitle (weak_ptr weak_piece, shared_ptr image, dcpomatic::Rect rect, Time from, Time to) { - _subtitle = Subtitle (_film, _video_container_size, weak_piece, image, rect, from, to); + if (!image) { + /* A null image means that we should stop any current subtitles at `from' */ + for (list::iterator i = _subtitles.begin(); i != _subtitles.end(); ++i) { + i->set_stop (from); + } + } else { + _subtitles.push_back (Subtitle (_film, _video_container_size, weak_piece, image, rect, from, to)); + } } /** Re-emit the last frame that was emitted, using current settings for crop, ratio, scaler and subtitles. diff --git a/src/lib/player.h b/src/lib/player.h index 5dad80ec7..4d911a83b 100644 --- a/src/lib/player.h +++ b/src/lib/player.h @@ -143,7 +143,7 @@ private: boost::shared_ptr _black_frame; std::map, boost::shared_ptr > _resamplers; - boost::optional _subtitle; + std::list _subtitles; #ifdef DCPOMATIC_DEBUG boost::shared_ptr _last_video; diff --git a/src/lib/subtitle.cc b/src/lib/subtitle.cc index f348833b0..0d18861c4 100644 --- a/src/lib/subtitle.cc +++ b/src/lib/subtitle.cc @@ -97,6 +97,8 @@ Subtitle::update (shared_ptr film, libdcp::Size video_container_size _out_from = from + piece->content->position (); _out_to = to + piece->content->position (); + + check_out_to (); } bool @@ -104,3 +106,11 @@ Subtitle::covers (Time t) const { return _out_from <= t && t <= _out_to; } + +void +Subtitle::check_out_to () +{ + if (_stop && _out_to > _stop.get ()) { + _out_to = _stop.get (); + } +} diff --git a/src/lib/subtitle.h b/src/lib/subtitle.h index 7ba5912e0..c74f5c1b9 100644 --- a/src/lib/subtitle.h +++ b/src/lib/subtitle.h @@ -19,6 +19,7 @@ #include #include +#include #include #include "rect.h" #include "types.h" @@ -34,8 +35,15 @@ public: Subtitle (boost::shared_ptr, libdcp::Size, boost::weak_ptr, boost::shared_ptr, dcpomatic::Rect, Time, Time); void update (boost::shared_ptr, libdcp::Size); + void set_stop (Time t) { + _stop = t; + check_out_to (); + } bool covers (Time t) const; + bool ends_before (Time t) const { + return _out_to < t; + } boost::shared_ptr out_image () const { return _out_image; @@ -45,7 +53,9 @@ public: return _out_position; } -private: +private: + void check_out_to (); + boost::weak_ptr _piece; boost::shared_ptr _in_image; dcpomatic::Rect _in_rect; @@ -56,4 +66,7 @@ private: Position _out_position; Time _out_from; Time _out_to; + + /** Time at which this subtitle should stop (overriding _out_to) */ + boost::optional