Opened 4 months ago
Last modified 4 months ago
#17942 assigned enhancement
RFE: looping animated PNGs
Reported by: | Tristan Croll | Owned by: | Tom Goddard |
---|---|---|---|
Priority: | normal | Milestone: | |
Component: | Input/Output | Version: | |
Keywords: | Cc: | ||
Blocked By: | Blocking: | ||
Notify when closed: | Platform: | all | |
Project: | ChimeraX |
Description
The following bug report has been submitted: Platform: Linux-6.8.0-59-generic-x86_64-with-glibc2.35 ChimeraX Version: 1.9 (2024-12-11 19:11:19 UTC) Description Would it be possible to add an option to `movie encode` to make animated PNGs loop forever? We're being pressured to use Google Slides for all presentations, and it turns out to have remarkably aggravating limitations when it comes to looping video (which I, like many others, use extensively for doing little "rocking" animations to provide depth perception on complex molecular scenes. Problem is, there is no PowerPoint-like mechanism to loop a video - the only option is, during the presentation, to right-click on the playing video and tell it to loop. The only real options available seem to be animated GIF or PNG - but unless they were encoded to loop forever it will only play them once (and if there's a mechanism to replay them, I haven't found it). Anyway, I did a quick-and-dirty hack to my personal copy of ChimeraX at https://github.com/RBVI/ChimeraX/blob/1390a711c1b665ffbc53aad80e3f5b12fec07dc2/src/bundles/movie/src/encode.py#L120 to add: {{{ if output_format=='apng': arg_list.append('-plays') arg_list.append('0') }}} ... which does the trick for me - but I'm sure this is an option that others might appreciate as well. OpenGL version: 3.3.0 NVIDIA 535.230.02 OpenGL renderer: NVIDIA GeForce RTX 3070/PCIe/SSE2 OpenGL vendor: NVIDIA Corporation Python: 3.11.4 Locale: en_GB.UTF-8 Qt version: PyQt6 6.7.1, Qt 6.7.1 Qt runtime version: 6.7.3 Qt platform: xcb XDG_SESSION_TYPE=x11 DESKTOP_SESSION=ubuntu XDG_SESSION_DESKTOP=ubuntu XDG_CURRENT_DESKTOP=ubuntu:GNOME DISPLAY=:1 Manufacturer: Dell Inc. Model: XPS 8950 OS: Ubuntu 22.04 Architecture: 64bit ELF Virtual Machine: none CPU: 20 12th Gen Intel(R) Core(TM) i7-12700 Cache Size: 25600 KB Memory: total used free shared buff/cache available Mem: 31Gi 18Gi 4.2Gi 2.0Gi 8.1Gi 9.8Gi Swap: 2.0Gi 2.0Gi 0.0Ki Graphics: 0000:01:00.0 VGA compatible controller [0300]: NVIDIA Corporation GA104 [GeForce RTX 3070 Lite Hash Rate] [10de:2488] (rev a1) Subsystem: Dell GA104 [GeForce RTX 3070 Lite Hash Rate] [1028:c903] Kernel driver in use: nvidia Installed Packages: alabaster: 1.0.0 anyio: 4.7.0 appdirs: 1.4.4 asttokens: 3.0.0 auditwheel: 6.1.0 autocommand: 2.2.2 babel: 2.16.0 backports.tarfile: 1.2.0 beautifulsoup4: 4.12.3 blockdiag: 3.0.0 blosc2: 3.0.0 build: 1.2.1 certifi: 2024.8.30 cftime: 1.6.4.post1 charset-normalizer: 3.4.0 ChimeraX-AddCharge: 1.5.18 ChimeraX-AddH: 2.2.6 ChimeraX-AlignmentAlgorithms: 2.0.2 ChimeraX-AlignmentHdrs: 3.5 ChimeraX-AlignmentMatrices: 2.1 ChimeraX-Alignments: 2.16.1 ChimeraX-AlphaFold: 1.0.1 ChimeraX-AltlocExplorer: 1.1.2 ChimeraX-AmberInfo: 1.0 ChimeraX-Arrays: 1.1 ChimeraX-Atomic: 1.58.8 ChimeraX-AtomicLibrary: 14.1.11 ChimeraX-AtomSearch: 2.0.1 ChimeraX-AxesPlanes: 2.4 ChimeraX-BasicActions: 1.1.2 ChimeraX-BILD: 1.0 ChimeraX-BlastProtein: 3.0.0 ChimeraX-BondRot: 2.0.4 ChimeraX-BugReporter: 1.0.1 ChimeraX-BuildStructure: 2.13.1 ChimeraX-Bumps: 1.0 ChimeraX-BundleBuilder: 1.4.0 ChimeraX-ButtonPanel: 1.0.1 ChimeraX-CageBuilder: 1.0.1 ChimeraX-CellPack: 1.0 ChimeraX-Centroids: 1.4 ChimeraX-ChangeChains: 1.1 ChimeraX-CheckWaters: 1.4 ChimeraX-ChemGroup: 2.0.1 ChimeraX-Clashes: 2.3 ChimeraX-Clipper: 0.24.0 ChimeraX-ColorActions: 1.0.5 ChimeraX-ColorGlobe: 1.0 ChimeraX-ColorKey: 1.5.6 ChimeraX-CommandLine: 1.2.5 ChimeraX-ConnectStructure: 2.0.1 ChimeraX-Contacts: 1.0.1 ChimeraX-Core: 1.9 ChimeraX-CoreFormats: 1.2 ChimeraX-coulombic: 1.4.4 ChimeraX-Crosslinks: 1.0 ChimeraX-Crystal: 1.0 ChimeraX-CrystalContacts: 1.0.1 ChimeraX-DataFormats: 1.2.3 ChimeraX-Dicom: 1.2.6 ChimeraX-DistMonitor: 1.4.2 ChimeraX-DockPrep: 1.1.3 ChimeraX-Dssp: 2.0 ChimeraX-EMDB-SFF: 1.0 ChimeraX-ESMFold: 1.0 ChimeraX-FileHistory: 1.0.1 ChimeraX-FunctionKey: 1.0.1 ChimeraX-Geometry: 1.3 ChimeraX-gltf: 1.0 ChimeraX-Graphics: 1.4.1 ChimeraX-Hbonds: 2.5 ChimeraX-Help: 1.3 ChimeraX-HKCage: 1.3 ChimeraX-IHM: 1.1 ChimeraX-ImageFormats: 1.2 ChimeraX-IMOD: 1.0 ChimeraX-IO: 1.0.3 ChimeraX-ISOLDE: 1.9 ChimeraX-ItemsInspection: 1.0.1 ChimeraX-IUPAC: 1.0 ChimeraX-KVFinder: 1.2.1 ChimeraX-Label: 1.1.14 ChimeraX-LinuxSupport: 1.0.1 ChimeraX-ListInfo: 1.2.2 ChimeraX-Log: 1.2 ChimeraX-LookingGlass: 1.1 ChimeraX-Maestro: 1.9.1 ChimeraX-Map: 1.3 ChimeraX-MapData: 2.0 ChimeraX-MapEraser: 1.0.1 ChimeraX-MapFilter: 2.0.1 ChimeraX-MapFit: 2.0 ChimeraX-MapSeries: 2.1.1 ChimeraX-Markers: 1.0.1 ChimeraX-Mask: 1.0.2 ChimeraX-MatchMaker: 2.1.6 ChimeraX-MCopy: 1.0 ChimeraX-MDcrds: 2.7.2 ChimeraX-MedicalToolbar: 1.1 ChimeraX-Meeting: 1.0.1 ChimeraX-MLP: 1.1.1 ChimeraX-mmCIF: 2.14.2 ChimeraX-MMTF: 2.2 ChimeraX-ModelArchive: 1.0 ChimeraX-Modeller: 1.5.18 ChimeraX-ModelPanel: 1.5 ChimeraX-ModelSeries: 1.0.1 ChimeraX-Mol2: 2.0.3 ChimeraX-Mole: 1.0 ChimeraX-Morph: 1.0.2 ChimeraX-MouseModes: 1.2 ChimeraX-Movie: 1.0 ChimeraX-MutationScores: 1.0 ChimeraX-Neuron: 1.0 ChimeraX-Nifti: 1.2 ChimeraX-NMRSTAR: 1.0.2 ChimeraX-NRRD: 1.2 ChimeraX-Nucleotides: 2.0.3 ChimeraX-OpenCommand: 1.14 ChimeraX-OrthoPick: 1.0.1 ChimeraX-PDB: 2.7.6 ChimeraX-PDBBio: 1.0.1 ChimeraX-PDBLibrary: 1.0.4 ChimeraX-PDBMatrices: 1.0 ChimeraX-PickBlobs: 1.0.1 ChimeraX-Positions: 1.0 ChimeraX-PresetMgr: 1.1.2 ChimeraX-PubChem: 2.2 ChimeraX-QScore: 1.2 ChimeraX-ReadPbonds: 1.0.1 ChimeraX-Registration: 1.1.2 ChimeraX-RemoteControl: 1.0 ChimeraX-RenderByAttr: 1.6.2 ChimeraX-RenumberResidues: 1.1 ChimeraX-ResidueFit: 1.0.1 ChimeraX-RestServer: 1.3.1 ChimeraX-RNALayout: 1.0 ChimeraX-RotamerLibMgr: 4.0 ChimeraX-RotamerLibsDunbrack: 2.0 ChimeraX-RotamerLibsDynameomics: 2.0 ChimeraX-RotamerLibsRichardson: 2.0 ChimeraX-SaveCommand: 1.5.1 ChimeraX-SchemeMgr: 1.0 ChimeraX-SDF: 2.0.2 ChimeraX-Segger: 1.0 ChimeraX-Segment: 1.0.1 ChimeraX-Segmentations: 3.5.6 ChimeraX-SelInspector: 1.0 ChimeraX-SeqView: 2.14 ChimeraX-Shape: 1.0.1 ChimeraX-Shell: 1.0.1 ChimeraX-Shortcuts: 1.2.0 ChimeraX-ShowSequences: 1.0.3 ChimeraX-SideView: 1.0.1 ChimeraX-SimilarStructures: 1.0.1 ChimeraX-Smiles: 2.1.2 ChimeraX-SmoothLines: 1.0 ChimeraX-SpaceNavigator: 1.0 ChimeraX-StdCommands: 1.18.1 ChimeraX-STL: 1.0.1 ChimeraX-Storm: 1.0 ChimeraX-StructMeasure: 1.2.1 ChimeraX-Struts: 1.0.1 ChimeraX-Surface: 1.0.1 ChimeraX-SwapAA: 2.0.1 ChimeraX-SwapRes: 2.5 ChimeraX-TapeMeasure: 1.0 ChimeraX-TaskManager: 1.0 ChimeraX-Test: 1.0 ChimeraX-Toolbar: 1.2.3 ChimeraX-ToolshedUtils: 1.2.4 ChimeraX-Topography: 1.0 ChimeraX-ToQuest: 1.0 ChimeraX-Tug: 1.0.1 ChimeraX-UI: 1.41 ChimeraX-Umap: 1.0 ChimeraX-uniprot: 2.3.1 ChimeraX-UnitCell: 1.0.1 ChimeraX-ViewDockX: 1.4.4 ChimeraX-VIPERdb: 1.0 ChimeraX-Vive: 1.1 ChimeraX-VolumeMenu: 1.0.1 ChimeraX-vrml: 1.0 ChimeraX-VTK: 1.0 ChimeraX-WavefrontOBJ: 1.0 ChimeraX-WebCam: 1.0.2 ChimeraX-WebServices: 1.1.4 ChimeraX-Zone: 1.0.1 colorama: 0.4.6 comm: 0.2.2 contourpy: 1.3.1 cxservices: 1.2.3 cycler: 0.12.1 Cython: 3.0.10 debugpy: 1.8.9 decorator: 5.1.1 distro: 1.9.0 docutils: 0.21.2 executing: 2.1.0 filelock: 3.15.4 fonttools: 4.55.3 funcparserlib: 2.0.0a0 glfw: 2.8.0 grako: 3.16.5 h11: 0.14.0 h5py: 3.12.1 html2text: 2024.2.26 httpcore: 1.0.7 httpx: 0.28.1 idna: 3.10 ihm: 1.3 imagecodecs: 2024.6.1 imagesize: 1.4.1 importlib_metadata: 8.0.0 importlib_resources: 6.4.0 inflect: 7.3.1 ipykernel: 6.29.5 ipython: 8.26.0 ipywidgets: 8.1.5 jaraco.context: 5.3.0 jaraco.functools: 4.0.1 jaraco.text: 3.12.1 jedi: 0.19.1 Jinja2: 3.1.4 jupyter_client: 8.6.2 jupyter_core: 5.7.2 jupyterlab_widgets: 3.0.13 kiwisolver: 1.4.7 line_profiler: 4.1.3 lxml: 5.2.2 lz4: 4.3.3 MarkupSafe: 3.0.2 matplotlib: 3.9.2 matplotlib-inline: 0.1.7 more-itertools: 10.3.0 msgpack: 1.0.8 ndindex: 1.9.2 nest-asyncio: 1.6.0 netCDF4: 1.6.5 networkx: 3.3 nibabel: 5.2.0 nptyping: 2.5.0 numexpr: 2.10.2 numpy: 1.26.4 openvr: 1.26.701 ordered-set: 4.1.0 packaging: 23.2 packaging: 24.1 ParmEd: 4.2.2 parso: 0.8.4 pep517: 0.13.1 pexpect: 4.9.0 pillow: 10.4.0 pip: 24.2 pkginfo: 1.11.1 platformdirs: 4.3.6 platformdirs: 4.2.2 prompt_toolkit: 3.0.48 psutil: 6.0.0 ptyprocess: 0.7.0 pure_eval: 0.2.3 py-cpuinfo: 9.0.0 pycollada: 0.8 pydicom: 2.4.4 pyelftools: 0.31 Pygments: 2.18.0 pynmrstar: 3.3.4 pynrrd: 1.0.0 PyOpenGL: 3.1.7 PyOpenGL-accelerate: 3.1.7 pyopenxr: 1.0.3401 pyparsing: 3.2.0 pyproject_hooks: 1.2.0 PyQt6-commercial: 6.7.1 PyQt6-Qt6: 6.7.3 PyQt6-WebEngine-commercial: 6.7.0 PyQt6-WebEngine-Qt6: 6.7.3 PyQt6-WebEngineSubwheel-Qt6: 6.7.3 PyQt6_sip: 13.8.0 python-dateutil: 2.9.0.post0 pytz: 2024.2 pyzmq: 26.2.0 qtconsole: 5.5.2 QtPy: 2.4.2 qtshim: 1.0 RandomWords: 0.4.0 rdkit: 2024.9.6 requests: 2.32.3 scipy: 1.14.0 selfies: 2.2.0 Send2Trash: 1.8.3 SEQCROW: 1.8.17 setuptools: 72.1.0 sfftk-rw: 0.8.1 six: 1.16.0 sniffio: 1.3.1 snowballstemmer: 2.2.0 sortedcontainers: 2.4.0 soupsieve: 2.6 Sphinx: 8.0.2 sphinx-autodoc-typehints: 2.2.3 sphinxcontrib-applehelp: 2.0.0 sphinxcontrib-blockdiag: 3.0.0 sphinxcontrib-devhelp: 2.0.0 sphinxcontrib-htmlhelp: 2.1.0 sphinxcontrib-jsmath: 1.0.1 sphinxcontrib-qthelp: 2.0.0 sphinxcontrib-serializinghtml: 2.0.0 stack-data: 0.6.3 superqt: 0.6.3 tables: 3.10.1 tcia_utils: 1.5.1 tifffile: 2024.7.24 tinyarray: 1.2.4 tomli: 2.0.1 tornado: 6.4.2 traitlets: 5.14.3 typeguard: 4.3.0 typing_extensions: 4.12.2 typing_extensions: 4.12.2 tzdata: 2024.2 urllib3: 2.2.3 wcwidth: 0.2.13 webcolors: 24.6.0 wheel: 0.43.0 wheel: 0.43.0 wheel-filename: 1.4.1 widgetsnbextension: 4.0.13 zipp: 3.19.2
Change History (3)
comment:1 by , 4 months ago
Component: | Unassigned → Input/Output |
---|---|
Owner: | set to |
Platform: | → all |
Project: | → ChimeraX |
Status: | new → assigned |
Summary: | ChimeraX bug report submission → RFE: looping animated GIFs |
comment:2 by , 4 months ago
Summary: | RFE: looping animated GIFs → RFE: looping animated PNGs |
---|---|
Type: | defect → enhancement |
comment:3 by , 4 months ago
I can see uses for both options - particularly after banging my head against this more today. An animated PNG takes up ~10x the space of the equivalent mp4, and it seems Google Slides has some hard limit on how big a file it will actually animate (not sure exactly where the boundary is - somewhere between 90 and ~300 frames at 800x600). So in many cases it would probably actually be just as efficient to simply loop an mp4 10 times. On Mon, Jun 9, 2025 at 7:46 PM ChimeraX <ChimeraX-bugs-admin@cgl.ucsf.edu> wrote: > > > > > > >
Note:
See TracTickets
for help on using tickets.
Should be pretty easy to add a "loopPng true|false|int" option to the emovie encode command. The "-plays" option is only supported by the animated png format (apng).
Another idea is to add a more general loop option that takes an integer and uses the ffmpeg -stream_loop <N> which loops the input frames N times. But that makes an N times bigger movie so won't do for infinite looping.