Opened 5 months ago
Last modified 5 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 , 5 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 , 5 months ago
| Summary: | RFE: looping animated GIFs → RFE: looping animated PNGs |
|---|---|
| Type: | defect → enhancement |
comment:3 by , 5 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.