> Inter prediction should allow you to copy from any block on the previous frame, effetely creating unlimited length wires in any direction.

I think "going inter" just gives you a third "dimension" along which you can still only travel one way -- but you need bidirectional travel (outputs feeding back into inputs) to implement memory. It makes sense to me that bidirectional travel is not possible here, since it would necessitate some kind of "keep processing until convergence" that could (and often would) prevent the decoder from making progress.

> This also makes the previous frame latched storage, without having to construct a latch from gates.

This makes me think we have different ideas of what "latched storage" means. I think the block that you would call a "latch in the previous frame" is functionally no different from a block elsewhere on the current frame? I don't see how it could have the same "address" but store a different value over time, which is what I'd call the defining property of all "storage".

> I think "going inter" just gives you a third "dimension" along which you can still only travel one way

Essentially intra prediction gives you two half dimensions. The temporal aspect of inter prediction gives you a third half dimension (which we could just call time). I agree that three half dimensions is not enough.

But... intra prediction also has motion compensation, which is essentially two full spacial dimensions that are accessible as long as you are traveling along the time dimension. And apparently 2.5D is enough. [1]

I'm not sure how you can should add these dimensions together, but arguably we are talking about 3.5D, which should be way more than enough.

> This makes me think we have different ideas of what "latched storage" means.

True. The value latched at the end of the previous frame would arguably count as globally-clocked storage, not latched. It's just in regular electronics, you are using latched storage to build clocked storage, so I kind of saw clocked as a superset of latched.

Which might be true, I can't really see a reason why you couldn't construct a latch from globally-clocked storage generally (as long as you have already solved the problem of moving backwards). At least in this case it's trivial, you just move both inputs back towards the top-left of the next frame.

> I think the block that you would call a "latch in the previous frame" is functionally no different from a block elsewhere on the current frame?

The two differences are that it has been stored, and that full 2.5D movement has been unlocked.

> I don't see how it could have the same "address" but store a different value over time

You would implement this as one key frame of initial state fed into the decoder, followed by unlimited copies of a processing frame that does the calculation. The x-y position within a frame is your address, and each frame is a snapshot of time moving forwards.

I don't object to something external "feeding the same frame into the decoder" because so many early examples of things that were proved to be Turing complete required the operator to glue the input tape into a loop.

And maybe there is an existing codec or container out there that can build such a loop without anything external. (Like... DVDs allow you to loop, but I suspect the standard requires the loop target to be an I frame... Actual decoders might not) And you always have the option of just building a really long file (it will even zip really well)

Though as I said, I do hesitate to label something that can't terminate out of a loop as Turing complete. But you can just make it reach a steady state and have the operator recognise when it's finished.

[1] https://cs.stanford.edu/people/eroberts/courses/soco/project...