chrome design and libwebrtc signs are quite different because of, among other things, the sandboxing. Libwebrtc lives in a single process, i.e. share a memory block across threads, while different process are isolated in chrome. Everything that crosses the boundary then needs to have a different memory model as processes cannot directly share memory. That's one of the reason, and it s illustrated by the IPCs (inter process calls) in the (old design document).
another reason is the capturer access. To be able to share a cam across tabs, you need the capturer (i.e. almost all GetUserMedia code based) to be in the Browser user agent, and then the frames (possibly rotated and/or scaled) are send over to their respective tabs, using .... yes you know it, IPC. The underlying VideoFrame classes then support different kind of storage: libwebrtc is in-memory by default, chrome can be either IPC-friendly, or GPU texture-based to avoid unnecessary frame copies along the pipeline.
Finally, to be thorough, the Echo cancellation can only be done right at the UA level as well, since it needs to be aware of all the possible audio sources contributing to the audio captured by the mic, and not only a single tab. In the old naive design, if you were opening two tabs, the echo cancellation would fail to take into account the audio coming from the second tab, and it would always fail.
Some other differences between standalone libwebrtc and browsers implementations, including directories are illustrated here (warning, details potentially outdated, but concepts still valid):
hope this helps.