Repository: abhiTronix/deffcode (language: python)

Issue:
[Idea]: Add New Recipes docs
<!--- Add a brief title for your issue above -->


## Brief Description

<!--- Provide a brief description of the change or addition you are proposing -->
Add example docs for Live-Device Inputs such (as Webcams, Screen-capture, Virtual Cameras).


### Context
<!--- Why is this change important to you? How would you use it? -->
<!--- Will this change the existing DeFFcode APIs or docs? How? -->
<!--- How can it benefit other users? -->
Recently added `v0.2.1` - support for Live-Device Inputs such (as Webcams, Screen-capture, Virtual Cameras) in #16 is still missing docs. This Issue will track the addition of example docs for using these devices with Deffcode APIs.

### Your Current Environment
<!--- Include as many relevant details about the environment you worked in -->
* DeFFcode version: <!--- Run command `python -c "import deffcode; print(deffcode.__version__)"` --> 0.2.2
* Python version: <!---Run command `python -V` --> all
* Operating System and version: all
[BUG] FFdecoder API throws IOError for streams without Video Bitrate and Framerate 
<!--
    Please note that your issue will be fixed much faster if you spend about
    half an hour preparing it, including the exact reproduction steps and a demo.

    If you're in a hurry or don't feel confident, it's fine to report bugs with
    less details, but this makes it less likely they'll get fixed soon.

    If the important info is missing we'll add the 'need more info' label 
    or may choose to close the issue until there is enough information provided.
-->

<!--
Note: Please search to see if an issue already exists for the bug you encountered.
-->


## Brief Description
<!-- Provide a brief introduction to the issue, and why you consider it to be a bug -->

FFdecoder API currently unable to run and throws `IOError` for multimedia streams without Video Bitrate and Framerate defined, such as from `lavfi` input virtual device which has FFmpeg output:

```sh
Input #0, lavfi, from 'rgbtestsrc':
  Duration: N/A, start: 0.000000, bitrate: N/A
  Stream #0:0: Video: rawvideo (RGBA / 0x41424752), rgba, 320x240 [SAR 1:1 DAR 4:3], 25 tbr, 25 tbn
```
 

### Acknowledgment
<!-- By posting an issue you acknowledge the following: (Put an `x` in all the boxes that apply(important)) -->

- [x] I have searched the [issues](https://github.com/abhiTronix/deffcode/issues) for my issue and found nothing related or helpful.
- [x] I have read the DeFFcode [Documentation](https://abhitronix.github.io/deffcode/latest).
- [x] I have read the DeFFcode [Issue Guidelines](https://abhitronix.github.io/deffcode/latest/contribution/issue/).


### Current Environment
<!-- Include as many relevant details about the environment you experienced the bug in -->
* My DeFFcode version: <!-- Run command `python -c "import deffcode; print(deffcode.__version__)"` --> `v0.2.2-dev`
* My Python version: <!---Run command `python -V` --> all 
* My Pip version: <!-- Run command `python -c "import pip; print(pip.__version__)"` --> latest
* My Operating System and its version: <!--- `Windows 10` | `Ubuntu 18.04` | `macOS big slur` etc. --> all

### Expected Behavior
<!-- Tell us what should happen -->
Should work for multimedia streams without Video Bitrate and Framerate defined

### Actual Behavior
<!-- Tell us what happens instead -->
<!-- You can turn ```verbose=True``` in parameters of the respective DeFFcode API for getting debug output -->
Throws IOError/OSError:
```sh
Traceback (most recent call last):
  File "p.py", line 10, in <module>
    decoder = FFdecoder("rgbtestsrc", source_demuxer="lavfi", frame_format="bgr24", verbose=True, **ffparams).formulate()
  File "C:\Users\foo\AppData\Roaming\Python\Python38\site-packages\deffcode\ffdecoder.py", line 162, in __init__
    Sourcer(
  File "C:\Users\foo\AppData\Roaming\Python\Python38\site-packages\deffcode\sourcer.py", line 224, in probe_stream
    raise IOError(
OSError: Invalid source provided. No usable Audio/Video stream detected. Aborting!!!
```
### Possible Fix
<!-- Not obligatory, but suggest a fix or reason for the bug or else remove this block-->
Make Framerate extraction more robust by falling back to extracting **TBR** instead on failure because it is [ffmpeg's best guess](https://stackoverflow.com/questions/3199489/meaning-of-ffmpeg-output-tbc-tbn-tbr) as to what the framerate actually is.

### Steps to reproduce
<!--
  How would you describe your issue to someone who doesn’t know you or your project?
  Try to write a sequence of steps that anybody can repeat to see the issue.
-->
Run this python code:
```python
# import the necessary packages
from deffcode import FFdecoder
import cv2

# initialize and formulate the decoder with "rgbtestsrc" source of
# `1280x720` frame size and `30` framerate for BGR24 output
decoder = FFdecoder(
    "rgbtestsrc=size=1280x720:rate=30",
    source_demuxer="lavfi",
    frame_format="bgr24",
    verbose=True
).formulate()

# grab the BGR24 frame from the decoder
for frame in decoder.generateFrame():

    # check if frame is None
    if frame is None:
        break

    # {do something with the frame here}

    # Show output window
    cv2.imshow("Output", frame)

    # check for 'q' key if pressed
    key = cv2.waitKey(1) & 0xFF
    if key == ord("q"):
        break

# close output window
cv2.destroyAllWindows()

# terminate the decoder
decoder.terminate()
```
[Idea]: Add New Recipes docs
<!--- Add a brief title for your issue above -->


## Brief Description

<!--- Provide a brief description of the change or addition you are proposing -->
Add example docs for Live-Device Inputs such (as Webcams, Screen-capture, Virtual Cameras).


### Context
<!--- Why is this change important to you? How would you use it? -->
<!--- Will this change the existing DeFFcode APIs or docs? How? -->
<!--- How can it benefit other users? -->
Recently added `v0.2.1` - support for Live-Device Inputs such (as Webcams, Screen-capture, Virtual Cameras) in #16 is still missing docs. This Issue will track the addition of example docs for using these devices with Deffcode APIs.

### Your Current Environment
<!--- Include as many relevant details about the environment you worked in -->
* DeFFcode version: <!--- Run command `python -c "import deffcode; print(deffcode.__version__)"` --> 0.2.2
* Python version: <!---Run command `python -V` --> all
* Operating System and version: all
[BUG] FFdecoder API throws IOError for streams without Video Bitrate and Framerate 
<!--
    Please note that your issue will be fixed much faster if you spend about
    half an hour preparing it, including the exact reproduction steps and a demo.

    If you're in a hurry or don't feel confident, it's fine to report bugs with
    less details, but this makes it less likely they'll get fixed soon.

    If the important info is missing we'll add the 'need more info' label 
    or may choose to close the issue until there is enough information provided.
-->

<!--
Note: Please search to see if an issue already exists for the bug you encountered.
-->


## Brief Description
<!-- Provide a brief introduction to the issue, and why you consider it to be a bug -->

FFdecoder API currently unable to run and throws `IOError` for multimedia streams without Video Bitrate and Framerate defined, such as from `lavfi` input virtual device which has FFmpeg output:

```sh
Input #0, lavfi, from 'rgbtestsrc':
  Duration: N/A, start: 0.000000, bitrate: N/A
  Stream #0:0: Video: rawvideo (RGBA / 0x41424752), rgba, 320x240 [SAR 1:1 DAR 4:3], 25 tbr, 25 tbn
```
 

### Acknowledgment
<!-- By posting an issue you acknowledge the following: (Put an `x` in all the boxes that apply(important)) -->

- [x] I have searched the [issues](https://github.com/abhiTronix/deffcode/issues) for my issue and found nothing related or helpful.
- [x] I have read the DeFFcode [Documentation](https://abhitronix.github.io/deffcode/latest).
- [x] I have read the DeFFcode [Issue Guidelines](https://abhitronix.github.io/deffcode/latest/contribution/issue/).


### Current Environment
<!-- Include as many relevant details about the environment you experienced the bug in -->
* My DeFFcode version: <!-- Run command `python -c "import deffcode; print(deffcode.__version__)"` --> `v0.2.2-dev`
* My Python version: <!---Run command `python -V` --> all 
* My Pip version: <!-- Run command `python -c "import pip; print(pip.__version__)"` --> latest
* My Operating System and its version: <!--- `Windows 10` | `Ubuntu 18.04` | `macOS big slur` etc. --> all

### Expected Behavior
<!-- Tell us what should happen -->
Should work for multimedia streams without Video Bitrate and Framerate defined

### Actual Behavior
<!-- Tell us what happens instead -->
<!-- You can turn ```verbose=True``` in parameters of the respective DeFFcode API for getting debug output -->
Throws IOError/OSError:
```sh
Traceback (most recent call last):
  File "p.py", line 10, in <module>
    decoder = FFdecoder("rgbtestsrc", source_demuxer="lavfi", frame_format="bgr24", verbose=True, **ffparams).formulate()
  File "C:\Users\foo\AppData\Roaming\Python\Python38\site-packages\deffcode\ffdecoder.py", line 162, in __init__
    Sourcer(
  File "C:\Users\foo\AppData\Roaming\Python\Python38\site-packages\deffcode\sourcer.py", line 224, in probe_stream
    raise IOError(
OSError: Invalid source provided. No usable Audio/Video stream detected. Aborting!!!
```
### Possible Fix
<!-- Not obligatory, but suggest a fix or reason for the bug or else remove this block-->
Make Framerate extraction more robust by falling back to extracting **TBR** instead on failure because it is [ffmpeg's best guess](https://stackoverflow.com/questions/3199489/meaning-of-ffmpeg-output-tbc-tbn-tbr) as to what the framerate actually is.

### Steps to reproduce
<!--
  How would you describe your issue to someone who doesn’t know you or your project?
  Try to write a sequence of steps that anybody can repeat to see the issue.
-->
Run this python code:
```python
# import the necessary packages
from deffcode import FFdecoder
import cv2

# initialize and formulate the decoder with "rgbtestsrc" source of
# `1280x720` frame size and `30` framerate for BGR24 output
decoder = FFdecoder(
    "rgbtestsrc=size=1280x720:rate=30",
    source_demuxer="lavfi",
    frame_format="bgr24",
    verbose=True
).formulate()

# grab the BGR24 frame from the decoder
for frame in decoder.generateFrame():

    # check if frame is None
    if frame is None:
        break

    # {do something with the frame here}

    # Show output window
    cv2.imshow("Output", frame)

    # check for 'q' key if pressed
    key = cv2.waitKey(1) & 0xFF
    if key == ord("q"):
        break

# close output window
cv2.destroyAllWindows()

# terminate the decoder
decoder.terminate()
```


Discussion / hints:

Fix patch:
diff --git a/.github/workflows/docs_deployer.yml b/.github/workflows/docs_deployer.yml
index bbb0d8d..0c8891f 100644
--- a/.github/workflows/docs_deployer.yml
+++ b/.github/workflows/docs_deployer.yml
@@ -47,8 +47,7 @@ jobs:
         if: success()
       - name: install_docs_deps
         run: |
-          pip install -U mkdocs mkdocs-material mkdocs-git-revision-date-localized-plugin mkdocs-minify-plugin mkdocs-exclude mike
-          pip install mkdocstrings==0.17.0
+          pip install -U mkdocs mkdocs-material mkdocs-git-revision-date-localized-plugin mkdocs-minify-plugin mkdocs-exclude mike mkdocstrings mkdocstrings-python-legacy
           pip install jinja2==3.0.*
         if: success()
       - name: git configure
@@ -95,8 +94,7 @@ jobs:
         if: success()
       - name: install_docs_deps
         run: |
-          pip install -U mkdocs mkdocs-material mkdocs-git-revision-date-localized-plugin mkdocs-minify-plugin mkdocs-exclude mike
-          pip install mkdocstrings==0.17.0
+          pip install -U mkdocs mkdocs-material mkdocs-git-revision-date-localized-plugin mkdocs-minify-plugin mkdocs-exclude mike mkdocstrings mkdocstrings-python-legacy
           pip install jinja2==3.0.*
         if: success()
       - name: git configure
@@ -145,8 +143,7 @@ jobs:
         if: success()
       - name: install_docs_deps
         run: |
-          pip install -U mkdocs mkdocs-material mkdocs-git-revision-date-localized-plugin mkdocs-minify-plugin mkdocs-exclude mike
-          pip install mkdocstrings==0.17.0
+          pip install -U mkdocs mkdocs-material mkdocs-git-revision-date-localized-plugin mkdocs-minify-plugin mkdocs-exclude mike mkdocstrings mkdocstrings-python-legacy
           pip install jinja2==3.0.*
         if: success()
       - name: git configure
diff --git a/README.md b/README.md
index a098d28..d15656d 100644
--- a/README.md
+++ b/README.md
@@ -19,7 +19,10 @@ limitations under the License.
 -->
 
 <div align="center">
-  <img src="https://abhitronix.github.io/deffcode/latest/assets/images/deffcode.png" alt="DeFFcode" title="Logo designed by Abhishek Thakur(@abhiTronix), under CC-BY-NC-SA 4.0 License" width="80%"/>
+  
+  ![DeFFcode](docs/overrides/assets/images/deffcode.png#gh-light-mode-only)
+  ![DeFFcode](docs/overrides/assets/images/deffcode-dark.png#gh-dark-mode-only)
+
 </div>
 
 <div align="center">
@@ -30,164 +33,278 @@ limitations under the License.
 
 [![Code Style][black-badge]][black]
 
-</div>
 
-<div align="center">
-  <img src="https://abhitronix.github.io/deffcode/latest/assets/images/deffcode-tagline.png" alt="DeFFcode tagline" width="40%"/>
+----
 
+[Releases][release]&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;[Recipes][recipes]&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;[Documentation][docs]&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;[Installation][installation-notes]&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;[License](#copyright)
 
 ----
 
-[Releases][release]&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;[Documentation][docs]&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;[Installation][install]&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;[License](#copyright)
+</div>
+
+<div align="center">
 
-----
+DeFFcode - A cross-platform **High-performance Video Frames Decoder** that flexibly executes <br>FFmpeg pipeline inside a subprocess pipe for generating real-time, low-overhead, <br>lightning fast video frames with robust error-handling <br>in just a few lines of python code ⚡
 
 </div>
 
 &thinsp;
 
+**<ins>Highly Adaptive</ins> -** _DeFFcode APIs implements a **standalone highly-extensible wrapper around [FFmpeg][ffmpeg]** multimedia framework. These APIs **supports a wide-ranging media streams as input** source such as [live USB/Virtual/IP camera feeds][capturing-and-previewing-frames-from-a-webcam], [regular multimedia files][capturing-rgb-frames-from-a-video-file], [screen recordings][capturing-and-previewing-frames-from-your-desktop], [image sequences][decoding-image-sequences], [network URL schemes][decoding-network-streams] (such as HTTP(s), RTP/RSTP, etc.), so on and so forth._
 
-## Overview
+**<ins>Highly Flexible</ins> -** _DeFFcode APIs gains an edge over other FFmpeg Wrappers by providing **complete control over the underline pipeline** including **access to almost any FFmpeg specification thinkable** such as specifying framerate, resolution, hardware decoder(s), filtergraph(s), and pixel-format(s) that are readily **supported by all well known Computer Vision libraries**._
 
-> DeFFcode is a powerful High-performance Real-time **Video frames Generator** that wraps FFmpeg pipeline inside a subprocess module for generating blazingly fast video frames in python 🔥
+**<ins>Highly Convenient</ins> -** _FFmpeg has a steep learning curve especially for users unfamiliar with a command line interface. DeFFcode helps users by maintaining the **same standard [OpenCV-Python](https://docs.opencv.org/4.x/d6/d00/tutorial_py_root.html) (Python API for OpenCV) coding syntax for its APIs**, thereby making it even **easier to learn, create, and develop FFmpeg based apps** in Python._
 
-The primary purpose of DeFFcode is to provide a cross-platform solution for fast and low-overhead decoding of a wide range of video streams into 3D [`ndarray`](https://numpy.org/doc/stable/reference/arrays.ndarray.html#the-n-dimensional-array-ndarray) frames while providing **complete control over the underlying FFmpeg pipeline** without the need to go deeper into hefty documentation and in just a few lines of python code.
+&nbsp;
 
-DeFFcode can **extract frames in real-time with any custom specification imaginable** such as Framerate, Resolution, Hardware decoding, Complex Filters into any pixel format while giving users the complete freedom to play with any desired FFmpeg supported parameter. On top of that, DeFFcode enables **effortless and precise FFmpeg Frame Seeking** natively. 
+### Key features of DeFFcode
 
-Finally, DeFFcode APIs are designed with **simplicity, flexibility, and modularity** in mind for the best developer experience. 
+Here are some key features that stand out:
 
+- High-performance, low-overhead video frames decoding with robust error-handling.
+- Flexible API with access to almost any FFmpeg specification thinkable.
+- Supports a wide-range of media streams/devices/protocols as input source.
+- Curated list of well-documented recipes ranging from [**Basic**][basic-recipes] to [**Advanced**][advanced-recipes] skill levels.
+- Easy to code **Real-time [Simple][transcoding-live-simple-filtergraphs] & [Complex][transcoding-live-complex-filtergraphs] Filtergraphs**. _(Yes, You read it correctly "Real-time"!)_
+- Lightning fast dedicated **GPU-Accelerated Video [Decoding][hardware-accelerated-video-decoding] & [Transcoding][hardware-accelerated-video-transcoding]**.
+- Enables precise FFmpeg [**Key-frame Seeking**][extracting-key-frames-as-png-image] with pinpoint accuracy.
+- Effortless [**Metadata Extraction**][extracting-video-metadata] from all streams available in the source.
+- Maintains the standard easy to learn [**OpenCV-Python**](https://docs.opencv.org/4.x/d6/d00/tutorial_py_root.html) coding syntax.
+- Out-of-the-box support for all prominent Computer Vision libraries.
+- Cross-platform, runs on Python 3.7+, and easy to install.  
 
-&thinsp;
+<!--
+- [x] Lossless Transcoding support with [WriteGear](https://abhitronix.github.io/deffcode/latest/gears/writegear/introduction/). #TODO
+-->
 
-## Key Features
+&nbsp;
 
-DeFFcode APIs are build on [**FFmpeg**][ffmpeg] - a leading multimedia framework, that gives you the following:
+&nbsp;
 
-- Extremely exceptional real-time performance ⚡ with low-memory footprints.
-- Flexible API with access to almost every parameter available within FFmpeg.
-- Fast dedicated [Hardware-Accelerated Decoding](https://abhitronix.github.io/deffcode/latest/examples/advanced/#gpu-enabled-hardware-accelerated-decoding).
-- Precise FFmpeg [Frame Seeking](https://abhitronix.github.io/deffcode/latest/examples/basic/#saving-keyframes-as-image) with pinpoint accuracy.
-- Extensive support for real-time [Complex FFmpeg Filters](https://abhitronix.github.io/deffcode/latest/examples/advanced/#generating-video-with-complex-filter-applied).
-- Out-of-the-box support for Computer Vision libraries like OpenCV, Pytorch, etc.
-- Support a wide range of media files, devices, image-sequence and network streams.
-- Easier to ingest streams into any pixel format that FFmpeg supports.
-- Lossless Transcoding support with [WriteGear](https://abhitronix.github.io/deffcode/latest/gears/writegear/introduction/).
-- Fewer hard dependencies, and easy to install. 
-- Designed modular for best developer experience.
-- Cross-platform and runs on Python 3.7+
+# Getting Started
 
+---
 
-&nbsp;
+**📚 Documentation: https://abhitronix.github.io/deffcode**
 
-## Requirements
+---
 
-- Python 3.7+
-- FFmpeg _(See [this doc](https://abhitronix.github.io/deffcode/latest/installation/ffmpeg_install/) for its installation)_
+## Installation:
 
+If this is your first time using DeFFcode, head straight to the **[Installation Notes][installation-notes] to install DeFFcode on your machine**.
 
-&nbsp;
+<br>
 
-## Installation
+<br>
 
-Installation is as simple as:
+### Recipes _a.k.a_ Examples:
 
-```sh
-$ (sudo) pip install deffcode
-```
+Once you have DeFFcode installed, checkout our Well-Documented **[Recipes 🍱][basic-recipes] for usage examples**:
 
-💡 For more details, see [installation notes][install].
+> **Note** In case you're run into any problems, consult our [Help section][help].
 
-&nbsp;
+### A. [**Basic Recipes 🍰**][basic-recipes]: _Recipes for beginners of any skill level to get started._
 
+<br>
+<div align="center">
+  <a href="https://abhitronix.github.io/deffcode/latest/recipes/basic/transcode-live-frames-simplegraphs/#transcoding-trimmed-and-reversed-video"><img src="docs/overrides/assets/gifs/bigbuckbunny_reversed.gif" alt="Big Buck Bunny Reversed" title="Click to view source code" width="70%" /> </a>
+  <br>
+  <sub><i>Big Buck Bunny Reversed using Live Simple Filtergraph</i></sub>
+</div>
 
-## Getting Started
+<br>
 
----
+<details open>
+  <summary><b>Basic Decoding Recipes</b></summary>
 
-**📚 Documentation: https://abhitronix.github.io/deffcode**
+- [Capturing RGB frames from a video file][capturing-rgb-frames-from-a-video-file]
+- [Capturing and Previewing BGR frames from a video file][capturing-and-previewing-bgr-frames-from-a-video-file] _(OpenCV Support)_
+- [Playing with any other FFmpeg pixel formats][capturing-and-previewing-bgr-frames-from-a-video-file]
+- [Capturing and Previewing frames from a Webcam][capturing-and-previewing-frames-from-a-webcam]
+- [Capturing and Previewing frames from your Desktop][capturing-and-previewing-frames-from-your-desktop] _(Screen Recording)_
+- [Capturing and Previewing frames from a HTTPs Stream][capturing-and-previewing-frames-from-a-https-stream]
+- [Capturing and Previewing frames from a RTSP/RTP Stream][capturing-and-previewing-frames-from-a-rtsprtp-stream]
+- [Capturing and Previewing frames from Sequence of images][capturing-and-previewing-frames-from-sequence-of-images]
+- [Capturing and Previewing frames from Single looping image][capturing-and-previewing-frames-from-single-looping-image]
 
----
+</details>
+
+<details open>
+  <summary><b>Basic Transcoding Recipes</b></summary>
+
+- [Transcoding video using OpenCV VideoWriter API][transcoding-video-using-opencv-videowriter-api]
+- [Transcoding lossless video using WriteGear API][transcoding-lossless-video-using-writegear-api]
+- [Transcoding Trimmed and Reversed video][transcoding-trimmed-and-reversed-video]
+- [Transcoding Cropped video][transcoding-cropped-video]
+- [Transcoding Rotated video (with `rotate` filter)][transcoding-rotated-video-with-rotate-filter]
+- [Transcoding Rotated video (with `transpose` filter)][transcoding-rotated-video-with-transpose-filter]   
+- [Transcoding Horizontally flipped and Scaled video][transcoding-horizontally-flipped-and-scaled-video]
+- [Extracting Key-frames as PNG image][extracting-key-frames-as-png-image]
+- [Generating Thumbnail with a Fancy filter][generating-thumbnail-with-a-fancy-filter]
+</details>
+
+<details open>
+  <summary><b>Basic Metadata Recipes</b></summary>
+
+- [Extracting video metadata using Sourcer API][extracting-video-metadata-using-sourcer-api]
+- [Extracting video metadata using FFdecoder API][extracting-video-metadata-using-ffdecoder-api]
+
+</details>
+
+<br>
+
+
+### B. [**Advanced Recipes 🥐**][advanced-recipes]: _Recipes to take your skills to the next level._
+
+<br>
+<p align="center">
+  <a href="https://abhitronix.github.io/deffcode/latest/recipes/advanced/decode-live-virtual-sources/#generate-and-decode-frames-from-mandelbrot-test-pattern-with-vectorscope-waveforms"><img src="docs/overrides/assets/gifs/mandelbrot_vectorscope_waveforms.gif" alt="mandelbrot test pattern" title="Click to view source code" width="70%" /></a>
+  <br>
+  <sub><i>Live Mandelbrot pattern with a Vectorscope & two Waveforms</i></sub>
+</p>
+
+<br>
+
+<details open>
+  <summary><b>Advanced Decoding Recipes</b></summary>
+
+- [Generate and Decode frames from Sierpinski pattern][generate-and-decode-frames-from-sierpinski-pattern]
+- [Generate and Decode frames from Test Source pattern][generate-and-decode-frames-from-test-source-pattern]
+- [Generate and Decode frames from Gradients with custom Text effect][generate-and-decode-frames-from-gradients-with-custom-text-effect]
+- [Generate and Decode frames from Mandelbrot test pattern with vectorscope & waveforms][generate-and-decode-frames-from-mandelbrot-test-pattern-with-vectorscope-waveforms]
+- [Generate and Decode frames from Game of Life Visualization][generate-and-decode-frames-from-game-of-life-visualization]
+- [GPU-accelerated Hardware-based Video Decoding][gpu-accelerated-hardware-based-video-decoding]
+
+</details>
+
+<details open>
+  <summary><b>Advanced Transcoding Recipes</b></summary>
 
-The default function of DeFFcode's [FFdecoder API](https://abhitronix.github.io/deffcode/latest/reference/ffdecoder/#ffdecoder-api) is to generate 24-bit RGB (3D [`ndarray`](https://numpy.org/doc/stable/reference/arrays.ndarray.html#the-n-dimensional-array-ndarray)) frames from the given source:
+- [Transcoding video with Live Custom watermark image overlay][transcoding-video-with-live-custom-watermark-image-overlay]
+- [Transcoding video from sequence of Images with additional filtering][transcoding-video-from-sequence-of-images-with-additional-filtering]
+- [Transcoding video art with YUV Bitplane Visualization][transcoding-video-art-with-yuv-bitplane-visualization]
+- [Transcoding video art with Jetcolor effect][transcoding-video-art-with-jetcolor-effect] 
+- [Transcoding video art with Ghosting effect][transcoding-video-art-with-ghosting-effect]
+- [Transcoding video art with Pixelation effect][transcoding-video-art-with-pixelation-effect]
+- [GPU-accelerated Hardware-based Video Transcoding with WriteGear API][gpu-accelerated-hardware-based-video-transcoding-with-writegear-api]
 
-```py title="grab_frames.py"
+</details>
+
+<details open>
+  <summary><b>Advanced Metadata Recipes</b></summary>
+
+- [Added new attributes to metadata in FFdecoder API][added-new-attributes-to-metadata-in-ffdecoder-api]
+- [Overriding source video metadata in FFdecoder API][overriding-source-video-metadata-in-ffdecoder-api]
+
+</details>
+
+<br>
+
+<br>
+
+## API in a nutshell:
+
+As a user, you just have to remember only two DeFFcode APIs, namely:
+
+### A. FFdecoder API 
+
+The primary function of [**FFdecoder API**][ffdecoder-api] is to **decode 24-bit RGB video frames** from the given source:
+
+> **Note** See [API Reference][ffdecoder-api] for more in-depth information.
+
+```py
 # import the necessary packages
 from deffcode import FFdecoder
 
-# formulate the decoder with suitable source(for e.g. foo.mp4)
-decoder = FFdecoder("foo.mp4").formulate()
+# formulate the decoder with suitable source
+decoder = FFdecoder("https://abhitronix.github.io/html/Big_Buck_Bunny_1080_10s_1MB.mp4").formulate()
 
 # grab RGB24(default) 3D frames from decoder
 for frame in decoder.generateFrame():
+    
     # lets print its shape
-    print(frame.shape)
-
-# print metadata as `json.dump`
-print(decoder.metadata)
+    print(frame.shape) # (1080, 1920, 3)
 
 # terminate the decoder
 decoder.terminate()
 ```
 
-For more examples and in-depth usage guide, kindly refer our **[Basic Recipes 🥧](https://abhitronix.github.io/deffcode/latest/examples/basic)** and **[Advanced Recipes 🔬](https://abhitronix.github.io/deffcode/latest/examples/advanced)**
+### B. Sourcer API 
 
+The primary function of [**Sourcer API**][sourcer-api] is to **gather metadata information from all multimedia streams available** in the given source:
 
-💡 In case you're run into any problems, consult our [Help](https://abhitronix.github.io/deffcode/latest/help/) section.
-
+```python
+# import the necessary packages
+from deffcode import Sourcer
 
-&nbsp;
+# initialize and formulate the decoder using suitable source
+sourcer = Sourcer("https://abhitronix.github.io/html/Big_Buck_Bunny_1080_10s_1MB.mp4").probe_stream()
 
-## Roadmap
-
-- [x] Add clean and elegant documentation.
-- [x] Add project Issue and PR templates. 
-- [x] Add related unit tests with `pytests`. 
-- [x] Automate stuff with Continuous Integration.
-- [x] Add Devices and Screen Capture support.
-- [ ] Add Multiple Source Inputs support.
-- [ ] Resolve High CPU usage issue with WriteGear API.
-- [ ] Add more parameters to Sourcer API's metadata.
-- [ ] Implement Buffer and Audio pass-through modes.
-- [ ] Add recipe for Source with Multiple Embedded Streams.
-- [ ] Add example to dynamically change writable FFdecoder API's metadata parameters. 
-- [ ] Add more Advanced Recipes and use cases.
-- [ ] Add preliminary benchmarks.
-- [ ] Make Frame Seeking dynamic. 
+# print metadata as `json.dump`
+print(sourcer.retrieve_metadata(pretty_json=True))
+```
 
-&nbsp;
+<details>
+  <summary><b>The resultant Terminal Output will look something as following on Windows machine</b></summary>
+
+  ```json
+      {
+        "ffmpeg_binary_path": "C:\\Users\\foo\\AppData\\Local\\Temp\\ffmpeg-static-win64-gpl/bin/ffmpeg.exe",
+        "source": "https://abhitronix.github.io/html/Big_Buck_Bunny_1080_10s_1MB.mp4",
+        "source_extension": ".mp4",
+        "source_video_resolution": [
+          1920,
+          1080
+        ],
+        "source_video_framerate": 60.0,
+        "source_video_pixfmt": "yuv420p",
+        "source_video_decoder": "h264",
+        "source_duration_sec": 10.0,
+        "approx_video_nframes": 600,
+        "source_video_bitrate": "832k",
+        "source_audio_bitrate": "",
+        "source_audio_samplerate": "",
+        "source_has_video": true,
+        "source_has_audio": false,
+        "source_has_image_sequence": false
+      }
+  ```
+</details>
 
-## Contributions
 
-> Contributions are welcome. We'd love to have your contributions to fix bugs or to implement new features!  
+&nbsp;
 
-Please see our **[Contribution Guidelines](https://abhitronix.github.io/deffcode/latest/contribution/)** for more details.
+&nbsp;
 
 
-&nbsp;
+# Contributions
 
-## Community Support
+> We're happy to meet new contributors💗 
 
-Join our Gitter community channel for quick discussions:
+We welcome your contributions to help us improve and extend this project. If you want to get involved with VidGear development, checkout the **[Contribution Guidelines ▶️][contribute]**
 
-[![Gitter](https://badges.gitter.im/deffcode/community.svg)](https://gitter.im/deffcode-python/community?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge)
+We're offering support for DeFFcode on [**Gitter Community Channel**][gitter]. Come and join the conversation over there!
 
+&nbsp;
 
 &nbsp;
 
 # Donations
 
-<img src="https://abhitronix.github.io/deffcode/latest/assets/images/help_us.png" alt="PiGear" width="50%" />
-
-> DeFFcode is free and open source and will always remain so. ❤️
+<div align="center">
+   <img src="docs/overrides/assets/images/help_us.png" alt="PiGear" width="50%" />
+   <p><i>DeFFcode is free and open source and will always remain so. ❤️</i></p>
+</div>
 
-It is something I am doing with my own free time. If you would like to say thanks, please feel free to make a donation:
+It is something I am doing with my own free time. But so much more needs to be done, and I need your help to do this. For just the price of a cup of coffee, you can make a difference 🙂
 
-[![ko-fi][kofi-badge]][kofi]
+<a href='https://ko-fi.com/W7W8WTYO' target='_blank'><img height='36' style='border:0px;height:36px;' src='https://cdn.ko-fi.com/cdn/kofi1.png?v=4' border='0' alt='Buy Me a Coffee at ko-fi.com' /></a>
 
 
 &nbsp;
 
+&nbsp;
 
 # Copyright
 
@@ -195,10 +312,10 @@ It is something I am doing with my own free time. If you would like to say thank
 
 This library is released under the **[Apache 2.0 License][license]**.
 
+
 <!--
-Badges
+CI Badges
 -->
-
 [appveyor]:https://img.shields.io/appveyor/ci/abhitronix/deffcode.svg?style=for-the-badge&logo=appveyor
 [codecov]:https://img.shields.io/codecov/c/gh/abhiTronix/deffcode?logo=codecov&style=for-the-badge&token=zrES4mwVKe
 [github-cli]:https://img.shields.io/github/workflow/status/abhiTronix/deffcode/GitHub%20Action%20workflow%20for%20Linux?style=for-the-badge&logo=data:image/svg%2bxml;base64,PHN2ZyB3aWR0aD0iNDgiIGhlaWdodD0iNDgiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PHBhdGggY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNMTAgMWE5IDkgMCAwMTkgOSA5IDkgMCAwMS05IDkgOSA5IDAgMDEtOS05IDkgOSAwIDAxOS05ek0yMyAxOWE2IDYgMCAxMTAgMTIgNiA2IDAgMDEwLTEyek0yMyAzNWE2IDYgMCAxMTAgMTIgNiA2IDAgMDEwLTEyeiIgc3Ryb2tlPSJ2YXIoLS1jb2xvci1tYXJrZXRpbmctaWNvbi1wcmltYXJ5LCAjMjA4OEZGKSIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz48cGF0aCBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik00MSAzNWE2IDYgMCAxMTAgMTIgNiA2IDAgMDEwLTEyeiIgc3Ryb2tlPSJ2YXIoLS1jb2xvci1tYXJrZXRpbmctaWNvbi1zZWNvbmRhcnksICM3OUI4RkYpIiBzdHJva2Utd2lkdGg9IjIiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPjxwYXRoIGQ9Ik0yNS4wMzcgMjMuNjA3bC0zLjA3IDMuMDY1LTEuNDktMS40ODUiIHN0cm9rZT0idmFyKC0tY29sb3ItbWFya2V0aW5nLWljb24tcHJpbWFyeSwgIzIwODhGRikiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIi8+PHBhdGggY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNNDEgMTlhNiA2IDAgMTEwIDEyIDYgNiAwIDAxMC0xMnoiIHN0cm9rZT0idmFyKC0tY29sb3ItbWFya2V0aW5nLWljb24tcHJpbWFyeSwgIzIwODhGRikiIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIi8+PHBhdGggZD0iTTQzLjAzNiAyMy42MDdsLTMuMDY5IDMuMDY1LTEuNDktMS40ODVNNyA2LjgxMmExIDEgMCAwMTEuNTMzLS44NDZsNS4xMTMgMy4yMmExIDEgMCAwMS0uMDA2IDEuNjk3bC01LjExMyAzLjE3QTEgMSAwIDAxNyAxMy4yMDNWNi44MTN6TTkgMTl2MTVjMCAzLjg2NiAzLjE3NyA3IDcgN2gxIiBzdHJva2U9InZhcigtLWNvbG9yLW1hcmtldGluZy1pY29uLXByaW1hcnksICMyMDg4RkYpIiBzdHJva2Utd2lkdGg9IjIiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIvPjxwYXRoIGQ9Ik0xNi45NDkgMjZhMSAxIDAgMTAwLTJ2MnpNOCAxOS4wMzVBNi45NjUgNi45NjUgMCAwMDE0Ljk2NSAyNnYtMkE0Ljk2NSA0Ljk2NSAwIDAxMTAgMTkuMDM1SDh6TTE0Ljk2NSAyNmgxLjk4NHYtMmgtMS45ODR2MnoiIGZpbGw9InZhcigtLWNvbG9yLW1hcmtldGluZy1pY29uLXByaW1hcnksICMyMDg4RkYpIi8+PHBhdGggZD0iTTI5LjA1NSAyNWg1Ljk0NCIgc3Ryb2tlPSJ2YXIoLS1jb2xvci1tYXJrZXRpbmctaWNvbi1wcmltYXJ5LCAjMjA4OEZGKSIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz48cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0iTTIxIDQwYTEgMSAwIDExLS4wMDEgMi4wMDFBMSAxIDAgMDEyMSA0MHpNMjUgNDBhMSAxIDAgMTEtLjAwMSAyLjAwMUExIDEgMCAwMTI1IDQweiIgZmlsbD0idmFyKC0tY29sb3ItbWFya2V0aW5nLWljb24tc2Vjb25kYXJ5LCAjNzlCOEZGKSIvPjxwYXRoIGQ9Ik0zNC4wMDUgNDEuMDA3bC0xLjAxMy4wMzMiIHN0cm9rZT0idmFyKC0tY29sb3ItbWFya2V0aW5nLWljb24tc2Vjb25kYXJ5LCAjNzlCOEZGKSIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtbGluZWNhcD0icm91bmQiLz48L3N2Zz4=
@@ -210,14 +327,84 @@ Badges
 [kofi-badge]:https://www.ko-fi.com/img/githubbutton_sm.svg
 [black-badge]:https://img.shields.io/badge/code%20style-black-000000.svg?style=for-the-badge&logo=github
 
-
 <!--
 Internal URLs
 -->
 [docs]:https://abhitronix.github.io/deffcode/latest/
-[install]:https://abhitronix.github.io/deffcode/latest/installation/
 [release]:https://github.com/abhiTronix/deffcode/releases/latest
+[recipes]:https://abhitronix.github.io/deffcode/latest/recipes/basic/
 [license]:https://github.com/abhiTronix/deffcode/blob/master/LICENSE
+[help]:https://abhitronix.github.io/deffcode/latest/https://abhitronix.github.io/deffcode/latest/help/get_help
+[installation-notes]:https://abhitronix.github.io/deffcode/latest/installation/#installation-notes
+[ffdecoder-api]:https://abhitronix.github.io/deffcode/latest/reference/ffdecoder/#ffdecoder-api
+[sourcer-api]:https://abhitronix.github.io/deffcode/latest/reference/sourcer/#sourcer-api
+[contribute]:https://abhitronix.github.io/deffcode/latest/contribution/
+
+<!--
+Basic Recipes
+-->
+[basic-recipes]:https://abhitronix.github.io/deffcode/latest/recipes/basic/
+[decoding-video-files]:https://abhitronix.github.io/deffcode/latest/recipes/basic/decode-video-files/#decoding-video-files
+[decoding-live-feed-devices]:https://abhitronix.github.io/deffcode/latest/recipes/basic/decode-live-feed-devices/#decoding-live-feed-devices
+[decoding-network-streams]:https://abhitronix.github.io/deffcode/latest/recipes/basic/decode-network-streams/#decoding-network-streams
+[decoding-image-sequences]:https://abhitronix.github.io/deffcode/latest/recipes/basic/decode-image-sequences/#decoding-image-sequences
+[transcode-live-frames]:https://abhitronix.github.io/deffcode/latest/recipes/basic/transcode-live-frames/
+[transcoding-live-simple-filtergraphs]:https://abhitronix.github.io/deffcode/latest/recipes/basic/transcode-live-frames-simplegraphs/#transcoding-live-simple-filtergraphs
+[saving-key-frames-as-image]:https://abhitronix.github.io/deffcode/latest/recipes/basic/save-keyframe-image/#saving-key-frames-as-image
+[extracting-video-metadata]:https://abhitronix.github.io/deffcode/latest/recipes/basic/extract-video-metadata/#extracting-video-metadata
+
+[capturing-rgb-frames-from-a-video-file]:https://abhitronix.github.io/deffcode/latest/recipes/basic/decode-video-files/#capturing-rgb-frames-from-a-video-file
+[capturing-and-previewing-bgr-frames-from-a-video-file]:https://abhitronix.github.io/deffcode/latest/recipes/basic/decode-video-files/#capturing-and-previewing-bgr-frames-from-a-video-file
+[capturing-and-previewing-bgr-frames-from-a-video-file]:https://abhitronix.github.io/deffcode/latest/recipes/basic/decode-video-files/#capturing-and-previewing-bgr-frames-from-a-video-file
+[capturing-and-previewing-frames-from-a-webcam]:https://abhitronix.github.io/deffcode/latest/recipes/basic/decode-live-feed-devices/#capturing-and-previewing-frames-from-a-webcam
+[capturing-and-previewing-frames-from-your-desktop]:https://abhitronix.github.io/deffcode/latest/recipes/basic/decode-live-feed-devices/#capturing-and-previewing-frames-from-your-desktop
+[capturing-and-previewing-frames-from-a-https-stream]:https://abhitronix.github.io/deffcode/latest/recipes/basic/decode-network-streams/#capturing-and-previewing-frames-from-a-https-stream
+[capturing-and-previewing-frames-from-a-rtsprtp-stream]:https://abhitronix.github.io/deffcode/latest/recipes/basic/decode-network-streams/#capturing-and-previewing-frames-from-a-rtsprtp-stream
+[capturing-and-previewing-frames-from-sequence-of-images]:https://abhitronix.github.io/deffcode/latest/recipes/basic/decode-image-sequences/#capturing-and-previewing-frames-from-sequence-of-images
+[capturing-and-previewing-frames-from-single-looping-image]:https://abhitronix.github.io/deffcode/latest/recipes/basic/decode-image-sequences/#capturing-and-previewing-frames-from-single-looping-image
+[transcoding-video-using-opencv-videowriter-api]:https://abhitronix.github.io/deffcode/latest/recipes/basic/transcode-live-frames/#transcoding-video-using-opencv-videowriter-api
+[transcoding-lossless-video-using-writegear-api]:https://abhitronix.github.io/deffcode/latest/recipes/basic/transcode-live-frames/#transcoding-lossless-video-using-writegear-api
+[transcoding-trimmed-and-reversed-video]:https://abhitronix.github.io/deffcode/latest/recipes/basic/transcode-live-frames-simplegraphs/#transcoding-trimmed-and-reversed-video
+[transcoding-cropped-video]:https://abhitronix.github.io/deffcode/latest/recipes/basic/transcode-live-frames-simplegraphs/#transcoding-cropped-video
+[transcoding-rotated-video-with-rotate-filter]:https://abhitronix.github.io/deffcode/latest/recipes/basic/transcode-live-frames-simplegraphs/#transcoding-rotated-video-with-rotate-filter
+[transcoding-rotated-video-with-transpose-filter]:https://abhitronix.github.io/deffcode/latest/recipes/basic/transcode-live-frames-simplegraphs/#transcoding-rotated-video-with-transpose-filter
+[transcoding-horizontally-flipped-and-scaled-video]:https://abhitronix.github.io/deffcode/latest/recipes/basic/transcode-live-frames-simplegraphs/#transcoding-horizontally-flipped-and-scaled-video
+[extracting-key-frames-as-png-image]:https://abhitronix.github.io/deffcode/latest/recipes/basic/save-keyframe-image/#extracting-key-frames-as-png-image
+[generating-thumbnail-with-a-fancy-filter]:https://abhitronix.github.io/deffcode/latest/recipes/basic/save-keyframe-image/#generating-thumbnail-with-a-fancy-filter
+[extracting-video-metadata-using-sourcer-api]:https://abhitronix.github.io/deffcode/latest/recipes/basic/extract-video-metadata/#extracting-video-metadata-using-sourcer-api
+[extracting-video-metadata-using-ffdecoder-api]:https://abhitronix.github.io/deffcode/latest/recipes/basic/extract-video-metadata/#extracting-video-metadata-using-ffdecoder-api
+
+<!--
+Advanced Recipes
+-->
+[advanced-recipes]:https://abhitronix.github.io/deffcode/latest/recipes/advanced/
+[decoding-live-virtual-sources]:https://abhitronix.github.io/deffcode/latest/recipes/advanced/decode-live-virtual-sources/#decoding-live-virtual-sources
+[hardware-accelerated-video-decoding]:https://abhitronix.github.io/deffcode/latest/recipes/advanced/decode-hw-acceleration/#hardware-accelerated-video-decoding
+[transcoding-live-complex-filtergraphs]:https://abhitronix.github.io/deffcode/latest/recipes/advanced/transcode-live-frames-complexgraphs/#transcoding-live-complex-filtergraphs
+[transcoding-video-art-with-filtergraphs]:https://abhitronix.github.io/deffcode/latest/recipes/advanced/transcode-art-filtergraphs/#transcoding-video-art-with-filtergraphs
+[hardware-accelerated-video-transcoding]:https://abhitronix.github.io/deffcode/latest/recipes/advanced/transcode-hw-acceleration/#hardware-accelerated-video-transcoding
+[updating-video-metadata]:https://abhitronix.github.io/deffcode/latest/recipes/advanced/update-metadata/#updating-video-metadata
+
+
+[generate-and-decode-frames-from-sierpinski-pattern]:https://abhitronix.github.io/deffcode/latest/recipes/advanced/decode-live-virtual-sources/#generate-and-decode-frames-from-sierpinski-pattern
+[generate-and-decode-frames-from-test-source-pattern]:https://abhitronix.github.io/deffcode/latest/recipes/advanced/decode-live-virtual-sources/#generate-and-decode-frames-from-test-source-pattern
+[generate-and-decode-frames-from-gradients-with-custom-text-effect]:https://abhitronix.github.io/deffcode/latest/recipes/advanced/decode-live-virtual-sources/#generate-and-decode-frames-from-gradients-with-custom-text-effect
+[generate-and-decode-frames-from-mandelbrot-test-pattern-with-vectorscope-waveforms]:https://abhitronix.github.io/deffcode/latest/recipes/advanced/decode-live-virtual-sources/#generate-and-decode-frames-from-mandelbrot-test-pattern-with-vectorscope-waveforms
+[generate-and-decode-frames-from-game-of-life-visualization]:https://abhitronix.github.io/deffcode/latest/recipes/advanced/decode-live-virtual-sources/#generate-and-decode-frames-from-game-of-life-visualization
+[gpu-accelerated-hardware-based-video-decoding]:https://abhitronix.github.io/deffcode/latest/recipes/advanced/decode-hw-acceleration/#gpu-accelerated-hardware-based-video-decoding
+[transcoding-video-with-live-custom-watermark-image-overlay]:https://abhitronix.github.io/deffcode/latest/recipes/advanced/transcode-live-frames-complexgraphs/#transcoding-video-with-live-custom-watermark-image-overlay
+[transcoding-video-from-sequence-of-images-with-additional-filtering]:https://abhitronix.github.io/deffcode/latest/recipes/advanced/transcode-live-frames-complexgraphs/#transcoding-video-from-sequence-of-images-with-additional-filtering
+[transcoding-video-art-with-jetcolor-effect]:https://abhitronix.github.io/deffcode/latest/recipes/advanced/transcode-art-filtergraphs/#transcoding-video-art-with-jetcolor-effect
+[transcoding-video-art-with-yuv-bitplane-visualization]:https://abhitronix.github.io/deffcode/latest/recipes/advanced/transcode-art-filtergraphs/#transcoding-video-art-with-yuv-bitplane-visualization
+[transcoding-video-art-with-ghosting-effect]:https://abhitronix.github.io/deffcode/latest/recipes/advanced/transcode-art-filtergraphs/#transcoding-video-art-with-ghosting-effect
+[transcoding-video-art-with-pixelation-effect]:https://abhitronix.github.io/deffcode/latest/recipes/advanced/transcode-art-filtergraphs/#transcoding-video-art-with-pixelation-effect
+[gpu-accelerated-hardware-based-video-transcoding-with-writegear-api]:https://abhitronix.github.io/deffcode/latest/recipes/advanced/transcode-hw-acceleration/#gpu-accelerated-hardware-based-video-transcoding-with-writegear-api
+[added-new-attributes-to-metadata-in-ffdecoder-api]:https://abhitronix.github.io/deffcode/latest/recipes/advanced/update-metadata/#added-new-attributes-to-metadata-in-ffdecoder-api
+[overriding-source-video-metadata-in-ffdecoder-api]:https://abhitronix.github.io/deffcode/latest/recipes/advanced/update-metadata/#overriding-source-video-metadata-in-ffdecoder-api
+
+<!--
+CI Apps URLs
+-->
 [github-flow]:https://github.com/abhiTronix/deffcode/actions/workflows/CIlinux.yml
 [azure-pipeline]:https://dev.azure.com/abhiuna12/public/_build?definitionId=3
 [app]:https://ci.appveyor.com/project/abhiTronix/deffcode
@@ -227,7 +414,7 @@ Internal URLs
 <!--
 External URLs
 -->
-
+[opencv-py]:https://docs.opencv.org/4.x/d6/d00/tutorial_py_root.html
 [ffmpeg]:https://www.ffmpeg.org/
 [pypi]:https://pypi.org/project/deffcode/
 [gitter]:https://gitter.im/deffcode-python/community?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge
diff --git a/deffcode/ffdecoder.py b/deffcode/ffdecoder.py
index 7c0fa2d..132f2aa 100644
--- a/deffcode/ffdecoder.py
+++ b/deffcode/ffdecoder.py
@@ -20,7 +20,6 @@
 
 # import the necessary packages
 import logging
-import json
 import numpy as np
 import subprocess as sp
 from collections import OrderedDict
@@ -41,7 +40,34 @@
 
 
 class FFdecoder:
-    """ """
+    """
+    > FFdecoder API compiles and executes the FFmpeg pipeline inside a subprocess pipe for generating real-time, low-overhead, lightning fast video frames
+    with robust error-handling in python 🎞️⚡
+
+    FFdecoder API implements a **standalone highly-extensible wrapper around [FFmpeg](https://ffmpeg.org/)** multimedia framework that provides complete
+    control over the underline pipeline including **access to almost any FFmpeg specification thinkable** such as framerate, resolution, hardware decoder(s),
+    complex filter(s), and pixel format(s) that are readily supported by all well known Computer Vision libraries.
+
+    FFdecoder API **compiles its FFmpeg pipeline** by processing input Video Source metadata and User-defined options, and **runs it inside a
+    [`subprocess`](https://docs.python.org/3/library/subprocess.html) pipe** concurrently with the main thread, while extracting output dataframes(1D arrays)
+    into a Numpy buffer. These dataframes are consecutively grabbed from the buffer and decoded into ==[24-bit RGB](https://en.wikipedia.org/wiki/List_of_monochrome_and_RGB_color_formats#24-bit_RGB) _(default)_
+    [`ndarray`](https://numpy.org/doc/stable/reference/arrays.ndarray.html#the-n-dimensional-array-ndarray) 3D frames== that are readily available
+    through its [`generateFrame()`](#deffcode.ffdecoder.FFdecoder.generateFrame) method.
+
+    FFdecoder API **employs [Sourcer API](../../reference/sourcer) at its backend** for gathering, processing, and validating metadata of all
+    multimedia streams available in the given source for formulating/compiling its default FFmpeg pipeline. This metadata information is also
+    available as a JSON string with its [`metadata`](#deffcode.ffdecoder.FFdecoder.metadata) property object and can be updated as desired.
+
+    FFdecoder API **supports a wide-ranging media stream** as input source such as USB/Virtual/IP Camera Feed, Multimedia video file,
+    Screen Capture, Image Sequence, Network protocols _(such as HTTP(s), RTP/RSTP, etc.)_, so on and so forth.
+
+    Furthermore, FFdecoder API maintains the **standard [OpenCV-Python](https://docs.opencv.org/4.x/d6/d00/tutorial_py_root.html) _(Python API for OpenCV)_ coding syntax**, thereby making it even easier to
+    integrate this API in any Computer Vision application.
+
+    !!! example "For usage examples, kindly refer our **[Basic Recipes :cake:](../../recipes/basic)** and **[Advanced Recipes :croissant:](../../recipes/advanced)**"
+
+    !!! info "FFdecoder API parameters are explained [here ➶](params/)"
+    """
 
     def __init__(
         self,
@@ -50,17 +76,18 @@ def __init__(
         frame_format=None,
         custom_ffmpeg="",
         verbose=False,
-        **extraparams
+        **ffparams
     ):
         """
-        This constructor method initializes the object state and attributes of the FFdecoder.
+        This constructor method initializes the object state and attributes of the FFdecoder Class.
 
         Parameters:
-            source (str): defines the default input source.
-            frame_format (str): sets pixel format(-pix_fmt) of the decoded frames.
+            source (str): defines the input(`-i`) source filename/URL/device-name/device-path.
+            source_demuxer (str): specifies the demuxer(`-f`) for the input source.
+            frame_format (str): sets pixel format(`-pix_fmt`) of the decoded frames.
             custom_ffmpeg (str): assigns the location of custom path/directory for custom FFmpeg executable.
             verbose (bool): enables/disables verbose.
-            extraparams (dict): provides the flexibility to control supported internal parameters and FFmpeg properties.
+            ffparams (dict): provides the flexibility to control supported internal and FFmpeg parameters.
         """
 
         # enable verbose if specified
@@ -72,7 +99,9 @@ def __init__(
         self.__initializing = True
 
         # define frame pixel-format for decoded frames
-        self.__frame_format = frame_format
+        self.__frame_format = (
+            frame_format.strip() if isinstance(frame_format, str) else None
+        )
 
         # handles user-defined parameters
         self.__extra_params = {}
@@ -104,9 +133,9 @@ def __init__(
         # cleans and reformat user-defined parameters
         self.__extra_params = {
             str(k).strip(): str(v).strip()
-            if not (v is None) and not isinstance(v, (dict, list, int, float))
+            if not (v is None) and not isinstance(v, (dict, list, int, float, tuple))
             else v
-            for k, v in extraparams.items()
+            for k, v in ffparams.items()
         }
 
         # handle custom Sourcer API params
@@ -131,6 +160,8 @@ def __init__(
             else default_stream_indexes
         )
 
+        # define dict to store user-defined parameters
+        self.__user_metadata = {}
         # extract and assign source metadata as dict
         self.__source_metadata = (
             Sourcer(
@@ -143,14 +174,17 @@ def __init__(
             .probe_stream(default_stream_indexes=default_stream_indexes)
             .retrieve_metadata()
         )
+        # add dummy value for `output_frames_pixfmt` source metadata
+        self.__source_metadata["output_frames_pixfmt"] = "unknown"
 
         # handle valid FFmpeg assets location
         self.__ffmpeg = self.__source_metadata["ffmpeg_binary_path"]
 
-        # handle pass-through audio mode works in conjunction with WriteGear [WIP]
+        # handle pass-through audio mode works in conjunction with WriteGear [TODO]
         self.__passthrough_mode = self.__extra_params.pop("-passthrough_audio", False)
         if not (isinstance(self.__passthrough_mode, bool)):
             self.__passthrough_mode = False
+
         # handle mode of operation
         if self.__source_metadata["source_has_image_sequence"]:
             # image-sequence mode
@@ -160,7 +194,7 @@ def __init__(
                 "source_has_video"
             ]  # audio is only for pass-through, not really for audio decoding yet.
             and self.__source_metadata["source_has_audio"]
-            and self.__passthrough_mode  # [WIP]
+            and self.__passthrough_mode  # [TODO]
         ):
             self.__opmode = "av"
         # elif __defop_mode == "ao" and self.__source_metadata.contains_audio: # [TODO]
@@ -171,7 +205,7 @@ def __init__(
         else:
             # raise if unknown mode
             raise ValueError(
-                "Unable to find suitable/usable video stream in the given source!"
+                "Unable to find any usable video stream in the given source!"
             )
         # store as metadata
         self.__source_metadata["ffdecoder_operational_mode"] = self.__supported_opmodes[
@@ -185,52 +219,55 @@ def __init__(
         )
 
         # handle user-defined framerate
-        self.__inputframerate = self.__extra_params.pop("-framerate", 0.0)
-        if isinstance(self.__inputframerate, (float, int)):
-            self.__inputframerate = (
-                float(self.__inputframerate) if self.__inputframerate > 0 else 0.0
-            )
-        elif self.__inputframerate is None:
-            # special case for discarding framerate value
-            pass
+        __framerate = self.__extra_params.pop("-framerate", 0.0)
+        if not (__framerate is None) and isinstance(__framerate, (float, int)):
+            self.__inputframerate = float(__framerate) if __framerate > 0.0 else 0.0
         else:
             # warn if wrong type
             logger.warning(
-                "Discarding `-framerate` value of wrong type `{}`!".format(
-                    type(self.__inputframerate)
+                "Discarding invalid `-framerate` value of wrong type `{}`!".format(
+                    type(__framerate).__name__
                 )
             )
+            # reset to default
+            self.__inputframerate = 0.0
 
         # FFmpeg parameter `-s` is unsupported
         if not (self.__extra_params.pop("-s", None) is None):
             logger.warning(
-                "Discarding user-defined `-s` FFmpeg parameter as it can only be assigned with `-custom_resolution`!"
+                "Discarding user-defined `-s` FFmpeg parameter as it can only be assigned with `-custom_resolution` attribute! Read docs for more details."
             )
         # handle user defined decoded frame resolution(must be a tuple or list)
         self.__custom_resolution = self.__extra_params.pop("-custom_resolution", None)
-        if self.__custom_resolution is None or not (
-            isinstance(self.__custom_resolution, (list, tuple))
-            and len(self.__custom_resolution) == 2
+        if not (self.__custom_resolution is None) and (
+            not isinstance(self.__custom_resolution, (list, tuple))
+            or len(self.__custom_resolution) != 2
         ):
+            # log it
+            logger.warning(
+                "Discarding invalid `-custom_resolution` value: `{}`!".format(
+                    self.__custom_resolution
+                )
+            )
             # reset improper values
             self.__custom_resolution = None
 
         # handle user defined ffmpeg pre-headers(parameters such as `-re`) parameters (must be a list)
         self.__ffmpeg_prefixes = self.__extra_params.pop("-ffprefixes", [])
         if not isinstance(self.__ffmpeg_prefixes, list):
+            # log it
+            logger.warning(
+                "Discarding invalid `-ffprefixes` value of wrong type: `{}`!".format(
+                    type(self.__ffmpeg_prefixes).__name__
+                )
+            )
             # reset improper values
             self.__ffmpeg_prefixes = []
 
-        # handle user defined ffmpeg post-headers(parameters before `-i`) parameters (must be a list)
-        self.__ffmpeg_postfixes = self.__extra_params.pop("-ffpostfixes", [])
-        if not isinstance(self.__ffmpeg_postfixes, list):
-            # reset improper values
-            self.__ffmpeg_postfixes = []
-
     def formulate(self):
 
         """
-        Formulates all necessary FFmpeg parameters command and Launches FFmpeg Pipeline using subprocess module.
+        This method formulates all necessary FFmpeg pipeline arguments and executes it inside the FFmpeg `subprocess` pipe.
         """
         # assign values to class variables on first run
         if self.__initializing:
@@ -296,7 +333,7 @@ def formulate(self):
                 if not (value is None) and value > 0:
                     output_params["-frames:v"] = value
 
-            # dynamically calculate raw-frame pixel format based on source (if not assigned by user).
+            # dynamically calculate default raw-frames pixel format(if not assigned by user).
             self.__ff_pixfmt_metadata = get_supported_pixfmts(self.__ffmpeg)
             supported_pixfmts = [fmts[0] for fmts in self.__ff_pixfmt_metadata]
             default_pixfmt = (
@@ -304,15 +341,30 @@ def formulate(self):
                 if "rgb24" in supported_pixfmts
                 else self.__source_metadata["source_video_pixfmt"]
             )
+            # assigning `-pix_fmt` parameter cannot be assigned directly
             if "-pix_fmt" in self.__extra_params:
                 logger.warning(
-                    "Discarding user-defined `-pix_fmt` value as it can only be assigned with `frame_format` parameter!"
+                    "Discarding user-defined `-pix_fmt` value as it can only be assigned with `frame_format` parameter! Read docs for more details."
                 )
                 self.__extra_params.pop("-pix_fmt", None)
+            # assign output raw-frames pixel format
             if (
-                self.__frame_format is None
-                or not self.__frame_format in supported_pixfmts
+                "output_frames_pixfmt" in self.__source_metadata
+                and self.__source_metadata["output_frames_pixfmt"] in supported_pixfmts
+            ):
+                # check if manually defined via `metadata` property object
+                # assign if valid and supported
+                output_params["-pix_fmt"] = self.__source_metadata[
+                    "output_frames_pixfmt"
+                ].strip()
+            elif (
+                not (self.__frame_format is None)
+                and self.__frame_format in supported_pixfmts
             ):
+                # check if assigned via `frame_format` parameter
+                # assign if valid and supported
+                output_params["-pix_fmt"] = self.__frame_format.strip()
+            else:
                 # reset to default if not supported
                 not (self.__frame_format is None) and logger.critical(
                     "Provided FFmpeg does not support `{}` pixel format(pix_fmt). Switching to default `{}`!".format(
@@ -320,8 +372,6 @@ def formulate(self):
                     )
                 )
                 output_params["-pix_fmt"] = default_pixfmt
-            else:
-                output_params["-pix_fmt"] = self.__frame_format
 
             # dynamically calculate raw-frame dtype based on pix format selected
             frames_pixfmt = output_params["-pix_fmt"]
@@ -348,32 +398,56 @@ def formulate(self):
                     )
                 )
                 output_params["-pix_fmt"] = default_pixfmt
+                # change dtype
                 self.__raw_frame_dtype = np.dtype("u1")
+            # assign to global parameter
             self.__raw_frame_pixfmt = output_params["-pix_fmt"]
+            # also store as metadata
+            self.__source_metadata["output_frames_pixfmt"] = output_params["-pix_fmt"]
 
-            # dynamically calculate raw-frame resolution/dimensions based on source (if not assigned by user).
-            self.__raw_frame_resolution = (
-                self.__custom_resolution
-                if not (self.__custom_resolution is None)
-                else self.__source_metadata["source_video_resolution"]
-            )
+            # handle raw-frame size
+            if not (self.__custom_resolution is None):
+                # assign if assigned by user
+                self.__raw_frame_resolution = self.__custom_resolution
+            elif (
+                self.__source_metadata["source_video_resolution"]
+                and len(self.__source_metadata["source_video_resolution"]) == 2
+            ):
+                # calculate raw-frame resolution/dimensions based on source (if not assigned by user).
+                self.__raw_frame_resolution = self.__source_metadata[
+                    "source_video_resolution"
+                ]
+            else:
+                # otherwise raise error
+                raise RuntimeError(
+                    "Invalid `source_video_resolution` metadata value detected!"
+                )
+            # add to pipeline
             dimensions = "{}x{}".format(
                 self.__raw_frame_resolution[0], self.__raw_frame_resolution[1]
-            )  # apply if defined
+            )
             output_params["-s"] = str(dimensions)
 
-            # dynamically calculate raw-frame frame-rate based on source (if not assigned by user).
-            framerate = (
-                self.__inputframerate
-                if self.__inputframerate > 0.0
-                else self.__source_metadata["source_video_framerate"]
-            )
-            output_params["-framerate"] = str(framerate)
+            # dynamically calculate raw-frame framerate based on source (if not assigned by user).
+            if self.__inputframerate > 0.0:
+                # assign if assigned by user
+                output_params["-framerate"] = str(self.__inputframerate)
+            elif self.__source_metadata["source_video_framerate"] > 0.0:
+                # calculate raw-frame framerate based on source
+                output_params["-framerate"] = str(
+                    self.__source_metadata["source_video_framerate"]
+                )
+            else:
+                # otherwise raise error
+                raise RuntimeError(
+                    "Invalid `source_video_framerate` metadata value detected!"
+                )
 
             # add rest to output parameters
             output_params.update(self.__extra_params)
 
             # dynamically calculate raw-frame numbers based on source (if not assigned by user).
+            # TODO Added support for `-re -stream_loop` and `-loop`
             if "-frames:v" in input_params:
                 self.__raw_frame_num = input_params["-frames:v"]
             elif self.__source_metadata["approx_video_nframes"]:
@@ -382,7 +456,7 @@ def formulate(self):
                 self.__raw_frame_num = None
                 # log that number of frames are unknown
                 self.__verbose_logs and logger.info(
-                    "Live/Network Stream detected! Number of frames for given source is unknown."
+                    "Live/Network Stream detected! Number of frames in given source are not known."
                 )
 
             # compose the Pipeline using formulated FFmpeg parameters
@@ -397,7 +471,7 @@ def formulate(self):
 
     def __fetchNextfromPipeline(self):
         """
-        Internal method to fetch next dataframe(in bytes) from FFmpeg Pipeline.
+        This Internal method to fetch next dataframes(1D arrays) from `subprocess` pipe's standard output(`stdout`) into a Numpy buffer.
         """
         assert not (
             self.__process is None
@@ -429,7 +503,7 @@ def __fetchNextfromPipeline(self):
 
     def __fetchNextFrame(self):
         """
-        Internal method to reconstruct next video-frame(`ndarray`) from fetched dataframe.
+        This Internal method grabs and decodes next 3D `ndarray` video-frame from the buffer.
         """
         # Read next and reconstruct as numpy array
         frame = self.__fetchNextfromPipeline()
@@ -468,8 +542,8 @@ def __fetchNextFrame(self):
 
     def generateFrame(self):
         """
-        A python Generator function which can also works as an Iterator(using `next()`) for extracting
-        video-frames(`ndarray`) at rapid pace.
+        This method returns a [Generator function](https://wiki.python.org/moin/Generators)
+        _(also an Iterator using `next()`)_ of video frames, grabbed continuously from the buffer.
         """
         if self.__raw_frame_num is None or not self.__raw_frame_num:
             while not self.__terminate_stream:
@@ -501,30 +575,65 @@ def __exit__(self, exc_type, exc_val, exc_tb):
     @property
     def metadata(self):
         """
-        A property object that dumps Source metadata dict as JSON for pretty printing. As well as can be used to update source metadata with user-defined dictionary.
+        A property object that dumps metadata information as JSON string.
 
-        **Returns:** A [`json.dumps`](https://docs.python.org/3/library/json.html#json.dumps) output.
+        **Returns:** Metadata as JSON string.
         """
-        return json.dumps(self.__source_metadata, indent=2)
+        # import dependency
+        import json
+
+        # return complete (source+user-defined) metadata as JSON string
+        return json.dumps({**self.__source_metadata, **self.__user_metadata}, indent=2)
 
     @metadata.setter
     def metadata(self, value):
         """
-        A property object that updates source metadata with user-defined dictionary.
+        A property object that updates metadata information with user-defined dictionary.
 
         Parameters:
             value (dict): User-defined dictionary.
         """
-        self.__verbose_logs and logger.info("Updating Metadata...")
+        # check if value dict type
         if value and isinstance(value, dict):
-            self.__source_metadata.update(value)
+            # log it
+            self.__verbose_logs and logger.info("Updating Metadata...")
+            # extract any source metadata keys
+            default_keys = set(value).intersection(self.__source_metadata)
+            # iterate over source metadata keys and sanitize it
+            for key in default_keys or []:
+                if key == "source":
+                    # `source` metadata value cannot be altered
+                    logger.warning(
+                        "`source` metadata value cannot be altered. Discarding!"
+                    )
+                elif isinstance(value[key], type(self.__source_metadata[key])):
+                    # check if correct datatype as original
+                    # update source metadata if valid
+                    self.__source_metadata.update(value)
+                    continue
+                else:
+                    # otherwise discard and log it
+                    logger.warning(
+                        "Manually assigned `{}` metadata value is invalid type. Discarding!"
+                    ).format(key)
+                # delete invalid key
+                del value[key]
+            # There is no concept of a tuple in the JSON format.
+            # Python's `json` module converts Python tuples to JSON lists
+            # because that's the closest thing in JSON to a tuple.
+            any(isinstance(value[x], tuple) for x in value) and logger.warning(
+                "All TUPLE metadata values will be converted to LIST datatype. Read docs for more details."
+            )
+            # update user-defined metadata
+            self.__user_metadata.update(value)
         else:
-            raise ValueError("Invalid value specified.")
+            # otherwise raise error
+            raise ValueError("Invalid datatype metadata assigned. Aborting!")
 
     def __launch_FFdecoderline(self, input_params, output_params):
 
         """
-        An Internal method that launches FFmpeg Pipeline using subprocess module, that pipelines dataframes(in bytes) to `stdout`.
+        This Internal method executes FFmpeg pipeline arguments inside a `subprocess` pipe in a new process.
 
         Parameters:
             input_params (dict): Input FFmpeg parameters
@@ -539,9 +648,9 @@ def __launch_FFdecoderline(self, input_params, output_params):
         # format command
         cmd = (
             [self.__ffmpeg]
+            + (["-hide_banner"] if not self.__verbose_logs else [])
             + self.__ffmpeg_prefixes
             + input_parameters
-            + self.__ffmpeg_postfixes
             + (
                 ["-f", self.__source_metadata["source_demuxer"]]
                 if ("source_demuxer" in self.__source_metadata.keys())
@@ -566,7 +675,7 @@ def __launch_FFdecoderline(self, input_params, output_params):
 
     def terminate(self):
         """
-        Safely terminate all processes.
+        Safely terminates all processes.
         """
         # signal we are closing
         self.__verbose_logs and logger.debug("Terminating FFdecoder Pipeline...")
diff --git a/deffcode/sourcer.py b/deffcode/sourcer.py
index e586721..268be52 100644
--- a/deffcode/sourcer.py
+++ b/deffcode/sourcer.py
@@ -19,7 +19,11 @@
 """
 
 # import required libraries
-import re, logging, os, platform
+import re
+import os
+import json
+import logging
+import platform
 import numpy as np
 
 # import utils packages
@@ -40,7 +44,28 @@
 
 
 class Sourcer:
-    """ """
+    """
+    > Sourcer API acts as **Source Probing Utility** that unlike other FFmpeg Wrappers which mostly uses [`ffprobe`](https://ffmpeg.org/ffprobe.html) module,
+    attempts to open the given Input Source directly with [**FFmpeg**](https://ffmpeg.org/) inside a [`subprocess`](https://docs.python.org/3/library/subprocess.html) pipe,
+    and parses/probes the standard output(stdout) employing various pattern matching methods in order to recognize all the properties(metadata) of each
+    media stream contained in it.
+
+    Sourcer API primarily acts as a **backend for [FFdecoder API](../../reference/ffdecoder)** for gathering, processing, and validating
+    all multimedia streams metadata available in the given Input Source. Sourcer shares this information with FFdecoder API which helps in
+    formulating its default FFmpeg pipeline parameters for real-time video-frames generation.
+
+    Sourcer API is design as a standalone **Metadata Extraction API** for easily parsing information from multimedia streams available in the
+    given Input Source and returns it in either Human-readable _(JSON string)_ or Machine-readable _(Dictionary object)_ type with its
+    [`retrieve_metadata()`](#deffcode.sourcer.Sourcer.retrieve_metadata) method.
+
+    !!! info "All metadata attributes available with Sourcer API(On :fontawesome-brands-windows: Windows) are discussed [here ➶](../../recipes/basic/#display-source-video-metadata)."
+
+    Furthermore, Sourcer's [`sourcer_params`](params/#sourcer_params) dictionary parameter can be used to define almost any FFmpeg parameter as well as alter internal API settings.
+
+    !!! example "For usage examples, kindly refer our **[Basic Recipes :cake:](../../recipes/basic)** and **[Advanced Recipes :croissant:](../../recipes/advanced)**"
+
+    !!! info "Sourcer API parameters are explained [here ➶](params/)"
+    """
 
     def __init__(
         self,
@@ -51,13 +76,14 @@ def __init__(
         **sourcer_params
     ):
         """
-        This constructor method initializes the object state and attributes of the Sourcer.
+        This constructor method initializes the object state and attributes of the Sourcer Class.
 
         Parameters:
-            source (str): defines the default input source.
-            verbose (bool): enables/disables verbose.
+            source (str): defines the input(`-i`) source filename/URL/device-name/device-path.
+            source_demuxer (str): specifies the demuxer(`-f`) for the input source.
             custom_ffmpeg (str): assigns the location of custom path/directory for custom FFmpeg executable.
-            sourcer_params (dict): provides the flexibility to control supported internal Sourcer parameters.
+            verbose (bool): enables/disables verbose.
+            sourcer_params (dict): provides the flexibility to control supported internal and FFmpeg parameters.
         """
         # checks if machine in-use is running windows os or not
         self.__os_windows = True if os.name == "nt" else False
@@ -66,7 +92,11 @@ def __init__(
         self.__verbose_logs = (  # enable verbose if specified
             verbose if (verbose and isinstance(verbose, bool)) else False
         )
-        self.__ffsp_output = None  # handles metadata received
+
+        # handle metadata received
+        self.__ffsp_output = None
+
+        # sanitize sourcer_params
         self.__sourcer_params = {
             str(k).strip(): str(v).strip()
             if not isinstance(v, (dict, list, int, float))
@@ -82,6 +112,18 @@ def __init__(
             # reset improper values
             self.__forcevalidatesource = False
 
+        # handle user defined ffmpeg pre-headers(parameters such as `-re`) parameters (must be a list)
+        self.__ffmpeg_prefixes = self.__sourcer_params.pop("-ffprefixes", [])
+        if not isinstance(self.__ffmpeg_prefixes, list):
+            # log it
+            logger.warning(
+                "Discarding invalid `-ffprefixes` value of wrong type `{}`!".format(
+                    type(self.__ffmpeg_prefixes).__name__
+                )
+            )
+            # reset improper values
+            self.__ffmpeg_prefixes = []
+
         # handle where to save the downloaded FFmpeg Static assets on Windows(if specified)
         __ffmpeg_download_path = self.__sourcer_params.pop("-ffmpeg_download_path", "")
         if not isinstance(__ffmpeg_download_path, str):
@@ -135,10 +177,10 @@ def __init__(
 
     def probe_stream(self, default_stream_indexes=(0, 0)):
         """
-        Parses Source's FFmpeg Output and populates metadata in private class variables
+        This method Parses/Probes FFmpeg `subprocess` pipe's Standard Output for given input source and Populates the information in private class variables.
 
         Parameters:
-            default_stream_indexes (list, tuple): selects specific video and audio stream index in case of multiple ones. Value can be of format: (int,int). For example (0,1) is ("0th video stream", "1st audio stream").
+            default_stream_indexes (list, tuple): selects specific video and audio stream index in case of multiple ones. Value can be of format: `(int,int)`. For example `(0,1)` is ("0th video stream", "1st audio stream").
 
         **Returns:** Reference to the instance object.
         """
@@ -186,18 +228,21 @@ def probe_stream(self, default_stream_indexes=(0, 0)):
             # parse video duration
             self.__default_source_duration = self.__extract_duration()
             # calculate all flags
-            if (self.__default_video_bitrate or self.__default_video_framerate) and (
-                self.__default_audio_bitrate or self.__default_audio_samplerate
-            ):
+            if (
+                self.__default_video_bitrate
+                or (self.__default_video_framerate and self.__default_video_resolution)
+            ) and (self.__default_audio_bitrate or self.__default_audio_samplerate):
                 self.__contains_video = True
                 self.__contains_audio = True
-            elif self.__default_video_bitrate or self.__default_video_framerate:
+            elif self.__default_video_bitrate or (
+                self.__default_video_framerate and self.__default_video_resolution
+            ):
                 self.__contains_video = True
             elif self.__default_audio_bitrate or self.__default_audio_samplerate:
                 self.__contains_audio = True
             else:
-                raise IOError(
-                    "Invalid source provided. No usable Audio/Video stream detected. Aborting!!!"
+                raise ValueError(
+                    "Invalid source with no decodable audio or video stream provided. Aborting!"
                 )
         # calculate approximate number of video frame
         if self.__default_video_framerate and self.__default_source_duration:
@@ -211,22 +256,28 @@ def probe_stream(self, default_stream_indexes=(0, 0)):
         # return reference to the instance object.
         return self
 
-    def retrieve_metadata(self):
+    def retrieve_metadata(self, pretty_json=False):
         """
-        Returns Source metadata formatted as python dictionary.
+        This method returns Parsed/Probed Metadata of the given source.
+
+        Parameters:
+            pretty_json (bool): whether to return metadata as JSON string(if `True`) or Dictionary(if `False`) type?
 
-        **Returns:** A dictionary value containing metadata.
+        **Returns:** metadata formatted as JSON string or python dictionary.
         """
         # check if metadata has been probed or not
         assert (
             self.__metadata_probed
         ), "Source Metadata not been probed yet! Check if you called `probe_stream()` method."
-
+        # log it
         self.__verbose_logs and logger.debug("Retrieving Metadata...")
+        # create metadata dictionary from information populated in private class variables
         metadata = {
             "ffmpeg_binary_path": self.__ffmpeg,
             "source": self.__source,
         }
+        # Only either `source_demuxer` or `source_extension` attribute can be
+        # present in metadata.
         metadata.update(
             {"source_extension": self.__source_extension}
             if self.__source_demuxer is None
@@ -252,14 +303,23 @@ def retrieve_metadata(self):
                 "source_has_image_sequence": self.__contains_images,
             }
         )
-        return metadata
+        # return metadata as either JSON string or Python dictionary
+        return json.dumps(metadata, indent=2) if pretty_json else metadata
 
     def __validate_source(self, source, source_demuxer=None, forced_validate=False):
         """
-        Internal method for validating source and extract its FFmpeg metadata.
+        This Internal method validates source and extracts its metadata.
+
+        Parameters:
+            source_demuxer(str): specifies the demuxer(`-f`) for the input source.
+            forced_validate (bool): whether to skip validation tests or not?
+
+        **Returns:** `True` if passed tests else `False`.
         """
         # assert if valid source
-        assert source and isinstance(source, str), "Input source is empty!"
+        assert source and isinstance(
+            source, str
+        ), "Input source is empty or invalid type!"
         # assert if valid source demuxer
         assert source_demuxer is None or source_demuxer in get_supported_demuxers(
             self.__ffmpeg
@@ -287,7 +347,9 @@ def __validate_source(self, source, source_demuxer=None, forced_validate=False):
             raise ValueError("Input source is invalid. Aborting!")
         # extract metadata
         metadata = check_sp_output(
-            [self.__ffmpeg, "-hide_banner"]
+            [self.__ffmpeg]
+            + (["-hide_banner"] if not self.__verbose_logs else [])
+            + self.__ffmpeg_prefixes
             + (["-f", source_demuxer] if source_demuxer else [])
             + ["-i", source],
             force_retrieve_stderr=True,
@@ -297,12 +359,12 @@ def __validate_source(self, source, source_demuxer=None, forced_validate=False):
 
     def __extract_video_bitrate(self, default_stream=0):
         """
-        Parses default video-stream bitrate from metadata.
+        This Internal method parses default video-stream bitrate from metadata.
 
         Parameters:
             default_stream (int): selects specific video-stream in case of multiple ones.
 
-        **Returns:** A string value.
+        **Returns:** Default Video bitrate as string value.
         """
         identifiers = ["Video:", "Stream #"]
         video_bitrate_text = [
@@ -330,12 +392,12 @@ def __extract_video_bitrate(self, default_stream=0):
 
     def __extract_video_decoder(self, default_stream=0):
         """
-        Parses default video-stream decoder from metadata.
+        This Internal method parses default video-stream decoder from metadata.
 
         Parameters:
             default_stream (int): selects specific video-stream in case of multiple ones.
 
-        **Returns:** A string value.
+        **Returns:** Default Video decoder as string value.
         """
         assert isinstance(default_stream, int), "Invalid input!"
         identifiers = ["Video:", "Stream #"]
@@ -359,12 +421,12 @@ def __extract_video_decoder(self, default_stream=0):
 
     def __extract_video_pixfmt(self, default_stream=0):
         """
-        Parses default video-stream pixel format from metadata.
+        This Internal method parses default video-stream pixel-format from metadata.
 
         Parameters:
             default_stream (int): selects specific video-stream in case of multiple ones.
 
-        **Returns:** A string value.
+        **Returns:** Default Video pixel-format as string value.
         """
         identifiers = ["Video:", "Stream #"]
         meta_text = [
@@ -387,12 +449,12 @@ def __extract_video_pixfmt(self, default_stream=0):
 
     def __extract_audio_bitrate_nd_samplerate(self, default_stream=0):
         """
-        Parses default audio-stream bitrate and samplerate from metadata.
+        This Internal method parses default audio-stream bitrate and sample-rate from metadata.
 
         Parameters:
             default_stream (int): selects specific audio-stream in case of multiple ones.
 
-        **Returns:** A string value.
+        **Returns:** Default Audio-stream bitrate and sample-rate as string value.
         """
         identifiers = ["Audio:", "Stream #"]
         meta_text = [
@@ -414,7 +476,7 @@ def __extract_audio_bitrate_nd_samplerate(self, default_stream=0):
             filtered_audio_samplerate = re.findall(
                 r",\s[0-9]+\sHz", selected_stream.strip()
             )
-            # get audio bitrate and samplerate metadata
+            # get audio bitrate metadata
             if filtered_audio_bitrate:
                 filtered = filtered_audio_bitrate[0].split(" ")[1:3]
                 result["bitrate"] = "{}{}".format(
@@ -423,17 +485,22 @@ def __extract_audio_bitrate_nd_samplerate(self, default_stream=0):
                 )
             else:
                 result["bitrate"] = ""
-            if filtered_audio_samplerate:
-                result["samplerate"] = filtered_audio_samplerate[0].split(", ")[1]
-            else:
-                result["samplerate"] = ""
+            # get audio samplerate metadata
+            result["samplerate"] = (
+                filtered_audio_samplerate[0].split(", ")[1]
+                if filtered_audio_samplerate
+                else ""
+            )
         return result if result and (len(result) == 2) else {}
 
     def __extract_resolution_framerate(self, default_stream=0):
         """
-        Parses default video-stream resolution and framerate from metadata.
+        This Internal method parses default video-stream resolution and framerate from metadata.
+
+        Parameters:
+            default_stream (int): selects specific audio-stream in case of multiple ones.
 
-        **Returns:** A dictionary value.
+        **Returns:** Default Video resolution and framerate as dictionary value.
         """
         identifiers = ["Video:", "Stream #"]
         meta_text = [
@@ -448,6 +515,7 @@ def __extract_resolution_framerate(self, default_stream=0):
                 if default_stream > 0 and default_stream < len(meta_text)
                 else 0
             ]
+
             # filter data
             filtered_resolution = re.findall(
                 r"([1-9]\d+)x([1-9]\d+)", selected_stream.strip()
@@ -455,20 +523,34 @@ def __extract_resolution_framerate(self, default_stream=0):
             filtered_framerate = re.findall(
                 r"\d+(?:\.\d+)?\sfps", selected_stream.strip()
             )
-            # get framerate and resolution metadata
+            filtered_tbr = re.findall(r"\d+(?:\.\d+)?\stbr", selected_stream.strip())
+
+            # extract framerate metadata
             if filtered_framerate:
+                # calculate actual framerate
                 result["framerate"] = float(
                     re.findall(r"[\d\.\d]+", filtered_framerate[0])[0]
                 )
+            elif filtered_tbr:
+                # guess from TBR(if fps unavailable)
+                result["framerate"] = float(
+                    re.findall(r"[\d\.\d]+", filtered_tbr[0])[0]
+                )
+
+            # extract resolution metadata
             if filtered_resolution:
                 result["resolution"] = [int(x) for x in filtered_resolution[0]]
+
         return result if result and (len(result) == 2) else {}
 
     def __extract_duration(self, inseconds=True):
         """
-        Parses stream duration from metadata.
+        This Internal method parses stream duration from metadata.
+
+        Parameters:
+            inseconds (bool): whether to parse time in second(s) or `HH::mm::ss`?
 
-        **Returns:** A string value.
+        **Returns:** Default Stream duration as string value.
         """
         identifiers = ["Duration:"]
         stripped_data = [
diff --git a/deffcode/version.py b/deffcode/version.py
index 77648b6..b5fdc75 100644
--- a/deffcode/version.py
+++ b/deffcode/version.py
@@ -1,1 +1,1 @@
-__version__ = "0.2.1"
\ No newline at end of file
+__version__ = "0.2.2"
diff --git a/docs/changelog.md b/docs/changelog.md
index 54dd672..6d21ff0 100644
--- a/docs/changelog.md
+++ b/docs/changelog.md
@@ -20,10 +20,187 @@ limitations under the License.
 
 # Release Notes
 
+## v0.2.2 (2022-09-08) :material-new-box:
 
-## v0.2.1 (2022-07-14) :material-new-box:
+??? new "New Features"
+    - [x] **Sourcer API:**
+        * Added support for `-ffprefixes` attribute through Sourcer API's `sourcer_param` dictionary parameter _(similar to FFdecoder API)_.
+    - [x] **FFdecoder API:** 
+        * Added new `output_frames_pixfmt` metadata property to preview and handle output frames pixel-format.
+    - [x] **Docs:**
+        * Added separate "Basic" and "Advanced" Recipes markdowns files with self-explanatory text, related usage code, asset _(such as images, diagrams, GIFs, etc.)_, and UI upgrades for bringing standard quality to visual design. 
+        * Added separate `index.md` for Basic and Advanced Recipes with introductory text and curated hyperlinks for quick references to various recipes _(separated with sub-categories "Decoding", "Transcoding", and "Extracting Video Metadata")_.
+        * Added related admonitions to specify python dependencies as well as other requirements and relevant information required for each of these recipes.
+        * Added new Basic Decoding Recipes:
+            * Added Decoding Video files with various pixel formats recipes.
+            * Added Decoding Live Feed Devices recipes with `source_demuxer` FFdecoder API parameter.
+            * Added Decoding Image sequences recipes supporting Sequential, Glob pattern , Single (looping) image.
+            * Added Decoding Network Streams recipes.
+        * Added new Basic Transcoding Recipes:
+            * Added Transcoding Live frames recipes with OpenCV and WriteGear.
+            * Added Transcoding Live Simple Filtergraphs recipes with OpenCV.
+            * Added Saving Key-frames as Image recipes with different image processing libraries.
+        * Added new Basic Extracting Video Metadata Recipes:
+            * Added Extracting Video Metadata recipes with FFdecoder and Sourcer APIs.
+        * Added new Advanced Decoding Recipes:
+            * Added Hardware-Accelerated Video Decoding recipe using NVIDIA's H.264 CUVID Video-decoder(`h264_cuvid`).
+            * Added Decoding Live Virtual Sources recipes with many test patterns using `lavfi` input virtual device.
+        * Added new Advanced Decoding Recipes:
+            * Added lossless Hardware-Accelerated Video Transcoding recipe with WriteGear API.
+            * Added Transcoding Live Complex Filtergraphs recipes with WriteGear API.
+            * Added Transcoding Video Art with Filtergraphs recipes with WriteGear API for creating real-time artistic generative video art using simple and complex filtergraphs.
+        * Added new Advanced Updating Video Metadata Recipes:
+            * Added Updating Video Metadata recipes with user-defined as well as source metadata in FFdecoder API.
+        * Added new dark and light theme logo support.
+        * Added new recipes GIF assets to `gifs` folder.
+        * Added new dark logo `deffcode-dark.png` asset to `images` folder.
+        * Added new `ffdecoder.png` and `sourcer.png` Image assets to `images` folder.
+        * Added new `navigation.tabs` feature.
+        * Added Material Announcement-Bar notifying recent changes.
+
+??? success "Updates/Improvements"  
+    - [x] Sourcer API:
+        * Implemented new validation checks to ensure given `source` has usable video stream available by checking availability of either `video bitrate` or both `frame-size` and `framerate`_ properties in the source metadata.
+        * Improved `extract_resolution_framerate` method for making framerate extraction more robust by falling back to extracting `TBR` value when no framerate value available in the source metadata.
+    - [x] FFdecoder API:
+        * Updated `metadata` property object to validate and override source metadata properties directly by overloading same property object before formulating Frames Decoder Pipeline:
+            * Implemented validation checks to verify each validate manually assigned source metadata property against specific datatype before overriding.
+            * Updated logging to notify invalid datatype values when assigned through `metadata` property object.
+            * Added support for overriding `source_video_resolution` source metadata property to control frame-size directly through metadata.
+            * Added support for overriding `output_frames_pixfmt` metadata attribute to be used as default pixel-format, when `frame_format` parameter value is None-type.
+            * Improved handling of source metadata keys in metadata property object.
+        * Updated `metadata` property object to handle and assign User-defined metadata directly by overloading the same property object:
+            * Added new internal `user_metadata` class variable to handle all User-defined metadata information separately.            
+            * FFdecoder API's `metadata` property object now returns User-defined metadata information merged with Source Video metadata.
+            * Added `tuple` value warning log to notify users `json` module converts Python `tuples` to JSON `lists`.
+        * Improved logic to test validity of `-custom_resolution` attribute value through `ffparams` dictionary parameter.
+        * Improved handling of FFmpeg pipeline framerate with both user-defined and metadata defined values.
+        * Added `tuple` to exception in datatype check for `ffparams` dictionary parameter.
+        * Added datatype validation check for `frame_format` parameter.
+        * Improved handling of `-framerate` parameter. 
+    - [x] Maintenance:
+        * Reformatted all Core class and methods text descriptions:
+            * Rewritten introductory each API class description.
+            * Moved reference block from `index.md` to class description.
+            * Fixed missing class and methods parameter description.
+            * Fixed typos and context in texts.
+            * Reformatted code comments.
+        * Simplified `for` loop with `if` condition checking in metadata property object.
+        * Updated logging comments.
+    - [x] Setup:
+          * Updated project description in metadata.
+          * Bumped version to `0.2.2`.
+    - [x] Docs:
+        * Updated Introduction doc:
+            * Added new text sections such as "Getting Started", "Installation Notes", "Recipes a.k.a Examples" and "API in a nutshell".
+            * Rewritten Introduction(`index.md`) with recent Information, redefined context, UI changes, updated recipe codes, curated hyperlinks to various recipes(separated with categories), and relatable GIFs.
+            * Updated spacing in `index.md` using `spacer` class within `<div>` tag and `&nbsp;`.
+            * Reformatted and centered DeFFcode Introductory description.
+            * Reformatted FFmpeg Installation doc and Issue & PR guidelines.
+            * Updated static FFmpeg binaries download URLs in FFmpeg Installation doc.
+            * Refashioned text contexts, icons, and recipes codes.
+            * Updated Key Features section with reflecting new features.
+        * Updated README.md:
+            * Updated README.md w.r.t recent changes in Introduction(`index.md`) doc.
+            * Simplified and Reformatted text sections similar to Introduction doc. 
+            * Imported new "Contributions" and "Donations" sections from VidGear docs.
+            * Added collapsible text and output section using `<summary>` and `<detail>` tags.
+            * Added experimental note GitHub blockquote to simulate admonition in README.md.
+            * Removed tag-line from README.md and related image asset.
+            * Simplified and Grouped README URL hyperlinks.
+            * Removed Roadmap section.
+        * Updated Recipes docs:
+            * Revamped DeFFcode Introduction `index.md` with new Information, Context and UI changes, Updated example codes and hyperlinks.
+            * Updated Announcement Bar to fix `announcement_link` variable and text.
+            * Updated footer note to notify users regarding `tuple` value warning in FFdecoder API.
+            * Rewritten recipes w.r.t breaking changes in APIs.
+        * Updated Reference docs:
+            * Completely revamped API's parameter reference docs.
+            * Added new Functional Block Diagrams to FFdecoder and Sourcer API References.
+            * Rewritten and Reformatted FFdecoder and Sourcer API's parameter reference docs with new information w.r.t recent changes.
+            * Implemented new admonitions explaining new changes, related warnings/errors, usage examples etc.
+            * Removed redundant `advanced.md` and `basic.md` docs.
+            * Added new abstracts to FFhelper and Utils docs.
+        * Updated docs site navigation and titles:
+            * Reformatted `index.md` and `installation/index.md`.
+            * Renamed `help/index.md` to `help/help.md`.
+            * Moved basic and advanced recipes from `example` to `recipes` folder.
+            * Imported "Donations" sections from VidGear docs to `help.md`.
+            * Added updated page-title and navigation hyperlinks in `mkdocs.yml` to new markdown files incorporated recently.
+            * Updated internal navigation hyperlinks in docs and removed old redundant file links.
+        * Updated docs UI:
+            * Added custom `spacer` class in CSS for custom vertical spacing.
+            * Imported new "New", "Advance", "Alert", "Danger" and "Bug" admonitions custom CSS UI patches from vidgear.
+            * Updated all admonitions icons with new custom icon SVG+XML URLs.
+            * Reformatted `custom.css` and added missing comments.
+            * Updated docs fonts:
+                * Updated text font to `Heebo`.
+                * Updated code font to `JetBrains Mono`.
+            * Updated primary and accent colors:
+                * Updated primary light color to `light green`.
+                * Updated primary dark color to `amber`.
+                * Updated accent light color to `green`.
+                * Updated accent dark color to `lime`.
+            * Replaced admonitions with appropriate ones.
+            * Changed Color palette toggle icons.
+            * Updated icons in title headings.
+        * Updated admonitions messages.
+        * Updated `changelog.md`.
+    - [x] CI:
+        * Pinned `jinja2` version to `<3.1.0`, since `jinja2>=3.1.0` breaks mkdocs (mkdocs/mkdocs#2799).
+        * Updated unittests w.r.t recent changes in APIs: 
+            * Updated `test_frame_format` unittest to include manually assign output pixel-format via `metadata` property object.
+            * Updated `test_metadata` unittest to include new `checks` parameter to decide whether to perform Assertion test on assigned `metadata` properties in FFdecoder API.
+            * Added new parametrize attributes in `test_metadata` and `test_seek_n_save` unittests to cover every use-cases.
+            * Replaced `IOError` with `ValueError` in Sourcer API unittests.
+        * Updated `test_metadata` unittest to verify `tuple` value warning.
+        * Updated unittests to increase code coverage significantly.
+        
+
+??? danger "Breaking Updates/Changes"
+    * **Sourcer API:**
+        - [x] :skull_crossbones: Sourcer API's  `retrieve_metadata()` method now returns parsed metadata either as JSON string or dictionary type.
+            * Added new `pretty_json` boolean parameter to `retrieve_metadata()`, that is when `True`, returns metadata formatted as JSON string instead of default python dictionary.
+        - [x] :skull_crossbones: Changed `IOError` to `ValueError` in Sourcer API, raised when source with no decodable audio or video stream is provided.
+    * **FFdecoder API:**
+        - [x] :skull_crossbones: Rename `extraparams` dictionary parameter to `ffparams` in FFdecoder API. 
+        - [x] :skull_crossbones: The `source` metadata value cannot be altered through `metadata` property object in FFdecoder API. 
+        - [x] :skull_crossbones: Removed `-ffpostfixes` attribute support from `ffparams` dictionary parameter in FFdecoder API, since totally redundant in favor of similar `-ffprefixes` and `-clones` attributes.
+
+??? bug "Bug-fixes"
+    - [x] FFdecoder API:
+        * Fixed `metadata` property object unable to process user-defined keys when any source metadata keys are defined.
+        * Fixed `TypeError` bug with string type `-framerate` parameter values.
+    - [x] Sourcer API:
+        * Fixed Sourcer API throws `IOError` for videos containing streams without both source bitrate and framerate defined _(such as from `lavfi` input virtual device)_.
+        * Fixed `AttributeError` bug due to typo in variable name.
+    - [x] CI:
+        * Fixed support for newer mkdocstring version in DeFFcode Docs Deployer workflow.
+            * Added new `mkdocstrings-python-legacy` dependency.
+            * Replaced `rendering` variable with `options`.
+            * Removed pinned `mkdocstrings==0.17.0` version.
+            * Removed redundant variables.
+        * Updated `test_metadata` unittest to fix `AssertionError` Bug.
+    - [x] Docs:
+        * Fixed some admonitions icons not showing bug using `!important` rule in CSS.
+        * Fixed `404.html` static page not showing up.
+        * Fixed invalid internal navigation hyperlinks and asset paths.
+        * Removed `quote/cite/summary` admonition custom UI patches.
+        * Removed redundant information texts.
+        * Fixed typos in code comments.
+        * Fixed typos in example code.
+        
+
+??? question "Pull Requests"
+    * PR #23
+
+&nbsp; 
+
+&nbsp; 
+
+## v0.2.1 (2022-07-14)
 
-??? tip "New Features"
+??? new "New Features"
     - [x] **Sourcer API:**
         * Implemented support for extracting metadata from live input devices/sources.
         * Added new `source_demuxer` and `forced_validate` parameters to `validate_source` internal method.
@@ -68,7 +245,6 @@ limitations under the License.
           * Bumped version to 0.2.1.
     - [x] Docs:
           * Updated Changelog.md
-          * Updated Roadmap in README.md
 
 ??? danger "Breaking Updates/Changes"
     - [x] :skull_crossbones: **Implement support for live input devices/sources.**
@@ -105,7 +281,7 @@ limitations under the License.
 
 ## v0.2.0 (2022-03-21)
 
-??? tip "New Features"
+??? new "New Features"
     - [x] Sourcer API:
         - **Added a new `source_audio_samplerate` metadata parameter:**
             - Re-implemented  `__extract_audio_bitrate` internal function from scratch as `__extract_audio_bitrate_nd_samplerate`.
@@ -390,7 +566,7 @@ limitations under the License.
 
 ## v0.1.0 (2022-03-07)
 
-??? tip "New Features"
+??? new "New Features"
     - [x] **:tada: Open-Sourced DeFFcode under the Apache 2.0 License.**
     - [x] **Added new Classes(APIs):**
         * FFdecoder: Performant Real-time **Video frames Generator** for generating blazingly fast video frames(RGB ndarray by default).
diff --git a/docs/contribution/PR.md b/docs/contribution/PR.md
index 9cafa3c..cc51181 100644
--- a/docs/contribution/PR.md
+++ b/docs/contribution/PR.md
@@ -25,13 +25,9 @@ The following guidelines tells you how to submit a valid PR for DeFFcode:
 
 !!! question "Working on your first Pull Request for DeFFcode?" 
 
-    * If you don't know how to contribute to an Open Source Project on GitHub, then You can learn about it from [here ➶](https://opensource.guide/how-to-contribute/)
-
+    * You can learn about "**How to contribute to an Open Source Project on GitHub**" from [this doc ➶](https://opensource.guide/how-to-contribute/)
     * If you're stuck at something, please join our [Gitter community channel](https://gitter.im/DeFFcode/community). We will help you get started!
 
-    * Kindly follow the [EXEMPLARY :medal:](https://github.com/abhiTronix/deffcode/pulls?q=is%3Apr+label%3A%22EXEMPLARY+%3Amedal_military%3A%22+) tag for some finest PR examples.
-
-
 &nbsp; 
 
 ## Clone branch for PR
@@ -73,12 +69,12 @@ There are some important checks you need to perform while submitting your Pull R
   * Explain what the PR adds, fixes, or improves.
   * In case of bug fixes, add a new unit test case that would fail against your bug fix.
   * Provide output or screenshots, if you can.
-  * Make sure your pull request passed all the CI checks _(triggers automatically on pushing commits against dev branch)_. If it's somehow failing, then ask the maintainer for a review.
-  * Click "ready for review" when finished.
+  * Make sure your pull request passed all the CI checks _(triggers automatically on pushing commits against `master` branch)_. If it's somehow failing, then ask the maintainer for a review.
+  * Click "**ready for review**" when finished.
 
 - [x] **Test, Format & lint code locally:**
 
-  * Make sure to test, format, and lint the modified code locally before every commit. The details are discussed [below ➶](#dev-formatting-linting)
+  * Make sure to test, format, and lint the modified code locally before every commit. The details are discussed [below ➶](#formatting-linting)
 
 - [x] **Make sensible commit messages:**
 
@@ -90,15 +86,15 @@ There are some important checks you need to perform while submitting your Pull R
     !!! warning "Any duplicate pull request will be Rejected!"
 
   * Search GitHub if there's a similar open or closed PR that relates to your submission.
-  * Check if your purpose code matches the overall direction, simplicity, and structure of the DeFFcode and improves it.
-  * Retain copyright for your contributions, but also agree to license them for usage by the project and author(s) under the [Apache 2.0 license ➶](https://github.com/abhiTronix/deffcode/blob/master/LICENSE).
+  * Check if your purpose code matches the overall direction of the DeFFcode APIs and improves it.
+  * Retain copyright for your contributions, but also agree to license them for usage by the project and author(s) under the [**Apache 2.0 license ➶**](https://github.com/abhiTronix/deffcode/blob/master/LICENSE).
 
 - [x] **Link your Issues:**
 
-    !!! tip "For more information on Linking a pull request to an issue, See [this wiki doc➶](https://docs.github.com/en/github/managing-your-work-on-github/linking-a-pull-request-to-an-issue)"
+    !!! tip "For more information on Linking a pull request to an issue, See [this doc➶](https://docs.github.com/en/github/managing-your-work-on-github/linking-a-pull-request-to-an-issue)"
 
   * Finally, when you're confident enough, make your pull request public. 
-  * You can link an issue to a pull request manually or using a supported keyword in the pull request description. It helps collaborators see that someone is working on the issue. 
+  * You can link an issue to a pull request manually or using a supported keyword in the pull request description. It helps collaborators see that someone is working on the issue. For more information, see [this doc➶](https://docs.github.com/en/issues/tracking-your-work-with-issues/linking-a-pull-request-to-an-issue)
 
 &nbsp; 
 
@@ -118,30 +114,35 @@ Testing DeFFcode requires additional test dependencies and dataset, which can be
 
     ```sh
     # Install opencv(only if not installed previously)
-    pip install opencv-python 
+    $ pip install opencv-python
+
     # install rest of dependencies
-    pip install --upgrade flake8 black pytest vidgear[core]
+    $ pip install --upgrade flake8 black pytest vidgear[core]
     ```
 
 - [x] **Download Tests Dataset:** 
 
     To perform tests, you also need to download additional dataset *(to your temp dir)* by running [`prepare_dataset.sh`](https://github.com/abhiTronix/deffcode/blob/master/scripts/bash/prepare_dataset.sh)  bash script as follows:
 
-    ```sh
-    # On linux or macOS
-    chmod +x scripts/bash/prepare_dataset.sh
-    ./scripts/bash/prepare_dataset.sh
+    === "On Linux/MacOS"
 
-    # On Windows 
-    sh scripts/bash/prepare_dataset.sh
-    ```
+        ```sh
+        $ chmod +x scripts/bash/prepare_dataset.sh
+        $ ./scripts/bash/prepare_dataset.sh
+        ```
+
+    === "On Windows"
+
+        ```sh
+        $ sh scripts/bash/prepare_dataset.sh
+        ```
 
 ### Running Tests
 
 All tests can be run with [`pytest`](https://docs.pytest.org/en/stable/)(*in DeFFcode's root folder*) as follows:
 
    ```sh
-    pytest -sv  #-sv for verbose output.
+   $ pytest -sv  #-sv for verbose output.
    ```
 
 ### Formatting & Linting
@@ -151,13 +152,13 @@ For formatting and linting, following libraries are used:
 - [x] **Flake8:** You must run [`flake8`](https://flake8.pycqa.org/en/latest/manpage.html) linting for checking the code base against the coding style (PEP8), programming errors and other cyclomatic complexity:
 
     ```sh
-    flake8 {source_file_or_directory} --count --select=E9,F63,F7,F82 --show-source --statistics
+    $ flake8 {source_file_or_directory} --count --select=E9,F63,F7,F82 --show-source --statistics
     ```
 
 - [x] **Black:**  DeFFcode follows [`black`](https://github.com/psf/black) formatting to make code review faster by producing the smallest diffs possible. You must run it with sensible defaults as follows: 
 
     ```sh
-    black {source_file_or_directory}
+    $ black {source_file_or_directory}
     ```
 
 &nbsp; 
@@ -169,7 +170,8 @@ For formatting and linting, following libraries are used:
 
 **Q1. Why do my changes taking so long to be Reviewed and/or Merged?**
 
-!!! info "Submission Aftermaths"
+!!! success "Submission Aftermaths"
+
     * After your PR is merged, you can safely delete your branch and pull the changes from the main (upstream) repository.
     * The changes will remain in `dev` branch until next DeFFcode version is released, then it will be merged into `master` branch.
     * After a successful Merge, your newer contributions will be given priority over others. 
diff --git a/docs/contribution/issue.md b/docs/contribution/issue.md
index f1a088d..9dcd143 100644
--- a/docs/contribution/issue.md
+++ b/docs/contribution/issue.md
@@ -23,6 +23,7 @@ limitations under the License.
 If you've found a new bug or you've come up with some new feature which can improve the quality of the DeFFcode, then related issues are welcomed! But, Before you do, please read the following guidelines:
 
 ??? question "First Issue on GitHub?" 
+    
     You can easily learn about it from [creating an issue](https://help.github.com/en/github/managing-your-work-on-github/creating-an-issue) wiki.
 
 !!! Info 
@@ -44,7 +45,7 @@ If you've found a new bug or you've come up with some new feature which can impr
 ### Follow the Issue Template
 
 * Please format your issue by choosing the appropriate template. 
-* Any improper/insufficient reports will be marked **invalid**, and if we don't hear back from you we may close the issue.
+* Any improper/insufficient reports will be marked **Invalid ⛔**, and if we don't hear back from you we may close the issue.
 
 ### Raise the Issue
 
diff --git a/docs/examples/advanced.md b/docs/examples/advanced.md
deleted file mode 100644
index 9cd317e..0000000
--- a/docs/examples/advanced.md
+++ /dev/null
@@ -1,485 +0,0 @@
-<!--
-======================================================================
-DeFFcode library source-code is deployed under the Apache 2.0 License:
-
-Copyright (c) 2021 Abhishek Thakur(@abhiTronix) <abhi.una12@gmail.com>
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
-   http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
-======================================================================
--->
-
-# Advanced Recipes :microscope:
-
-
-!!! quote "This is a continuation of the [Basic Recipes ➶](../basic/). Thereby, It's advised to first read through that before reading through this documentation."
-
-
-!!! warning "Important Information"
-
-    * DeFFcode APIs **MUST** requires FFmpeg executable present in path. Follow these dedicated [Installation Instructions ➶](../../installation/ffmpeg_install/) for its installation.
-
-    * ==All DeFFcode APIs will raise `RuntimeError` if they fails to detect valid FFmpeg executable on your system!==
-
-    * Always use [`terminate()`](../../reference/ffdecoder/#deffcode.ffdecoder.FFdecoder.terminate) function at the end with FFdecoder API to avoid undesired behavior.
-
-&thinsp;
-
-## Generating Video with Complex Filter Applied
-
-FFdecoder API also provides extensive support for [FFmpeg's Video Filter](http://www.ffmpeg.org/ffmpeg-filters.html#Video-Filters) through `-filter_complex` FFmpeg parameter to its real-time generated frames, thereby lets you build a **Complex Filtergraph**, applying different filter chains to different inputs and using their outputs as inputs for other filter chains.
-
-In this example we will apply a Custom Watermark Image(`"watermark.png"`) Overlay with additional Video Filter definitions to real-time frames in FFdecoder API through `-filter_complex` FFmpeg parameter, and generate output video using OpenCV Library's `VideoWriter()` class.
-
-!!! info "You can use FFdecoder's [`metadata`](../../reference/ffdecoder/#deffcode.ffdecoder.FFdecoder.metadata) property object that dumps Source Metadata as JSON to retrieve source framerate and frame-size."
-
-!!! alert "OpenCV expects `BGR` format frames in its `write(frame)` function."
-
-!!! tip "To learn about exclusive `-clones` parameter. See [Exclusive Parameters ➶](../../reference/ffdecoder/params/#b-exclusive-parameters)"
-
-```python
-# import the necessary packages
-from deffcode import FFdecoder
-import json, cv2
-
-# define the Complex Video Filter with additional `watermark.png` image input
-extraparams = {
-    "-clones": ["-i", "watermark.png"],  # define your `watermark.png` here
-    "-filter_complex": "[1]format=rgba,colorchannelmixer=aa=0.5[logo];[0][logo]overlay=W-w-5:H-h-5:format=auto,format=bgr24"
-}
-
-# initialize and formulate the decoder for BGR24 output with given params
-decoder = FFdecoder(
-    "input_foo.mp4", frame_format="bgr24", verbose=True, **extraparams
-).formulate()
-
-# retrieve JSON Metadata and convert it to dict
-metadata_dict = json.loads(decoder.metadata)
-
-# prepare OpenCV parameters
-FOURCC = cv2.VideoWriter_fourcc("M", "J", "P", "G")
-FRAMERATE = metadata_dict["source_video_framerate"]
-FRAMESIZE = tuple(metadata_dict["source_video_resolution"])
-
-# Define writer with parameters and suitable output filename for e.g. `output_foo.avi`
-writer = cv2.VideoWriter("output_foo.avi", FOURCC, FRAMERATE, FRAMESIZE)
-
-# grab the BGR24 frame from the decoder
-for frame in decoder.generateFrame():
-
-    # check if frame is None
-    if frame is None:
-        break
-
-    # {do something with the frame here}
-
-    # writing BGR24 frame to writer
-    writer.write(frame)
-
-# terminate the decoder
-decoder.terminate()
-
-# safely close writer
-writer.release()
-```
-
-&nbsp;
-
-## Generating Video from Image sequence
-
-FFdecoder API provides out-of-the-box support for image sequence such as Sequential(`'img%03d.png'`), Glob pattern(`'*.png'`), and even Single(looping) image as input to its [`source`](../../reference/sourcer/params/#source) parameter.
-
-In this example we will generate grayscale video from Image Sequence using FFdecoder(Decoder), and generate output video using OpenCV Library's `VideoWriter()` class.
-
-!!! info "You can use FFdecoder's [`metadata`](../../reference/ffdecoder/#deffcode.ffdecoder.FFdecoder.metadata) property object that dumps Source Metadata as JSON to retrieve source framerate and frame-size."
-
-!!! alert "OpenCV expects `BGR` format frames in its `write(frame)` function."
-
-??? tip "Extracting Image Sequence from a video"
-    
-    **You can use following command to extract frames from a given video:**
-    
-    ```sh
-    ffmpeg -i foo.mp4 image-%03d.png
-    ```
-    This will extract `25` images per second from the file video.webm and save them as `image-000.png`, `image-001.png`, `image-002.png` up to `image-999.png`. If there are more than `1000` frames then the last image will be overwritten with the remaining frames leaving only the last frame. The encoding of the images and of the video is inferred from the extensions. The framerate is `25` fps by default. The images width and height is taken from the video.
-
-    **Extract one image per second:**
-
-    ```sh
-    ffmpeg -i video.webm -framerate 1 image-%03d.png #
-    ```
-
-!!! note "To learn about exclusive `-ffprefixes` parameter. See [Exclusive Parameters ➶](../../reference/ffdecoder/params/#b-exclusive-parameters)"
-
-=== "Sequential"
-
-    ??? tip "Start with specific number image"
-        You can use `-start_number` FFmpeg parameter if you want to start with specific number image:
-
-        ```python
-        # define `-start_number` such as `5`
-        extraparams = {"-ffpostfixes":["-start_number", "5"]}
-
-        # initialize and formulate the decoder with define parameters
-        decoder = FFdecoder('img%03d.png', verbose=True, **extraparams).formulate()
-        ```
-
-    ```python
-    # import the necessary packages
-    from deffcode import FFdecoder
-    import cv2, json
-
-    # initialize and formulate the decode with suitable source
-    decoder = FFdecoder("/path/to/pngs/img%03d.png", frame_format="bgr24", verbose=True).formulate()
-
-    # retrieve JSON Metadata and convert it to dict
-    metadata_dict = json.loads(decoder.metadata)
-
-    # prepare OpenCV parameters
-    FOURCC = cv2.VideoWriter_fourcc("M", "J", "P", "G")
-    FRAMERATE = metadata_dict["source_video_framerate"]
-    FRAMESIZE = tuple(metadata_dict["source_video_resolution"])
-
-    # Define writer with parameters and suitable output filename for e.g. `output_foo.avi`
-    writer = cv2.VideoWriter("output_foo.avi", FOURCC, FRAMERATE, FRAMESIZE)
-
-    # grab the BGR24 frame from the decoder
-    for frame in decoder.generateFrame():
-
-        # check if frame is None
-        if frame is None:
-            break
-
-        # {do something with the frame here}
-
-        # writing BGR24 frame to writer
-        writer.write(frame)
-
-    # terminate the decoder
-    decoder.terminate()
-
-    # safely close writer
-    writer.release()
-    ```
-
-    
-
-=== "Glob pattern"
-
-    !!! abstract "Bash-style globbing _(`*` represents any number of any characters)_ is useful if your images are sequential but not necessarily in a numerically sequential order."
-
-    !!! warning "The glob pattern is not available on Windows FFmpeg builds."
-
-    ```python
-    # import the necessary packages
-    from deffcode import FFdecoder
-    import cv2, json
-
-    # define `-pattern_type glob` for accepting glob pattern
-    extraparams = {"-ffprefixes":["-pattern_type", "glob"]}
-
-    # initialize and formulate the decode with suitable source
-    decoder = FFdecoder("/path/to/pngs/img*.png", frame_format="bgr24", verbose=True, **extraparams).formulate()
-
-    # retrieve JSON Metadata and convert it to dict
-    metadata_dict = json.loads(decoder.metadata)
-
-    # prepare OpenCV parameters
-    FOURCC = cv2.VideoWriter_fourcc("M", "J", "P", "G")
-    FRAMERATE = metadata_dict["source_video_framerate"]
-    FRAMESIZE = tuple(metadata_dict["source_video_resolution"])
-
-    # Define writer with parameters and suitable output filename for e.g. `output_foo.avi`
-    writer = cv2.VideoWriter("output_foo_gray.avi", FOURCC, FRAMERATE, FRAMESIZE)
-
-    # grab the GRAYSCALE frame from the decoder
-    for frame in decoder.generateFrame():
-
-        # check if frame is None
-        if frame is None:
-            break
-
-        # {do something with the frame here}
-        # lets convert frame to gray for this case
-        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
-
-        # writing GRAYSCALE frame to writer
-        writer.write(gray)
-
-    # terminate the decoder
-    decoder.terminate()
-
-    # safely close writer
-    writer.close()
-    ```
-
-=== "Single image(looping)"
-
-    You can use a single looping image as follows:
-
-    ```python
-    # import the necessary packages
-    from deffcode import FFdecoder
-    import cv2, json
-
-    # define `-loop 1` for looping
-    extraparams = {"-ffprefixes":["-loop", "1"]}
-
-    # initialize and formulate the decode with suitable source
-    decoder = FFdecoder("img.png", frame_format="bgr24", verbose=True, **extraparams).formulate()
-
-    # retrieve JSON Metadata and convert it to dict
-    metadata_dict = json.loads(decoder.metadata)
-
-    # prepare OpenCV parameters
-    FOURCC = cv2.VideoWriter_fourcc("M", "J", "P", "G")
-    FRAMERATE = 25.0
-    FRAMESIZE = tuple(metadata_dict["source_video_resolution"])
-
-    # Define writer with parameters and suitable output filename for e.g. `output_foo.avi`
-    writer = cv2.VideoWriter("output_foo.avi", FOURCC, FRAMERATE, FRAMESIZE)
-
-    # grab the BGR24 frame from the decoder
-    for frame in decoder.generateFrame():
-
-        # check if frame is None
-        if frame is None:
-            break
-
-        # {do something with the frame here}
-
-        # writing BGR24 frame to writer
-        writer.write(frame)
-
-    # terminate the decoder
-    decoder.terminate()
-
-    # safely close writer
-    writer.release()
-    ```
-
-
-&nbsp;
-
-## Generating Lossless Video using VidGear Library
-
-!!! danger "==WriteGear's FFmpeg support for FFdecoder API is still in beta and can cause very high CPU usage.== Kindly use [**OpenCV's VideoWriter Class**](../basic/#generating-video-from-frames-using-opencv-library) until this issue is resolved."
-
-??? abstract "Reasons to use VidGear and its WriteGear API?"
-    >  [VidGear](https://abhitronix.github.io/vidgear/latest/) is a cross-platform High-Performance Video-Processing Framework for building complex real-time media applications in python 🔥 
-
-    VidGear with its [**WriteGear API**](https://abhitronix.github.io/vidgear/latest/gears/writegear/introduction/) implements a complete, flexible, and robust wrapper around FFmpeg in [compression mode](https://abhitronix.github.io/vidgear/latest/gears/writegear/compression/overview/) that can process real-time NumPy frames into a lossless compressed video-files.
-
-> DeFFcode's FFdecoder with WriteGear API creates **powerful high-level FFmpeg Transcoding(Decoding + Encoding) Pipeline :zap:** that provide us the freedom to do almost anything imaginable with multimedia data in real-time. 
-
-FFdecoder is designed exclusively to work seamlessly with WriteGear API for encoding lossless compressed video-file with any suitable specifications _(such as bitrate, codec, framerate, resolution, subtitles, etc.)_. 
-
-In this example we will generate lossless video with controlled framerate:
-
-
-!!! tip "You can use FFdecoder's [`metadata`](../../reference/ffdecoder/#deffcode.ffdecoder.FFdecoder.metadata) property object that dumps Source Metadata as JSON to retrieve source framerate."
-
-??? warning "Default `BGR` format in WriteGear API"
-    WriteGear API by default expects `BGR` format frames in its `write(frame)` function. However you can use [`rgb_mode`](https://abhitronix.github.io/vidgear/latest/bonus/reference/writegear/#vidgear.gears.writegear.WriteGear.write) boolean parameter for **RGB Mode**, which when enabled _(i.e. `rgb_mode=True`)_, makes WriteGear API accept frames of `RGB` format instead.
-
-=== "Save "BGR" Video"
-
-    ```python
-    # import the necessary packages
-    from deffcode import FFdecoder
-    from vidgear.gears import WriteGear
-    import json
-
-    # initialize and formulate the decoder for BGR24 output
-    decoder = FFdecoder("input_foo.mp4", frame_format="bgr24", verbose=True).formulate()
-
-    # retrieve framerate from source JSON Metadata and pass it as `-input_framerate` 
-    # parameter for controlled output framerate
-    output_params = {
-        "-input_framerate": json.loads(decoder.metadata)["source_video_framerate"]
-    }
-
-    # Define writer with default parameters and suitable
-    # output filename for e.g. `output_foo.mp4`
-    writer = WriteGear(output_filename="output_foo.mp4", **output_params)
-
-    # grab the BGR24 frame from the decoder
-    for frame in decoder.generateFrame():
-
-        # check if frame is None
-        if frame is None:
-            break
-
-        # {do something with the frame here}
-
-        # writing BGR24 frame to writer
-        writer.write(frame)
-
-    # terminate the decoder
-    decoder.terminate()
-
-    # safely close writer
-    writer.close()
-    ```
-
-=== "Save "RGB" Video"
-
-    !!! info "Use [`rgb_mode`](https://abhitronix.github.io/vidgear/latest/bonus/reference/writegear/#vidgear.gears.writegear.WriteGear.write) boolean parameter to write `RGB24` format in WriteGear API."
-
-    ```python
-    # import the necessary packages
-    from deffcode import FFdecoder
-    from vidgear.gears import WriteGear
-    import json
-
-    # initialize and formulate the decoder
-    decoder = FFdecoder("input_foo.mp4", verbose=True).formulate()
-
-    # retrieve framerate from source JSON Metadata and pass it as `-input_framerate` 
-    # parameter for controlled output framerate
-    output_params = {
-        "-input_framerate": json.loads(decoder.metadata)["source_video_framerate"]
-    }
-
-    # Define writer with default parameters and suitable
-    # output filename for e.g. `output_foo.mp4`
-    writer = WriteGear(output_filename="output_foo.mp4", **output_params)
-
-    # grab the BGR24 frame from the decoder
-    for frame in decoder.generateFrame():
-
-        # check if frame is None
-        if frame is None:
-            break
-
-        # {do something with the frame here}
-
-        # writing RGB24 frame to writer
-        writer.write(frame, rgb_mode=True)
-
-    # terminate the decoder
-    decoder.terminate()
-
-    # safely close writer
-    writer.close()
-    ```
-
-=== "Save "GRAYSCALE" Video"
-
-    ```python
-    # import the necessary packages
-    from deffcode import FFdecoder
-    from vidgear.gears import WriteGear
-    import json
-
-    # initialize and formulate the decoder for GRAYSCALE output
-    decoder = FFdecoder("input_foo.mp4", frame_format="gray", verbose=True).formulate()
-
-    # retrieve framerate from source JSON Metadata and pass it as `-input_framerate` parameter
-    # for controlled output framerate
-    output_params = {
-        "-input_framerate": json.loads(decoder.metadata)["source_video_framerate"]
-    }
-
-    # Define writer with default parameters and suitable
-    # output filename for e.g. `output_foo_gray.mp4`
-    writer = WriteGear(output_filename="output_foo_gray.mp4", **output_params)
-
-    # grab the GRAYSCALE frame from the decoder
-    for frame in decoder.generateFrame():
-
-        # check if frame is None
-        if frame is None:
-            break
-
-        # {do something with the frame here}
-
-        # writing GRAYSCALE frame to writer
-        writer.write(frame)
-
-    # terminate the decoder
-    decoder.terminate()
-
-    # safely close writer
-    writer.close()
-    ```
-
-&nbsp;
-
-
-## GPU enabled Hardware-Accelerated Decoding
-
-By default, FFdecoder API uses **Source Video's decoder** _(extracted using Sourcer API)_ for decoding input. But you can easily change it to your suitable [**supported decoder**](../../reference/ffdecoder/params/#supported-decoders) through `-vcodec` FFmpeg parameter by passing it as an attribute with FFdecoder's [`extraparams`](../../reference/ffdecoder/params/#extraparams) dictionary parameter. In addition to this, you can also specify the additional properties/features of your system's GPU :octicons-cpu-16: easily. 
-
-!!! warning "User Discretion Advised"
-
-    This example is just conveying the idea on how to use FFmpeg's hardware decoders with FFdecoder API, which **MAY/MAY NOT** suit your system. Kindly use suitable parameters based your system hardware settings only.
-
-
-In this example, we will be using NVIDIA's CUVID `"h264_cuvid"` as our hardware decoder and also optionally be specifying other features such as `–hwaccel cuvid` and filters like `-vf "fade,hwupload_cuda,scale_npp=1280:720"`. Thereby displaying the output frames with OpenCV's `imshow()`:
-
-!!! info "More information on NVIDIA's CUVID can be found [here ➶](https://developer.nvidia.com/blog/nvidia-ffmpeg-transcoding-guide/)"
-
-??? alert "Remember to check NVIDIA's CUVID support in FFmpeg"
-
-    To use `h264_cuvid` decoder, remember to check if its available and your FFmpeg compiled with CUVID support. You can easily do this by executing following one-liner command in your terminal, and observing if output contains something similar as follows:
-
-    ```sh
-    ffmpeg  -hide_banner -encoders | grep h264 
-
-    VFS..D h264                 H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10
-    V....D h264_qsv             H264 video (Intel Quick Sync Video acceleration) (codec h264)
-    V..... h264_cuvid           Nvidia CUVID H264 decoder (codec h264)
-    ```
-
-!!! tip "To learn about exclusive `-ffprefixes` and `-ffpostfixes` parameters. See [Exclusive Parameters ➶](../../reference/ffdecoder/params/#b-exclusive-parameters)"
-
-```python
-# import the necessary packages
-from deffcode import FFdecoder
-import cv2
-
-# define suitable FFmpeg parameter
-extraparams = {
-    "-vcodec": "h264_cuvid",
-    "-ffprefixes": ["–hwaccel", "cuvid"],
-    "-ffpostfixes": ["-vf", "fade,hwupload_cuda,scale_npp=1280:720"],
-}
-
-# initialize and formulate the decode with suitable source and params
-decoder = FFdecoder(
-    "foo.mp4", frame_format="bgr24", verbose=True, **extraparams
-).formulate()
-
-# grab the RGB24(default) frame from the decoder
-for frame in decoder.generateFrame():
-
-    # check if frame is None
-    if frame is None:
-        break
-
-    # Show output window
-    cv2.imshow("Output", frame)
-
-    # check for 'q' key if pressed
-    key = cv2.waitKey(1) & 0xFF
-    if key == ord("q"):
-        break
-
-# close output window
-cv2.destroyAllWindows()
-# terminate the decoder
-decoder.terminate()
-```
-
-&nbsp;
\ No newline at end of file
diff --git a/docs/examples/basic.md b/docs/examples/basic.md
deleted file mode 100644
index ecbee90..0000000
--- a/docs/examples/basic.md
+++ /dev/null
@@ -1,430 +0,0 @@
-<!--
-======================================================================
-DeFFcode library source-code is deployed under the Apache 2.0 License:
-
-Copyright (c) 2021 Abhishek Thakur(@abhiTronix) <abhi.una12@gmail.com>
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
-   http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
-======================================================================
--->
-
-# Basic Recipes :pie:
-
-
-!!! warning "Important Information"
-
-    * DeFFcode APIs **MUST** requires FFmpeg executable present in path. Follow these dedicated [Installation Instructions ➶](../../installation/ffmpeg_install/) for its installation.
-
-    * ==All DeFFcode APIs will raise `RuntimeError` if they fails to detect valid FFmpeg executable on your system!==
-
-    * Always use [`terminate()`](../../reference/ffdecoder/#deffcode.ffdecoder.FFdecoder.terminate) function at the end with FFdecoder API to avoid undesired behavior.
-
-&thinsp;
-
-## Saving Keyframes as Image
-
-> In Python, there are many libraries available in Python that allow us to store [`ndarray`](https://numpy.org/doc/stable/reference/arrays.ndarray.html#the-n-dimensional-array-ndarray) frames as images. And in combination with DeFFcode's **effortless and precise FFmpeg Frame Seeking** with `-ss` parameter, we can save any frame from a specific part of our input source. 
-
-Here's a example for seeking to `00:00:01.45`_(or 1045msec)_ in time, and get one single frame, thereby saving it as JPEG image with few prominent python libraries.
-
-??? note "Time unit syntax in `-ss` FFmpeg parameter"
-    You can use two different time unit formats with `-ss` FFmpeg parameter: 
-
-    - **Sexagesimal(in seconds):** Uses *(HOURS:MM:SS.MILLISECONDS)*, such as in `01:23:45.678`
-    - **Fractional:** such as in `02:30.05`, this is interpreted as 2 minutes, 30 seconds, and a half a second, which would be the same as using 150.5 in seconds.
-
-=== "Using Pillow"
-
-    In Pillow, the `fromarray()` function is used to create an image memory from an RGB array. We can then save this image memory to our desired location by providing the required path and the filename as follows:
-
-    ```python
-    # import the necessary packages
-    from deffcode import FFdecoder
-    from PIL import Image
-
-    # define the FFmpeg parameter to seek to 00:00:01.45(or 1s and 45msec)
-    # in time and get one single frame
-    extraparams = {"-ss": "00:00:01.45", "-frames:v": 1}
-
-    # initialize and formulate the decode with suitable source
-    decoder = FFdecoder("foo.mp4", **extraparams).formulate()
-
-    # grab the RGB24(default) frame from the decoder
-    frame = next(decoder.generateFrame(), None)
-
-    # check if frame is None
-    if not (frame is None):
-        # Convert and save our output
-        im = Image.fromarray(frame)
-        im.save("filename.jpeg")
-    else:
-        print("Something is wrong")
-
-    # terminate the decoder
-    decoder.terminate()
-    ```
-
-=== "Using OpenCV"
-
-    In OpenCV, the `imwrite()` function can export only BGR frames as an image file, thereby make sure to use `frame_format="bgr24"` as shown below:
-
-    ```python
-    # import the necessary packages
-    from deffcode import FFdecoder
-    import cv2
-
-    # define the FFmpeg parameter to seek to 00:00:01.45(or 1s and 45msec) 
-    # in time and get one single frame
-    extraparams = {"-ss": "00:00:01.45", "-frames:v":1}
-
-    # initialize and formulate the decoder for BGR24 outputwith suitable source
-    decoder = FFdecoder("foo.mp4", frame_format="bgr24", **extraparams).formulate()
-
-    # grab the BGR24 frame from the decoder
-    frame = next(decoder.generateFrame(), None)
-
-    # check if frame is None
-    if not(frame is None):
-        # Save our output
-        cv2.imwrite('filename.jpeg', frame)
-    else:
-        print("Something is wrong")
-
-    # terminate the decoder
-    decoder.terminate()
-    ```
-
-=== "Using Matplotlib"
-
-    In Matplotlib, the `imsave()` function can save an RGB frames as an image file:
-
-    ```python
-    # import the necessary packages
-    from deffcode import FFdecoder
-    import matplotlib.pyplot as plt
-
-    # define the FFmpeg parameter to seek to 00:00:01.45(or 1s and 45msec) 
-    # in time and get one single frame
-    extraparams = {"-ss": "00:00:01.45", "-frames:v":1}
-
-    # initialize and formulate the decode with suitable source
-    decoder = FFdecoder("foo.mp4", **extraparams).formulate()
-
-    # grab the RGB24(default) frame from the decoder
-    frame = next(decoder.generateFrame(), None)
-
-    # check if frame is None
-    if not(frame is None):
-        # Save our output
-        plt.imsave('filename.jpeg', frame)
-    else:
-        print("Something is wrong")
-
-    # terminate the decoder
-    decoder.terminate()
-    ```
-
-=== "Using imageio"
-
-    In imageio, the `imwrite()` function is used to create an image memory from an RGB array:
-
-    ```python
-    # import the necessary packages
-    from deffcode import FFdecoder
-    import imageio
-
-    # define the FFmpeg parameter to seek to 00:00:01.45(or 1s and 45msec) 
-    # in time and get one single frame
-    extraparams = {"-ss": "00:00:01.45", "-frames:v":1}
-
-    # initialize and formulate the decode with suitable source
-    decoder = FFdecoder("foo.mp4", **extraparams).formulate()
-
-    # grab the RGB24(default) frame from the decoder
-    frame = next(decoder.generateFrame(), None)
-
-    # check if frame is None
-    if not(frame is None):
-        # Save our output
-        imageio.imwrite('filename.jpeg', frame)
-    else:
-        print("Something is wrong")
-
-    # terminate the decoder
-    decoder.terminate()
-    ```
-
-&nbsp;
-
-
-## Display frames using OpenCV Library
-
-You can easily use DeFFcode APIs directly with any Video Processing library such OpenCV. 
-
-In following example we're using OpenCV's `imshow()` to display real-time BGR frame from DeFFcode's FFdecoder API.
-
-!!! note "FFdecoder API's `generateFrame()` function can be used both as a Generator and Iterator. But Generator is the recommended way."
-
-??? tip "Use `waitKey(1)` after `imshow()` function"
-    While displaying frames with `imshow()` function, it is appropriate to set the time delay in `waitKey()` to 1msec to pause each frame in the video so that the thread is freed up to do the processing we want to do. In rare cases, when the playback needs to be at a certain framerate, we may want the delay to be higher than 1msec.
-
-=== "As a Generator(Recommended)"
-
-    ```python
-    # import the necessary packages
-    from deffcode import FFdecoder
-    import cv2
-
-    # initialize and formulate the decoder for BGR24 output
-    decoder = FFdecoder("foo.mp4", frame_format="bgr24").formulate()
-
-    # grab the RGB24(default) frame from the decoder
-    for frame in decoder.generateFrame():
-
-        # check if frame is None
-        if frame is None:
-            break
-        
-        # Show output window
-        cv2.imshow("Output", frame)
-
-        # check for 'q' key if pressed
-        key = cv2.waitKey(1) & 0xFF
-        if key == ord("q"):
-            break
-
-    # close output window
-    cv2.destroyAllWindows()
-    # terminate the decoder
-    decoder.terminate()
-    ```
-
-=== "As a Iterator"
-
-    We can also use `generateFrame()` function as Iterator which is more close to OpenCV-Python (Python API for OpenCV) coding syntax:
-
-    ```python
-    # import the necessary packages
-    from deffcode import FFdecoder
-    import cv2
-
-    # initialize and formulate the decoder for BGR24 output
-    decoder = FFdecoder("foo.mp4", frame_format="bgr24").formulate()
-
-    # loop over frames
-    while True:
-        # grab the BGR24 frame from the decoder
-        frame = next(decoder.generateFrame(), None)
-
-        # check if frame is None
-        if frame is None:
-            break
-        
-        # Show output window
-        cv2.imshow("Output", frame)
-
-        # check for 'q' key if pressed
-        key = cv2.waitKey(1) & 0xFF
-        if key == ord("q"):
-            break
-
-    # close output window
-    cv2.destroyAllWindows()
-    # terminate the decoder
-    decoder.terminate()
-    ```
-
-&nbsp;
-
-
-## Generate Source Video Metadata
-
-FFdecoder using its [`metadata`](../../reference/ffdecoder/#deffcode.ffdecoder.FFdecoder.metadata) property object _(as Pretty JSON(`json.dump`))_, and Sourcer  using its [`retrieve_metadata()`](../../reference/sourcer/#deffcode.sourcer.Sourcer.retrieve_metadata) method _(as Python dictionary)_, both DeFFcode APIs can be used for **Source Metadata Extraction** that extracts metadata out of given media file.  
-
-In this example we will generate all metadata parameters available within `foo.mp4` media file using both APIs.
-
-=== "Using FFdecoder API"
-
-    ```python
-    # import the necessary packages
-    from deffcode import FFdecoder
-
-    # initialize and formulate the decoder using suitable source
-    decoder = FFdecoder("foo.mp4").formulate()
-
-    # print metadata as `json.dump`
-    print(decoder.metadata)
-
-    # terminate the decoder
-    decoder.terminate()
-    ```
-    ???+ quote "After running above python code, the resultant Terminal Output will look something as following on :fontawesome-brands-windows:Windows machine:"
-        ```json
-        {
-          "ffmpeg_binary_path": "C:\\Users\\foo\\AppData\\Local\\Temp\\ffmpeg-static-win64-gpl/bin/ffmpeg.exe",
-          "source": "foo.mp4",
-          "source_extension": ".mp4",
-          "source_video_resolution": [
-            1280,
-            720
-          ],
-          "source_video_framerate": 25.0,
-          "source_video_pixfmt": "yuv420p",
-          "source_video_decoder": "h264",
-          "source_duration_sec": 5.31,
-          "approx_video_nframes": 133,
-          "source_video_bitrate": "1205k",
-          "source_audio_bitrate": "384k",
-          "source_audio_samplerate": "48000 Hz",
-          "source_has_video": true,
-          "source_has_audio": true,
-          "source_has_image_sequence": false,
-          "ffdecoder_operational_mode": "Video-Only"
-        }
-        ```
-
-=== "Using Sourcer API"
-
-    ```python
-    # import the necessary packages
-    from deffcode import Sourcer
-
-    # initialize and formulate the decoder using suitable source
-    sourcer = Sourcer("foo.mp4").probe_stream()
-
-    # print metadata as `dict`
-    print(sourcer.retrieve_metadata())
-    ```
-    
-    ???+ quote "After running above python code, the resultant Terminal Output will look something as following on :fontawesome-brands-windows:Windows machine:"
-        ```py
-        {'ffmpeg_binary_path': 'C:\\Users\\foo\\AppData\\Local\\Temp\\ffmpeg-static-win64-gpl/bin/ffmpeg.exe', 'source': 'foo.mp4', 'source_extension': '.mp4', 'source_video_resolution': [1280, 720], 'source_video_framerate': 25.0, 'source_video_pixfmt': 'yuv420p', 'source_video_decoder': 'h264', 'source_duration_sec': 5.31, 'approx_video_nframes': 133, 'source_video_bitrate': '1205k', 'source_audio_bitrate': '384k', 'source_audio_samplerate': '48000 Hz', 'source_has_video': True, 'source_has_audio': True, 'source_has_image_sequence': False}
-    
-        ```
-
-&nbsp;
-
-
-
-## Generating Video from frames using OpenCV Library
-
-FFdecoder can work effortlessly with any OpenCV API class or method such as `VideoWriter()` to save the video.
-
-In this example we will generate video from FFdecoder outputted frames using OpenCV Library's [`VideoWriter()`](https://docs.opencv.org/3.4/dd/d9e/classcv_1_1VideoWriter.html#ad59c61d8881ba2b2da22cff5487465b5) class which require a valid output filename _(e.g. output.avi)_, a [FourCC](https://www.fourcc.org/fourcc.php) code, output framerate, and lastly input frame-size.
-
-!!! tip "You can use FFdecoder's [`metadata`](../../reference/ffdecoder/#deffcode.ffdecoder.FFdecoder.metadata) property object that dumps Source Metadata as JSON to retrieve source framerate and frame-size."
-
-!!! alert "OpenCV expects only `BGR` format frames in its `write(frame)` function."
-
-
-```python
-# import the necessary packages
-from deffcode import FFdecoder
-import json, cv2
-
-# initialize and formulate the decoder for BGR24 output
-decoder = FFdecoder("input_foo.mp4", frame_format="bgr24").formulate()
-
-# retrieve JSON Metadata and convert it to dict
-metadata_dict = json.loads(decoder.metadata)
-
-# prepare OpenCV parameters
-FOURCC = cv2.VideoWriter_fourcc("M", "J", "P", "G")
-FRAMERATE = metadata_dict["source_video_framerate"]
-FRAMESIZE = tuple(metadata_dict["source_video_resolution"])
-
-# Define writer with parameters and suitable output filename for e.g. `output_foo.avi`
-writer = cv2.VideoWriter("output_foo.avi", FOURCC, FRAMERATE, FRAMESIZE)
-
-# grab the BGR24 frame from the decoder
-for frame in decoder.generateFrame():
-
-    # check if frame is None
-    if frame is None:
-        break
-
-    # {do something with the frame here}
-
-    # writing BGR24 frame to writer
-    writer.write(frame)
-
-# terminate the decoder
-decoder.terminate()
-
-# safely close writer
-writer.release()
-```
-
-&nbsp;
-
-## Generating Video with Filter Applied
-
-FFdecoder API support almost any [FFmpeg's Video Filter](http://www.ffmpeg.org/ffmpeg-filters.html#Video-Filters) through `-vf` FFmpeg parameter that applies **a single chain of filters** to the to real-time generated frames.
-
-In this example we will apply Video Filter definitions _(like `rotate` and `drawtext`)_ to real-time frames in FFdecoder API through `-vf` FFmpeg parameter, and generate output video using OpenCV Library's `VideoWriter()` class.
-
-!!! warning "This example assumes you're running :fontawesome-brands-windows:Windows machine. If not, then change `fontfile` path in `drawtext` Video Filter definition accordingly." 
-
-!!! info "You can use FFdecoder's [`metadata`](../../reference/ffdecoder/#deffcode.ffdecoder.FFdecoder.metadata) property object that dumps Source Metadata as JSON to retrieve source framerate and frame-size."
-
-!!! alert "OpenCV expects `BGR` format frames in its `write(frame)` function."
-
-```python
-# import the necessary packages
-from deffcode import FFdecoder
-import json, cv2
-
-# define the Video Filter definition like `rotate` and `drawtext` with `-vf` FFmpeg parameter
-extraparams = {
-    "-vf": ""
-    + "rotate=angle=-20*PI/180:fillcolor=brown"  # rotate filter
-    + ", "
-    + "drawtext=text='Rotated Video':fontfile='c\:\/windows\/fonts\/arial.ttf':x=(w-text_w)/2:y=(h-text_h)/2:fontsize=24:fontcolor=white"  # drawtext filter
-}
-
-# initialize and formulate the decoder for BGR24 output with given params
-decoder = FFdecoder(
-    "input_foo.mp4", frame_format="bgr24", **extraparams
-).formulate()
-
-# retrieve JSON Metadata and convert it to dict
-metadata_dict = json.loads(decoder.metadata)
-
-# prepare OpenCV parameters
-FOURCC = cv2.VideoWriter_fourcc("M", "J", "P", "G")
-FRAMERATE = metadata_dict["source_video_framerate"]
-FRAMESIZE = tuple(metadata_dict["source_video_resolution"])
-
-# Define writer with parameters and suitable output filename for e.g. `output_foo.avi`
-writer = cv2.VideoWriter("output_foo.avi", FOURCC, FRAMERATE, FRAMESIZE)
-
-# grab the BGR24 frame from the decoder
-for frame in decoder.generateFrame():
-
-    # check if frame is None
-    if frame is None:
-        break
-
-    # {do something with the frame here}
-
-    # writing BGR24 frame to writer
-    writer.write(frame)
-
-# terminate the decoder
-decoder.terminate()
-
-# safely close writer
-writer.release()
-```
-
-&nbsp;
\ No newline at end of file
diff --git a/docs/help/index.md b/docs/help.md
similarity index 91%
rename from docs/help/index.md
rename to docs/help.md
index 9a8bc58..f698474 100644
--- a/docs/help/index.md
+++ b/docs/help.md
@@ -18,15 +18,15 @@ limitations under the License.
 ===============================================
 -->
 
-# Help Us
+# Helping Us
 
 <figure>
-  <img src="../assets/images/help_us.png" loading="lazy" alt="Helping DeFFcode" class="shadow"  width="80%"/>
+  <img src="../assets/images/help_us.png" loading="lazy" alt="Helping DeFFcode" class="shadow"  width="70%"/>
 </figure>
 
 > Liked DeFFcode? Would you like to help DeFFcode, other users, and the author?
 
-There are very simple ways to help us:
+There are many simple ways to help us:
 
 ## :material-star-settings: Star DeFFcode on GitHub
 
@@ -73,7 +73,7 @@ Let others know how you are using DeFFcode and why you like it!
 
 > Donations help keep DeFFcode's development alive and motivate me _(as author)_. :heart:{ .heart }
 
-It is (like all open source software) a labour of love and something I am doing with my own free time. If you would like to say thanks, please feel free to make a donation through ko-fi:
+It is something I am doing with my own free time. But so much more needs to be done, and I need your help to do this. For just the price of a cup of coffee, you can make a difference :slight_smile:
 
 <script type='text/javascript' src='https://ko-fi.com/widgets/widget_2.js'></script><script type='text/javascript'>kofiwidget2.init('Support Me on Ko-fi', '#eba100', 'W7W8WTYO');kofiwidget2.draw();</script> 
 
@@ -87,7 +87,7 @@ Thanks a million! :blush:
 
 You can connect with me, the author 👋:
 
-![Image title](https://avatars.githubusercontent.com/u/34266896?v=4){ align=left width="160" loading=lazy }
+![Author Image](https://avatars.githubusercontent.com/u/34266896?v=4){ align=left width="160" loading=lazy }
 
 * Follow author on GitHub: [![GitHub follow](https://img.shields.io/github/followers/abhiTronix?label=Follow%20%40abhiTronix&logo=github&style=flat-square)](https://github.com/abhiTronix)
 * Follow author on Twitter: <a href="https://twitter.com/abhi_una12?ref_src=twsrc%5Etfw" class="twitter-follow-button" data-show-count="false">Follow &commat;abhi_una12</a>
diff --git a/docs/help/get_help.md b/docs/help/get_help.md
index 9567dc1..bf3001d 100644
--- a/docs/help/get_help.md
+++ b/docs/help/get_help.md
@@ -52,7 +52,7 @@ There you can ask quick questions, swiftly troubleshoot your problems, help othe
 
 &thinsp;
 
-## Reporting an issues
+## :fontawesome-regular-face-tired: Reporting an issues
 
 > Want to report a bug? Suggest a new feature?
 
@@ -62,7 +62,7 @@ Before you do, please read our [guidelines ➶](../../contribution/issue/)
 &thinsp;
 
 
-## Preparing a Pull Request
+## :fontawesome-solid-code-pull-request: Preparing a Pull Request
 
 > Interested in contributing to DeFFcode?
 
diff --git a/docs/index.md b/docs/index.md
index 42c97be..1a9ebb1 100644
--- a/docs/index.md
+++ b/docs/index.md
@@ -20,98 +20,177 @@ limitations under the License.
 
 # Introduction
 
-<img src="assets/images/deffcode.png" alt="DeFFcode" title="Logo designed by Abhishek Thakur(@abhiTronix), under CC-BY-NC-SA 4.0 License" loading="lazy" width="87%" class="shadow2" />
+![DeFFcode](assets/images/deffcode.png#only-light){ loading=lazy }
+![DeFFcode](assets/images/deffcode-dark.png#only-dark){ loading=lazy }
 
-> DeFFcode is a powerful High-performance Real-time **Video frames Generator** that wraps FFmpeg pipeline inside a subprocess module for generating blazingly fast video frames in python :fire:
+<center>DeFFcode - A cross-platform **High-performance Video Frames Decoder** that flexibly executes <br>FFmpeg pipeline inside a subprocess pipe for generating real-time, low-overhead, <br>lightning fast video frames with robust error-handling <br>in just a few lines of python code :zap:</center>
 
-The primary purpose of DeFFcode is to provide a cross-platform solution for fast and low-overhead decoding of a wide range of video streams into 3D [`ndarray`](https://numpy.org/doc/stable/reference/arrays.ndarray.html#the-n-dimensional-array-ndarray) frames while providing **complete control over the underlying FFmpeg pipeline** without the need to go deeper into hefty documentation and in just a few lines of python code.
+<div class="spacer"></div>
 
-DeFFcode can **extract frames in real-time with any custom specification imaginable** such as Framerate, Resolution, Hardware decoding, Complex Filters into any pixel format while giving users the complete freedom to play with any desired FFmpeg supported parameter. On top of that, DeFFcode enables **effortless and precise FFmpeg Frame Seeking** natively. 
+**==Highly Adaptive== -** DeFFcode APIs implements a **standalone highly-extensible wrapper around [FFmpeg][ffmpeg]** multimedia framework. These APIs **supports a wide-ranging media streams as input** source such as live USB/Virtual/IP camera feeds, regular multimedia files, screen recordings, image sequences, network protocols _(such as HTTP(s), RTP/RSTP, etc.)_, so on and so forth.
 
-Finally, DeFFcode APIs are designed with **simplicity, flexibility, and modularity** in mind for the best developer experience. 
+**==Highly Flexible== -** DeFFcode APIs gains an edge over other Wrappers by providing **complete control over the underline pipeline** including **access to almost any FFmpeg specification thinkable** such as specifying framerate, resolution, hardware decoder(s), filtergraph(s), and <br>pixel-format(s) that are readily **supported by all well known Computer Vision libraries**.
 
+**==Highly Convenient== -**  FFmpeg has a steep learning curve especially for users unfamiliar with a command line interface. DeFFcode helps users by keeping the **same [OpenCV-Python](https://docs.opencv.org/4.x/d6/d00/tutorial_py_root.html) _(Python API for OpenCV)_ coding syntax for its APIs**, thereby making it even **easier to learn, create, and develop FFmpeg based apps** in Python.
 
 &thinsp;
 
-## Key Features
+## Key features of DeFFcode
 
-DeFFcode APIs are build on ==[**FFmpeg**][ffmpeg] - a leading multimedia framework==, that gives you the following:
+Here are some key features that stand out:
 
-- [x] Extremely exceptional real-time performance :zap: with low-memory footprints.
-- [x] Flexible API with access to almost every parameter available within FFmpeg.
-- [x] Fast dedicated [Hardware-Accelerated Decoding](examples/advanced/#gpu-enabled-hardware-accelerated-decoding).
-- [x] Precise FFmpeg [Frame Seeking](examples/basic/#saving-keyframes-as-image) with pinpoint accuracy.
-- [x] Extensive support for real-time [Complex FFmpeg Filters](examples/advanced/#generating-video-with-complex-filter-applied).
-- [x] Out-of-the-box support for Computer Vision libraries like OpenCV, Pytorch, etc.
-- [x] Support a wide range of media files, devices, image-sequence and network streams.
-- [x] Easier to ingest streams into any pixel format that FFmpeg supports.
-- [x] Lossless Transcoding support with [WriteGear](https://abhitronix.github.io/deffcode/latest/gears/writegear/introduction/).
-- [x] Fewer hard dependencies, and easy to install. 
-- [x] Designed modular for best developer experience.
-- [x] Cross-platform and runs on Python 3.7+
+- [x] High-performance, low-overhead video frames decoding with robust error-handling.
+- [x] Flexible API with access to almost any FFmpeg specification thinkable.
+- [x] Supports a wide-range of media streams/devices/protocols as input source. 
+- [x] Curated list of well-documented recipes ranging from [**Basic**](recipes/basic/) to [**Advanced**](recipes/advanced/) skill levels.
+- [x] Easy to code **Live [Simple](recipes/basic/transcode-live-frames-simplegraphs/#transcoding-live-simple-filtergraphs) & [Complex](recipes/advanced/transcode-live-frames-complexgraphs/#transcoding-live-complex-filtergraphs) Filtergraphs**. _(Yes, You read it correctly "Real-time"!)_
+- [x] Lightning fast dedicated **:fontawesome-solid-microchip: GPU-Accelerated Video [Decoding](recipes/advanced/decode-hw-acceleration/#hardware-accelerated-video-decoding) & [Transcoding](recipes/advanced/transcode-hw-acceleration/#hardware-accelerated-video-transcoding)**.
+- [x] Enables precise FFmpeg [**Frame Seeking**](recipes/basic/save-keyframe-image/#extracting-key-frames-as-png-image) with pinpoint accuracy.
+- [x] Effortless [**Metadata Extraction**](recipes/basic/extract-video-metadata/#extracting-video-metadata) from all streams available in the source.
+- [x] Maintains the standard easy to learn [**OpenCV-Python**](https://docs.opencv.org/4.x/d6/d00/tutorial_py_root.html) coding syntax.
+- [x] Out-of-the-box support for all prominent Computer Vision libraries.
+- [x] Cross-platform, runs on Python 3.7+, and easy to install. 
+
+??? question "Still missing a key feature in DeFFcode?"
+
+      Please review [**DeFFcode's Roadmap**](https://github.com/abhiTronix/deffcode/issues/21#issue-1309685018). If you still can't find the desired feature there, then you can request one simply by **Commenting :speaking_head:** or **Upvoting an existing comment :thumbsup:** [on that issue](https://github.com/abhiTronix/deffcode/issues/21).
+
+
+<!--
+- [x] Lossless Transcoding support with [WriteGear](gears/writegear/introduction/). #TODO
+-->
+
+
+&nbsp;
 
-&thinsp;
 
 ## Getting Started
 
-!!! tip "In case you're run into any problems, consult our [Help](help/get_help) section."
+<div class="spacer"></div>
+
+!!! tip "In case you're run into any problems, consult our [Help section](help/get_help)."
+
+### :material-notebook-plus: Installation Notes
+
+If this is your first time using DeFFcode, head straight to the **[Installation Notes](installation/#installation-notes) to install DeFFcode on your machine**.
+
+<div class="spacer"></div>
+
+### :material-pot-steam: Recipes a.k.a Examples
+
+
+Once you have DeFFcode installed, checkout our **Well-Documented [Recipes :material-pot-steam:](recipes/basic) for usage examples**:
+
+??? question "How to Begin?"
+      
+      If you’re just starting, check out the Beginner [**Basic Recipes :cake:**](recipes/basic) and as your confidence grows, move up to [**Advanced Recipes :croissant:**](recipes/advanced). 
+
+- [x] [**Basic Recipes :cake:**](recipes/basic): Recipes for beginners of any skill level to get started.
+- [x] [**Advanced Recipes :croissant:**](recipes/advanced): Recipes to take your skills to the next level.
 
-If this is your first time using DeFFcode, head straight to the [**Installation Notes**](installation/) to install DeFFcode.
+<div class="spacer"></div>
 
-The default function of DeFFcode's [**FFdecoder API**](reference/ffdecoder/#ffdecoder-api) is to generate 24-bit RGB (3D [`ndarray`](https://numpy.org/doc/stable/reference/arrays.ndarray.html#the-n-dimensional-array-ndarray)) frames from the given source:
+### :material-api: API in a nutshell
+
+As a user, you just have to remember only two DeFFcode APIs, namely:
+
+!!! info "See [API Reference](reference/ffdecoder/#ffdecoder-api) for more in-depth information."
+
+<div class="spacer"></div>
+
+#### A. FFdecoder API 
+
+The primary function of [**FFdecoder API**](reference/ffdecoder/#ffdecoder-api) is to **decode 24-bit RGB video frames** from the given source:
 
 ```py
 # import the necessary packages
 from deffcode import FFdecoder
 
-# formulate the decoder with suitable source(for e.g. foo.mp4)
-decoder = FFdecoder("foo.mp4").formulate()
+# formulate the decoder with suitable source
+decoder = FFdecoder("https://abhitronix.github.io/html/Big_Buck_Bunny_1080_10s_1MB.mp4").formulate()
 
 # grab RGB24(default) 3D frames from decoder
 for frame in decoder.generateFrame():
+    
     # lets print its shape
-    print(frame.shape)
-
-# print metadata as `json.dump`
-print(decoder.metadata)
+    print(frame.shape) # (1080, 1920, 3)
 
 # terminate the decoder
 decoder.terminate()
 ```
 
-**For more in-depth usage, kindly refer our [Basic Recipes :pie:](examples/basic) and [Advanced Recipes :microscope:](examples/advanced)**
+#### B. Sourcer API 
 
-&thinsp;
+The primary function of [**Sourcer API**](reference/sourcer/#sourcer-api) is to **gather information from all multimedia streams available** in the given source:
 
-## Contributions
+```python
+# import the necessary packages
+from deffcode import Sourcer
+
+# initialize and formulate the decoder using suitable source
+sourcer = Sourcer("https://abhitronix.github.io/html/Big_Buck_Bunny_1080_10s_1MB.mp4").probe_stream()
+
+# print metadata as `json.dump`
+print(sourcer.retrieve_metadata(pretty_json=True))
+```
+
+??? abstract "The resultant Terminal Output will look something as following on :fontawesome-brands-windows: Windows machine:"
+     
+      ```json
+      {
+        "ffmpeg_binary_path": "C:\\Users\\foo\\AppData\\Local\\Temp\\ffmpeg-static-win64-gpl/bin/ffmpeg.exe",
+        "source": "https://abhitronix.github.io/html/Big_Buck_Bunny_1080_10s_1MB.mp4",
+        "source_extension": ".mp4",
+        "source_video_resolution": [
+          1920,
+          1080
+        ],
+        "source_video_framerate": 60.0,
+        "source_video_pixfmt": "yuv420p",
+        "source_video_decoder": "h264",
+        "source_duration_sec": 10.0,
+        "approx_video_nframes": 600,
+        "source_video_bitrate": "832k",
+        "source_audio_bitrate": "",
+        "source_audio_samplerate": "",
+        "source_has_video": true,
+        "source_has_audio": false,
+        "source_has_image_sequence": false
+      }
+      ```
+
+
+&nbsp;
+
+## Contribution Guidelines
 
 > Contributions are welcome, and greatly appreciated!  
 
 Please read our [**Contribution Guidelines**](contribution/) for more details.
 
-&thinsp;
+&nbsp;
 
 ## Community Channel
 
 If you've come up with some new idea, or looking for the fastest way troubleshoot your problems. Please checkout our [**Gitter community channel ➶**][gitter]
 
-&thinsp; 
+&nbsp;
 
 ## Become a Stargazer
 
-You can be a [**Stargazer** :star2:{ .heart }][stargazer] by starring us on Github, it helps us a lot and you're making it easier for others to find & trust this library. Thanks!
+You can be a  [**Stargazer** :star2:{ .heart }][stargazer]  by starring us on Github, it helps us a lot and you're making it easier for others to find & trust this library. Thanks!
 
-&thinsp;
+&nbsp;
 
 ## Donations
 
 > DeFFcode is free and open source and will always remain so. :heart:{ .heart }
 
-It is something I am doing with my own free time. If you would like to say thanks, please feel free to make a donation:
+It is something I am doing with my own free time. But so much more needs to be done, and I need your help to do this. For just the price of a cup of coffee, you can make a difference :slight_smile:
 
 <script type='text/javascript' src='https://ko-fi.com/widgets/widget_2.js'></script><script type='text/javascript'>kofiwidget2.init('Support Me on Ko-fi', '#eba100', 'W7W8WTYO');kofiwidget2.draw();</script> 
 
-&thinsp;
+&nbsp;
 
 <!--
 External URLs
diff --git a/docs/installation/ffmpeg_install.md b/docs/installation/ffmpeg_install.md
index a9d8374..f0d893a 100644
--- a/docs/installation/ffmpeg_install.md
+++ b/docs/installation/ffmpeg_install.md
@@ -26,36 +26,36 @@ limitations under the License.
 
 &thinsp;
 
-> :warning: DeFFcode must requires FFmpeg executables for all its core functions. 
+==:warning: **DeFFcode APIs requires FFmpeg binaries to be installed for all of its core functionality.**==
 
 
-You can following machine-specific instructions for its installation:
+You can following machine-specific instructions for its configuration/installation:
 
-!!! error "DeFFcode APIs will throw **RuntimeError**, if they failed to detect valid FFmpeg executables on your system."
-!!! tip "Enable verbose _([`verbose=True`](../params/#verbose))_ for debugging FFmpeg validation process."
+!!! fail "DeFFcode APIs will throw **RuntimeError**, if they failed to detect valid FFmpeg executables on your system."
+!!! tip "Enable verbose ([`verbose=True`](../../reference/ffdecoder/params/#verbose)) for debugging FFmpeg validation process."
 
 &thinsp;
 
 ## :material-linux: Linux FFmpeg Installation
 
-All DeFFcode APIs supports _Auto-Detection_ and _Manual Configuration_ methods on a Linux machine:
+DeFFcode APIs supports **Auto-Detection** and **Manual Configuration** methods on a Linux OS machines:
 
 ### A. Auto-Detection 
 
 !!! quote "This is a recommended approach on Linux Machines"
 
-If DeFFcode APIs do not receive any input from the user on [**`custom_ffmpeg`**](../params/#custom_ffmpeg) parameter, then they try to **auto-detect** the required FFmpeg installed binaries through a validation test that employs `subprocess` python module on the Linux OS systems.
+If DeFFcode APIs do not receive any input from the user on [**`custom_ffmpeg`**](../../reference/ffdecoder/params/#custom_ffmpeg) parameter, then they try to **auto-detect** the required FFmpeg installed binaries through a validation test that employs `subprocess` python module on the Linux OS systems.
 
-**Installation:** You can install easily install official FFmpeg according to your Linux Distro by following [this post ➶](https://www.tecmint.com/install-ffmpeg-in-linux/)
+!!! abstract "You can install easily install official FFmpeg according to your Linux Distro by following [this post ➶](https://www.tecmint.com/install-ffmpeg-in-linux/)"
 
 
 ### B. Manual Configuration
 
 * **Download:** You can also manually download the latest Linux Static Binaries(*based on your machine arch(x86/x64)*) from the link below:
 
-    *Linux Static Binaries:* http://johnvansickle.com/ffmpeg/
+    **:material-file-download: Linux Static Binaries:** http://johnvansickle.com/ffmpeg/
 
-* **Assignment:** Then, you can easily assign the custom path to the folder containing FFmpeg executables(`for e.g 'ffmpeg/bin'`)  or path of `ffmpeg` executable itself to the [**`custom_ffmpeg`**](../params/#custom_ffmpeg) parameter in the DeFFcode APIs.
+* **Assignment:** Then, you can easily assign the custom path to the folder containing FFmpeg executables(`for e.g 'ffmpeg/bin'`)  or path of `ffmpeg` executable itself to the [**`custom_ffmpeg`**](../../reference/ffdecoder/params/#custom_ffmpeg) parameter in the DeFFcode APIs.
 
     !!! warning "If binaries were not found at the manually specified path, DeFFcode APIs will throw **RuntimeError**!"
 
@@ -65,35 +65,39 @@ If DeFFcode APIs do not receive any input from the user on [**`custom_ffmpeg`**]
 
 ## :fontawesome-brands-windows: Windows FFmpeg Installation
 
-DeFFcode APIs supports _Auto-Installation_ and _Manual Configuration_ methods on Windows systems.
+DeFFcode APIs supports **Auto-Installation** and **Manual Configuration** methods on Windows OS machines:
 
 ### A. Auto-Installation
 
 !!! quote "This is a recommended approach on Windows Machines"
 
-If DeFFcode APIs do not receive any input from the user on [**`custom_ffmpeg`**](../params/#custom_ffmpeg) parameter, then they try to **auto-generate** the required FFmpeg Static Binaries from our dedicated [**Github Server**](https://github.com/abhiTronix/FFmpeg-Builds) into the temporary directory(e.g. `C:\Temp`) of your machine on the Windows OS systems.
+If DeFFcode APIs do not receive any input from the user on [**`custom_ffmpeg`**](../../reference/ffdecoder/params/#custom_ffmpeg) parameter, then they try to **auto-generate** the required FFmpeg Static Binaries from our dedicated [**Github Server**](https://github.com/abhiTronix/FFmpeg-Builds) into the temporary directory(e.g. `C:\Temp`) of your machine on the Windows OS systems.
 
 
-!!! danger "Active Internet connection is required while downloading required FFmpeg Static Binaries from our dedicated Github Server."
+!!! danger "Active Internet connection is required while downloading required FFmpeg Static Binaries from our dedicated [**Github Server**](https://github.com/abhiTronix/FFmpeg-Builds) onto your :fontawesome-brands-windows: Windows machine."
 
-!!! warning Important Information
+???+ warning "Important Information regarding Auto-Installation"
 
-    * The files downloaded to a temporary directory (e.g. `C:\TEMP`), may get erased if your machine shutdowns/restarts.
+    * The files downloaded to a temporary directory (e.g. `C:\TEMP`), may get erased if your machine shutdowns/restarts in some cases.
 
-    * You can also provide a custom save path for auto-downloading **FFmpeg Static Binaries** through [`-ffmpeg_download_path`](../params/#a-exclusive-parameters) parameter.
+    * You can also provide a custom save path for auto-downloading **FFmpeg Static Binaries** through exclusive [`-ffmpeg_download_path`](../../reference/sourcer/params/#exclusive-parameters) attribute in Sourcer API.
 
-    * If binaries were found at the specified path, StreamGear automatically skips the auto-installation step.
+        ??? question "How to use  `-ffmpeg_download_path` attribute in FFdecoder API?
+            
+            `-ffmpeg_download_path` is also available in FFdecoder API through the [`-custom_sourcer_params`](../../reference/ffdecoder/params/#b-exclusive-parameters) attribute of its `ffparams` dictionary parameter
 
-    * ==If the required FFmpeg static binary fails to download, extract, or validate during auto-installation, then DeFFcode APIs will exit with **RuntimeError**!==
+    * If binaries were found at the specified path, DeFFcode APIs automatically skips the Auto-Installation step.
+
+    * ==If the required FFmpeg static binary fails to download, extract, or validate during Auto-Installation, then DeFFcode APIs will exit with **RuntimeError**!==
 
 
 ### B. Manual Configuration
 
 * **Download:** You can also manually download the latest Windows Static Binaries(*based on your machine arch(x86/x64)*) from the link below:
    
-      *Windows Static Binaries:* https://ffmpeg.org/download.html#build-windows
+      **:material-file-download: Windows Static Binaries:** https://ffmpeg.org/download.html#build-windows
 
-*  **Assignment:** Then, you can easily assign the custom path to the folder containing FFmpeg executables(`for e.g 'C:/foo/Downloads/ffmpeg/bin'`) or path of `ffmpeg.exe` executable itself to the [**`custom_ffmpeg`**](../params/#custom_ffmpeg) parameter in the DeFFcode APIs.
+*  **Assignment:** Then, you can easily assign the custom path to the folder containing FFmpeg executables(`for e.g 'C:/foo/Downloads/ffmpeg/bin'`) or path of `ffmpeg.exe` executable itself to the [**`custom_ffmpeg`**](../../reference/ffdecoder/params/#custom_ffmpeg) parameter in the DeFFcode APIs.
 
     !!! warning "If binaries were not found at the manually specified path, DeFFcode APIs will throw **RuntimeError**!"
 
@@ -104,23 +108,23 @@ If DeFFcode APIs do not receive any input from the user on [**`custom_ffmpeg`**]
 
 ## :material-apple: MacOS FFmpeg Installation
 
-DeFFcode APIs supports _Auto-Detection_ and _Manual Configuration_ methods on a macOS machine.
+DeFFcode APIs supports **Auto-Detection** and **Manual Configuration** methods on MacOS OS machines:
 
 ### A. Auto-Detection
 
 !!! quote "This is a recommended approach on MacOS Machines"
 
-If DeFFcode APIs do not receive any input from the user on [**`custom_ffmpeg`**](../params/#custom_ffmpeg) parameter, then they try to **auto-detect** the required FFmpeg installed binaries through a validation test that employs `subprocess` python module on the MacOS systems.
+If DeFFcode APIs do not receive any input from the user on [**`custom_ffmpeg`**](../../reference/ffdecoder/params/#custom_ffmpeg) parameter, then they try to **auto-detect** the required FFmpeg installed binaries through a validation test that employs `subprocess` python module on the MacOS systems.
 
-**Installation:** You can easily install FFmpeg on your macOS machine by following [this tutorial ➶](https://trac.ffmpeg.org/wiki/CompilationGuide/macOS)
+!!! abstract "You can easily install FFmpeg on your MacOS machine by following [this tutorial ➶](https://trac.ffmpeg.org/wiki/CompilationGuide/macOS)"
 
 ### B. Manual Configuration
 
-* **Download:** You can also manually download the latest macOS Static Binaries(*only x64 Binaries*) from the link below:
+* **Download:** You can also manually download the latest MacOS Static Binaries(*only x64 Binaries*) from the link below:
   
-    *MacOS Static Binaries:* http://johnvansickle.com/ffmpeg/
+    **:material-file-download: MacOS Static Binaries:** https://ffmpeg.org/download.html#build-mac
 
-* **Assignment:** Then, you can easily assign the custom path to the folder containing FFmpeg executables(`for e.g 'ffmpeg/bin'`) or path of `ffmpeg` executable itself to the [**`custom_ffmpeg`**](../params/#custom_ffmpeg) parameter in the DeFFcode APIs.
+* **Assignment:** Then, you can easily assign the custom path to the folder containing FFmpeg executables(`for e.g 'ffmpeg/bin'`) or path of `ffmpeg` executable itself to the [**`custom_ffmpeg`**](../../reference/ffdecoder/params/#custom_ffmpeg) parameter in the DeFFcode APIs.
 
 
     !!! warning "If binaries were not found at the manually specified path, DeFFcode APIs will throw **RuntimeError**!"
diff --git a/docs/installation/index.md b/docs/installation/index.md
index d4440a3..89f6202 100644
--- a/docs/installation/index.md
+++ b/docs/installation/index.md
@@ -102,26 +102,23 @@ DeFFcode is well-tested and supported on the following systems(but not limited t
 
 ## Supported Python legacies
 
-:fontawesome-brands-python: [**Python 3.7+**](https://www.python.org/downloads/) are only supported legacies for installing DeFFcode v0.1.0 and above.
+:fontawesome-brands-python: [**Python 3.7+**](https://www.python.org/downloads/) are only supported legacies for installing DeFFcode `v0.1.0` and above.
 
 &thinsp;
 
-
 ## Prerequisites
 
-When installing DeFFcode, [**FFmpeg**][ffmpeg] is the only prerequisites you need to install manually, except on Windows :fontawesome-brands-windows::
+==:warning: **DeFFcode APIs requires FFmpeg binaries to be installed for all of its core functionality.**==
 
 ### FFmpeg 
 
-Must require FFmpeg binaries installed for all core functions. 
-
-!!! tip "You easily install it by following this dedicated [**FFmpeg Installation doc**](../installation/ffmpeg_install/)"
+When installing DeFFcode, [**FFmpeg**][ffmpeg] is the only prerequisites you need to configure/install manually. **You could easily do it by referring [**FFmpeg Installation doc**](../installation/ffmpeg_install/)**.
 
 &nbsp;
 
 ## Installation
 
-### A. Install using pip (Recommended)
+### A. Installation using pip (Recommended)
 
 
 > _Best option for easily getting stable DeFFcode installed._
@@ -172,9 +169,9 @@ pip install deffcode-0.2.0-py3-none-any.whl
 
 >  Best option for trying latest patches(maybe experimental), forking for Pull Requests, or automatically installing all prerequisites(with a few exceptions). 
 
-??? info "Beta Branch `dev`" 
+??? info "Installation using `dev` banch :octicons-git-branch-24:" 
 
-    If you're looking for latest work-in-progress :construction: enhancements/bug-fixes, then you want to checkout our beta [`dev`](https://github.com/abhiTronix/deffcode/tree/dev) branch with the following commands:
+    If you're looking for latest work-in-progress :construction: enhancements or bug-fixes, then you want to checkout our beta [`dev`](https://github.com/abhiTronix/deffcode/tree/dev) branch with the following commands:
 
     !!! danger "The beta `dev` branch at times can be very unstable or even unusable, User discretion is advised!"
 
diff --git a/docs/overrides/404.html b/docs/overrides/404.html
index 535b76e..0f29ff7 100644
--- a/docs/overrides/404.html
+++ b/docs/overrides/404.html
@@ -1,11 +1,12 @@
 {% extends "main.html" %} {% block content %}
 {% set image_404 = config.site_url ~ '/assets/images/404.png' %}
+{% set homepage_link = config.site_url ~ '/' %}
 <img src="{{ image_404 }}" alt="404" loading="lazy" width="80%" />
 <div class="contant_box_404">
 	<h2 class="h2">
               Look like you're lost
             </h2>
-	<p>the page you are looking for not available!</p> <a href="https://abhitronix.github.io/deffcode/" class="link_404">Go to Home</a> </div>
+	<p>the page you are looking for not available!</p> <a href="{{ homepage_link }}" class="link_404">Go to Home</a> </div>
 <style>
 .link_404 {
 	color: #fff !important;
diff --git a/docs/overrides/assets/gifs/bigbuckbunny_cropped.gif b/docs/overrides/assets/gifs/bigbuckbunny_cropped.gif
new file mode 100644
index 0000000..b20c329
Binary files /dev/null and b/docs/overrides/assets/gifs/bigbuckbunny_cropped.gif differ
diff --git a/docs/overrides/assets/gifs/bigbuckbunny_hflip_scaled.gif b/docs/overrides/assets/gifs/bigbuckbunny_hflip_scaled.gif
new file mode 100644
index 0000000..b77027b
Binary files /dev/null and b/docs/overrides/assets/gifs/bigbuckbunny_hflip_scaled.gif differ
diff --git a/docs/overrides/assets/gifs/bigbuckbunny_reversed.gif b/docs/overrides/assets/gifs/bigbuckbunny_reversed.gif
new file mode 100644
index 0000000..5d39cc7
Binary files /dev/null and b/docs/overrides/assets/gifs/bigbuckbunny_reversed.gif differ
diff --git a/docs/overrides/assets/gifs/bigbuckbunny_rotate.gif b/docs/overrides/assets/gifs/bigbuckbunny_rotate.gif
new file mode 100644
index 0000000..7261d81
Binary files /dev/null and b/docs/overrides/assets/gifs/bigbuckbunny_rotate.gif differ
diff --git a/docs/overrides/assets/gifs/bigbuckbunny_transpose.gif b/docs/overrides/assets/gifs/bigbuckbunny_transpose.gif
new file mode 100644
index 0000000..c8e3b8d
Binary files /dev/null and b/docs/overrides/assets/gifs/bigbuckbunny_transpose.gif differ
diff --git a/docs/overrides/assets/gifs/bitplane_visualization.gif b/docs/overrides/assets/gifs/bitplane_visualization.gif
new file mode 100644
index 0000000..2b89135
Binary files /dev/null and b/docs/overrides/assets/gifs/bitplane_visualization.gif differ
diff --git a/docs/overrides/assets/gifs/fish_mandelbrot.gif b/docs/overrides/assets/gifs/fish_mandelbrot.gif
new file mode 100644
index 0000000..4012440
Binary files /dev/null and b/docs/overrides/assets/gifs/fish_mandelbrot.gif differ
diff --git a/docs/overrides/assets/gifs/ghosting_effect.gif b/docs/overrides/assets/gifs/ghosting_effect.gif
new file mode 100644
index 0000000..feeebad
Binary files /dev/null and b/docs/overrides/assets/gifs/ghosting_effect.gif differ
diff --git a/docs/overrides/assets/gifs/gradients.gif b/docs/overrides/assets/gifs/gradients.gif
new file mode 100644
index 0000000..11aa63b
Binary files /dev/null and b/docs/overrides/assets/gifs/gradients.gif differ
diff --git a/docs/overrides/assets/gifs/jetcolor_effect.gif b/docs/overrides/assets/gifs/jetcolor_effect.gif
new file mode 100644
index 0000000..78ec787
Binary files /dev/null and b/docs/overrides/assets/gifs/jetcolor_effect.gif differ
diff --git a/docs/overrides/assets/gifs/life.gif b/docs/overrides/assets/gifs/life.gif
new file mode 100644
index 0000000..e39741c
Binary files /dev/null and b/docs/overrides/assets/gifs/life.gif differ
diff --git a/docs/overrides/assets/gifs/mandelbrot_vectorscope_waveforms.gif b/docs/overrides/assets/gifs/mandelbrot_vectorscope_waveforms.gif
new file mode 100644
index 0000000..fd709bd
Binary files /dev/null and b/docs/overrides/assets/gifs/mandelbrot_vectorscope_waveforms.gif differ
diff --git a/docs/overrides/assets/gifs/pixelation_effect.gif b/docs/overrides/assets/gifs/pixelation_effect.gif
new file mode 100644
index 0000000..de8d54f
Binary files /dev/null and b/docs/overrides/assets/gifs/pixelation_effect.gif differ
diff --git a/docs/overrides/assets/gifs/sierpinski.gif b/docs/overrides/assets/gifs/sierpinski.gif
new file mode 100644
index 0000000..7c52d88
Binary files /dev/null and b/docs/overrides/assets/gifs/sierpinski.gif differ
diff --git a/docs/overrides/assets/gifs/watermark_overlay.gif b/docs/overrides/assets/gifs/watermark_overlay.gif
new file mode 100644
index 0000000..79c3f02
Binary files /dev/null and b/docs/overrides/assets/gifs/watermark_overlay.gif differ
diff --git a/docs/overrides/assets/images/deffcode-dark.png b/docs/overrides/assets/images/deffcode-dark.png
new file mode 100644
index 0000000..8a390d4
Binary files /dev/null and b/docs/overrides/assets/images/deffcode-dark.png differ
diff --git a/docs/overrides/assets/images/deffcode-tagline.png b/docs/overrides/assets/images/deffcode-tagline.png
deleted file mode 100644
index 2a63143..0000000
Binary files a/docs/overrides/assets/images/deffcode-tagline.png and /dev/null differ
diff --git a/docs/overrides/assets/images/fancy_thumbnail.jpg b/docs/overrides/assets/images/fancy_thumbnail.jpg
new file mode 100644
index 0000000..f8e8171
Binary files /dev/null and b/docs/overrides/assets/images/fancy_thumbnail.jpg differ
diff --git a/docs/overrides/assets/images/ffdecoder.png b/docs/overrides/assets/images/ffdecoder.png
new file mode 100644
index 0000000..48d46a6
Binary files /dev/null and b/docs/overrides/assets/images/ffdecoder.png differ
diff --git a/docs/overrides/assets/images/hw_accel.png b/docs/overrides/assets/images/hw_accel.png
new file mode 100644
index 0000000..41c048b
Binary files /dev/null and b/docs/overrides/assets/images/hw_accel.png differ
diff --git a/docs/overrides/assets/images/hw_accel_limitation.png b/docs/overrides/assets/images/hw_accel_limitation.png
new file mode 100644
index 0000000..e0ce850
Binary files /dev/null and b/docs/overrides/assets/images/hw_accel_limitation.png differ
diff --git a/docs/overrides/assets/images/simplefiltergraphs.png b/docs/overrides/assets/images/simplefiltergraphs.png
new file mode 100644
index 0000000..cc42970
Binary files /dev/null and b/docs/overrides/assets/images/simplefiltergraphs.png differ
diff --git a/docs/overrides/assets/images/sourcer.png b/docs/overrides/assets/images/sourcer.png
new file mode 100644
index 0000000..8dae481
Binary files /dev/null and b/docs/overrides/assets/images/sourcer.png differ
diff --git a/docs/overrides/assets/stylesheets/custom.css b/docs/overrides/assets/stylesheets/custom.css
index e7b9cca..b28dbc6 100644
--- a/docs/overrides/assets/stylesheets/custom.css
+++ b/docs/overrides/assets/stylesheets/custom.css
@@ -20,46 +20,188 @@ limitations under the License.
 
 /* Handles New admonition*/
 :root {
-	--md-admonition-icon--new: url("data:image/svg+xml,%3C%3Fxml version='1.0' encoding='UTF-8'%3F%3E%3C!DOCTYPE svg PUBLIC '-//W3C//DTD SVG 1.1//EN' 'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd'%3E%3Csvg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' version='1.1' width='24' height='24' viewBox='0 0 24 24'%3E%3Cpath fill='%23000000' d='M13 2V3H12V9H11V10H9V11H8V12H7V13H5V12H4V11H3V9H2V15H3V16H4V17H5V18H6V22H8V21H7V20H8V19H9V18H10V19H11V22H13V21H12V17H13V16H14V15H15V12H16V13H17V11H15V9H20V8H17V7H22V3H21V2M14 3H15V4H14Z' /%3E%3C/svg%3E");
-	--md-admonition-icon--alert: url("data:image/svg+xml,%3C%3Fxml version='1.0' encoding='UTF-8'%3F%3E%3C!DOCTYPE svg PUBLIC '-//W3C//DTD SVG 1.1//EN' 'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd'%3E%3Csvg xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink' version='1.1' width='24' height='24' viewBox='0 0 24 24'%3E%3Cpath fill='%23000000' d='M6,6.9L3.87,4.78L5.28,3.37L7.4,5.5L6,6.9M13,1V4H11V1H13M20.13,4.78L18,6.9L16.6,5.5L18.72,3.37L20.13,4.78M4.5,10.5V12.5H1.5V10.5H4.5M19.5,10.5H22.5V12.5H19.5V10.5M6,20H18A2,2 0 0,1 20,22H4A2,2 0 0,1 6,20M12,5A6,6 0 0,1 18,11V19H6V11A6,6 0 0,1 12,5Z' /%3E%3C/svg%3E");
-}
-
+	--md-admonition-icon--new: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' style='width:24px;height:24px' viewBox='0 0 24 24'%3E%3Cpath fill='currentColor' d='M20,4C21.11,4 22,4.89 22,6V18C22,19.11 21.11,20 20,20H4C2.89,20 2,19.11 2,18V6C2,4.89 2.89,4 4,4H20M8.5,15V9H7.25V12.5L4.75,9H3.5V15H4.75V11.5L7.3,15H8.5M13.5,10.26V9H9.5V15H13.5V13.75H11V12.64H13.5V11.38H11V10.26H13.5M20.5,14V9H19.25V13.5H18.13V10H16.88V13.5H15.75V9H14.5V14A1,1 0 0,0 15.5,15H19.5A1,1 0 0,0 20.5,14Z' /%3E%3C/svg%3E");
+	--md-admonition-icon--alert: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' style='width:24px;height:24px' viewBox='0 0 24 24'%3E%3Cpath fill='currentColor' d='M10 2C6.1 2 3 5.1 3 9C3 11.4 4.2 13.5 6 14.7V17C6 17.6 6.4 18 7 18H13C13.6 18 14 17.6 14 17V14.7C15.8 13.4 17 11.3 17 9C17 5.1 13.9 2 10 2M7 21C7 21.6 7.4 22 8 22H12C12.6 22 13 21.6 13 21V20H7V21M19 12V7H21V13H19M19 17V15H21V17H19Z' /%3E%3C/svg%3E");
+	--md-admonition-icon--xwarning: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' style='width:24px;height:24px' viewBox='0 0 24 24'%3E%3Cpath fill='currentColor' d='M13 14H11V9H13M13 18H11V16H13M1 21H23L12 2L1 21Z' /%3E%3C/svg%3E");
+	--md-admonition-icon--xdanger: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' style='width:24px;height:24px' viewBox='0 0 24 24'%3E%3Cpath fill='currentColor' d='M12,2A9,9 0 0,0 3,11C3,14.03 4.53,16.82 7,18.47V22H9V19H11V22H13V19H15V22H17V18.46C19.47,16.81 21,14 21,11A9,9 0 0,0 12,2M8,11A2,2 0 0,1 10,13A2,2 0 0,1 8,15A2,2 0 0,1 6,13A2,2 0 0,1 8,11M16,11A2,2 0 0,1 18,13A2,2 0 0,1 16,15A2,2 0 0,1 14,13A2,2 0 0,1 16,11M12,14L13.5,17H10.5L12,14Z' /%3E%3C/svg%3E");
+	--md-admonition-icon--xtip: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' style='width:24px;height:24px' viewBox='0 0 24 24'%3E%3Cpath fill='currentColor' d='M9 20H15V21C15 21.55 14.55 22 14 22H10C9.45 22 9 21.55 9 21V20M19 9C19 11.38 17.81 13.47 16 14.74V17C16 17.55 15.55 18 15 18H9C8.45 18 8 17.55 8 17V14.74C6.19 13.47 5 11.38 5 9C5 5.13 8.13 2 12 2S19 5.13 19 9M14.71 8.29C14.32 7.9 13.68 7.9 13.29 8.29L12 9.59L10.71 8.29C10.32 7.9 9.68 7.9 9.29 8.29C8.9 8.68 8.9 9.32 9.29 9.71L11 11.41V16H13V11.41L14.71 9.71C15.1 9.32 15.1 8.68 14.71 8.29Z' /%3E%3C/svg%3E");
+	--md-admonition-icon--xfail: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' style='width:24px;height:24px' viewBox='0 0 24 24'%3E%3Cpath fill='currentColor' d='M8.27,3L3,8.27V15.73L8.27,21H15.73L21,15.73V8.27L15.73,3M8.41,7L12,10.59L15.59,7L17,8.41L13.41,12L17,15.59L15.59,17L12,13.41L8.41,17L7,15.59L10.59,12L7,8.41' /%3E%3C/svg%3E");
+	--md-admonition-icon--xsuccess: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' style='width:24px;height:24px' viewBox='0 0 24 24'%3E%3Cpath fill='currentColor' d='M22,16A2,2 0 0,1 20,18H8C6.89,18 6,17.1 6,16V4C6,2.89 6.89,2 8,2H20A2,2 0 0,1 22,4V16M16,20V22H4A2,2 0 0,1 2,20V7H4V20H16M13,14L20,7L18.59,5.59L13,11.17L9.91,8.09L8.5,9.5L13,14Z' /%3E%3C/svg%3E");
+	--md-admonition-icon--xexample: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' style='width:24px;height:24px' viewBox='0 0 24 24'%3E%3Cpath fill='currentColor' d='M13,12H20V13.5H13M13,9.5H20V11H13M13,14.5H20V16H13M21,4H3A2,2 0 0,0 1,6V19A2,2 0 0,0 3,21H21A2,2 0 0,0 23,19V6A2,2 0 0,0 21,4M21,19H12V6H21' /%3E%3C/svg%3E");
+	--md-admonition-icon--xquestion: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' style='width:24px;height:24px' viewBox='0 0 24 24'%3E%3Cpath fill='currentColor' d='M12 2C11.5 2 11 2.19 10.59 2.59L2.59 10.59C1.8 11.37 1.8 12.63 2.59 13.41L10.59 21.41C11.37 22.2 12.63 22.2 13.41 21.41L21.41 13.41C22.2 12.63 22.2 11.37 21.41 10.59L13.41 2.59C13 2.19 12.5 2 12 2M12 6.95C14.7 7.06 15.87 9.78 14.28 11.81C13.86 12.31 13.19 12.64 12.85 13.07C12.5 13.5 12.5 14 12.5 14.5H11C11 13.65 11 12.94 11.35 12.44C11.68 11.94 12.35 11.64 12.77 11.31C14 10.18 13.68 8.59 12 8.46C11.18 8.46 10.5 9.13 10.5 9.97H9C9 8.3 10.35 6.95 12 6.95M11 15.5H12.5V17H11V15.5Z' /%3E%3C/svg%3E");
+	--md-admonition-icon--xbug: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' style='width:24px;height:24px' viewBox='0 0 24 24'%3E%3Cpath fill='currentColor' d='M21.29 16.71L22.71 15.29L19.5 12.11L16.5 11.26L18.41 11L22.6 7.8L21.4 6.2L17.59 9.05L14.91 9.5L18.11 6.31L17 1.76L15 2.24L15.86 5.69L14.76 6.83A3 3 0 0 0 9.24 6.83L8.11 5.69L9 2.24L7 1.76L5.89 6.31L9.09 9.5L6.4 9.05L2.6 6.2L1.4 7.8L5.6 11L7.46 11.31L4.46 12.16L1.29 15.29L2.71 16.71L5.5 13.89L7.87 13.22L4 16.54V22H6V17.46L7.56 16.12A4.5 4.5 0 0 0 16.44 16.12L18 17.46V22H20V16.54L16.13 13.22L18.5 13.89Z' /%3E%3C/svg%3E");
+	--md-admonition-icon--xabstract: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' style='width:24px;height:24px' viewBox='0 0 24 24'%3E%3Cpath fill='currentColor' d='M20,2H4A2,2 0 0,0 2,4V22L6,18H20A2,2 0 0,0 22,16V4A2,2 0 0,0 20,2M6,9H18V11H6M14,14H6V12H14M18,8H6V6H18' /%3E%3C/svg%3E");
+	--md-admonition-icon--xnote: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' style='width:24px;height:24px' viewBox='0 0 24 24'%3E%3Cpath fill='currentColor' d='M9.75 20.85C11.53 20.15 11.14 18.22 10.24 17C9.35 15.75 8.12 14.89 6.88 14.06C6 13.5 5.19 12.8 4.54 12C4.26 11.67 3.69 11.06 4.27 10.94C4.86 10.82 5.88 11.4 6.4 11.62C7.31 12 8.21 12.44 9.05 12.96L10.06 11.26C8.5 10.23 6.5 9.32 4.64 9.05C3.58 8.89 2.46 9.11 2.1 10.26C1.78 11.25 2.29 12.25 2.87 13.03C4.24 14.86 6.37 15.74 7.96 17.32C8.3 17.65 8.71 18.04 8.91 18.5C9.12 18.94 9.07 18.97 8.6 18.97C7.36 18.97 5.81 18 4.8 17.36L3.79 19.06C5.32 20 7.88 21.47 9.75 20.85M18.96 7.33L13.29 13H11V10.71L16.67 5.03L18.96 7.33M22.36 6.55C22.35 6.85 22.04 7.16 21.72 7.47L19.2 10L18.33 9.13L20.93 6.54L20.34 5.95L19.67 6.62L17.38 4.33L19.53 2.18C19.77 1.94 20.16 1.94 20.39 2.18L21.82 3.61C22.06 3.83 22.06 4.23 21.82 4.47C21.61 4.68 21.41 4.88 21.41 5.08C21.39 5.28 21.59 5.5 21.79 5.67C22.08 5.97 22.37 6.25 22.36 6.55Z' /%3E%3C/svg%3E");
+	--md-admonition-icon--xinfo: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' style='width:24px;height:24px' viewBox='0 0 24 24'%3E%3Cpath fill='currentColor' d='M21,19V20H3V19L5,17V11C5,7.9 7.03,5.17 10,4.29C10,4.19 10,4.1 10,4A2,2 0 0,1 12,2A2,2 0 0,1 14,4C14,4.1 14,4.19 14,4.29C16.97,5.17 19,7.9 19,11V17L21,19M14,21A2,2 0 0,1 12,23A2,2 0 0,1 10,21M19.75,3.19L18.33,4.61C20.04,6.3 21,8.6 21,11H23C23,8.07 21.84,5.25 19.75,3.19M1,11H3C3,8.6 3.96,6.3 5.67,4.61L4.25,3.19C2.16,5.25 1,8.07 1,11Z' /%3E%3C/svg%3E");
+	--md-admonition-icon--xadvance: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' style='width:24px;height:24px' viewBox='0 0 24 24'%3E%3Cpath fill='currentColor' d='M18.41,4L16,6.41V6.59L18.41,9H22V11H17.59L16,9.41V12H15A2,2 0 0,1 13,10V7.5H9.86C9.77,7.87 9.62,8.22 9.42,8.55L15.18,19H20A2,2 0 0,1 22,21V22H2V21A2,2 0 0,1 4,19H10.61L5.92,10.5C4.12,10.47 2.56,9.24 2.11,7.5C1.56,5.36 2.85,3.18 5,2.63C7.13,2.08 9.31,3.36 9.86,5.5H13V3A2,2 0 0,1 15,1H16V3.59L17.59,2H22V4H18.41M6,4.5A2,2 0 0,0 4,6.5A2,2 0 0,0 6,8.5A2,2 0 0,0 8,6.5A2,2 0 0,0 6,4.5Z' /%3E%3C/svg%3E");
+}
+
+/* "Advance" admonition*/
+.md-typeset .admonition.advance,
+.md-typeset details.advance {
+	border-color: rgb(0, 0, 139);
+}
+
+.md-typeset .advance > .admonition-title,
+.md-typeset .advance > summary,
+.md-typeset .experiment > .admonition-title,
+.md-typeset .experiment > summary {
+	background-color: rgb(0, 0, 139, 0.1);
+	border-color: rgb(0, 0, 139);
+}
+
+.md-typeset .advance > .admonition-title::before,
+.md-typeset .advance > summary::before,
+.md-typeset .experiment > .admonition-title::before,
+.md-typeset .experiment > summary::before {
+	background-color: rgb(0, 0, 139);
+	-webkit-mask-image: var(--md-admonition-icon--xadvance);
+	mask-image: var(--md-admonition-icon--xadvance);
+}
+
+/* "New" admonition*/
 .md-typeset .admonition.new,
 .md-typeset details.new {
-	border-color: rgb(57,255,20);
-}
-
-.md-typeset .admonition.alert,
-.md-typeset details.alert {
-	border-color: rgb(255, 0, 255);
+	border-color: rgb(255, 195, 0);
 }
 
 .md-typeset .new > .admonition-title,
 .md-typeset .new > summary {
-	background-color: rgb(57,255,20,0.1);
-	border-color: rgb(57,255,20);
+	background-color: rgb(255, 195, 0,0.1);
+	border-color: rgb(255, 195, 0);
 }
 
 .md-typeset .new > .admonition-title::before,
 .md-typeset .new > summary::before {
-	background-color: rgb(57,255,20);
+	background-color: rgb(255, 195, 0);
 	-webkit-mask-image: var(--md-admonition-icon--new);
 	mask-image: var(--md-admonition-icon--new);
 }
 
+
+/* "Alert" admonition*/
+.md-typeset .admonition.alert,
+.md-typeset details.alert {
+	border-color: rgb(255, 0, 127);
+}
+
 .md-typeset .alert > .admonition-title,
 .md-typeset .alert > summary {
-	background-color: rgba(255, 0, 255, 0.1);
-	border-color: rgb(255, 0, 255);
+	background-color: rgba(255, 0, 127 , 0.1);
+	border-color: rgb(255, 0, 127);
 }
 
 .md-typeset .alert > .admonition-title::before,
 .md-typeset .alert > summary::before {
-	background-color: rgb(255, 0, 255);
+	background-color: rgb(255, 0, 127);
 	-webkit-mask-image: var(--md-admonition-icon--alert);
 	mask-image: var(--md-admonition-icon--alert);
 }
 
+/* Custom "Warning" admonition*/
+.md-typeset .attention > .admonition-title::before,
+.md-typeset .attention > summary::before,
+.md-typeset .caution > .admonition-title::before,
+.md-typeset .caution > summary::before,
+.md-typeset .warning > .admonition-title::before,
+.md-typeset .warning > summary::before {
+	-webkit-mask-image: var(--md-admonition-icon--xwarning);
+	mask-image: var(--md-admonition-icon--xwarning);
+}
+
+/* Custom "Tip" admonition*/
+.md-typeset .hint > .admonition-title::before,
+.md-typeset .hint > summary::before,
+.md-typeset .important > .admonition-title::before,
+.md-typeset .important > summary::before,
+.md-typeset .tip > .admonition-title::before,
+.md-typeset .tip > summary::before {
+	-webkit-mask-image: var(--md-admonition-icon--xtip) !important;
+	mask-image: var(--md-admonition-icon--xtip) !important;
+}
+
+/* Custom "Info" admonition*/
+.md-typeset .info > .admonition-title::before,
+.md-typeset .info > summary::before,
+.md-typeset .todo > .admonition-title::before,
+.md-typeset .todo > summary::before {
+	-webkit-mask-image: var(--md-admonition-icon--xinfo) !important;
+	mask-image: var(--md-admonition-icon--xinfo) !important;
+}
+
+/* Custom "Danger" admonition*/
+.md-typeset .danger > .admonition-title::before,
+.md-typeset .danger > summary::before,
+.md-typeset .error > .admonition-title::before,
+.md-typeset .error > summary::before {
+	-webkit-mask-image: var(--md-admonition-icon--xdanger) !important;
+	mask-image: var(--md-admonition-icon--xdanger) !important;
+}
+
+/* Custom "Note" admonition*/
+.md-typeset .note > .admonition-title::before,
+.md-typeset .note > summary::before {
+	-webkit-mask-image: var(--md-admonition-icon--xnote);
+	mask-image: var(--md-admonition-icon--xnote);
+}
+
+/* Custom "Abstract" admonition*/
+.md-typeset .abstract > .admonition-title::before,
+.md-typeset .abstract > summary::before,
+.md-typeset .summary > .admonition-title::before,
+.md-typeset .summary > summary::before,
+.md-typeset .tldr > .admonition-title::before,
+.md-typeset .tldr > summary::before {
+	-webkit-mask-image: var(--md-admonition-icon--xabstract);
+	mask-image: var(--md-admonition-icon--xabstract);
+}
+
+/* Custom "Question" admonition*/
+.md-typeset .faq > .admonition-title::before,
+.md-typeset .faq > summary::before,
+.md-typeset .help > .admonition-title::before,
+.md-typeset .help > summary::before,
+.md-typeset .question > .admonition-title::before,
+.md-typeset .question > summary::before {
+	-webkit-mask-image: var(--md-admonition-icon--xquestion);
+	mask-image: var(--md-admonition-icon--xquestion);
+}
+
+/* Custom "Success" admonition*/
+.md-typeset .check > .admonition-title::before,
+.md-typeset .check > summary::before,
+.md-typeset .done > .admonition-title::before,
+.md-typeset .done > summary::before,
+.md-typeset .success > .admonition-title::before,
+.md-typeset .success > summary::before {
+	-webkit-mask-image: var(--md-admonition-icon--xsuccess) !important;
+	mask-image: var(--md-admonition-icon--xsuccess) !important;
+}
+
+/* Custom "Fail" admonition*/
+.md-typeset .fail > .admonition-title::before,
+.md-typeset .fail > summary::before,
+.md-typeset .failure > .admonition-title::before,
+.md-typeset .failure > summary::before,
+.md-typeset .missing > .admonition-title::before,
+.md-typeset .missing > summary::before {
+	-webkit-mask-image: var(--md-admonition-icon--xfail);
+	mask-image: var(--md-admonition-icon--xfail);
+}
+
+/* Custom "bug" admonition*/
+.md-typeset .bug > .admonition-title::before,
+.md-typeset .bug > summary::before {
+	-webkit-mask-image: var(--md-admonition-icon--xbug) !important;
+	mask-image: var(--md-admonition-icon--xbug) !important;
+}
+
+/* Custom "Example" admonition*/
+.md-typeset .example > .admonition-title::before,
+.md-typeset .example > summary::before {
+	-webkit-mask-image: var(--md-admonition-icon--xexample);
+	mask-image: var(--md-admonition-icon--xexample);
+}
 
 /* Handles Gitter Sidecard UI */
 .gitter-open-chat-button {
@@ -72,6 +214,19 @@ limitations under the License.
 
 
 /* Handles DeFFcode UI */
+.md-nav__item--active > .md-nav__link {
+	font-weight: bold;
+}
+.center {
+	display: block;
+	margin-left: auto;
+	margin-right: auto;
+	width: 80%;
+}
+.doc-heading {
+	padding-top: 50px;
+}
+
 .center-small {
 	display: block;
 	margin-left: auto;
@@ -87,6 +242,10 @@ limitations under the License.
 	font-size: 1rem !important;
 }
 
+.md-version__link {
+	overflow: hidden;
+}
+
 .md-version__current {
 	text-transform: uppercase;
 	font-weight: bolder;
@@ -98,10 +257,6 @@ limitations under the License.
 	mask-image: var(--md-admonition-icon--failure);
 }
 
-.doc-heading {
-	padding-top: 50px;
-}
-
 
 /* Custom Blockquotes */
 blockquote {
@@ -148,6 +303,7 @@ footer.sponsorship:hover hr {
 footer.sponsorship:not(:hover) .twemoji.heart-throb-hover svg {
 	color: var(--md-default-fg-color--lighter) !important;
 }
+
 /* Heart Animation */
 @keyframes heart {
   0%, 40%, 80%, 100% {
@@ -204,7 +360,9 @@ footer.sponsorship:not(:hover) .twemoji.heart-throb-hover svg {
 	width: 100%;
 }
 
+
 /* Dark Theme Changes */
+
 body[data-md-color-scheme="slate"] img[class="shadow"]{
    -webkit-filter: drop-shadow(2px 2px 1px rgba(0, 0, 0, 0.5));
   	filter: drop-shadow(2px 2px 1px rgba(0, 0, 0, 0.5));
@@ -229,7 +387,12 @@ body[data-md-color-scheme="slate"] img[class="shadow2"]{
    -webkit-filter: drop-shadow(1px 1px 0 black);
   	filter: drop-shadow(1px 1px 0 black);
 }
-
 [data-md-color-scheme="slate"] {
   --md-hue: 285; 
 }
+
+
+/* Custom Spacing*/
+.spacer {
+  height: 1px;
+}
\ No newline at end of file
diff --git a/docs/overrides/main.html b/docs/overrides/main.html
index 8c9334d..6d3a406 100644
--- a/docs/overrides/main.html
+++ b/docs/overrides/main.html
@@ -22,6 +22,12 @@
   <meta name="twitter:description" content="{{ config.site_description }}">
   <meta name="twitter:image" content="{{ image }}">
 {% endblock %}
+{% block announce %}
+  <!-- Add announcement here, including arbitrary HTML -->
+  {% set announcement_link = config.site_url ~ '/recipes/basic/decode-live-feed-devices/' %}
+
+  <b>Hey, Live Feed Devices support has been added in <code>v0.2.2</code>. Checkout these <a href="{{ announcement_link }}">new recipes <span class="twemoji"> {% include ".icons/material/pot-steam-outline.svg" %} </span> ➶</a></b>
+{% endblock %}
 {% block outdated %}
   You're not viewing the latest version.
   <a href="{{ '../' ~ base_url }}">
diff --git a/docs/recipes/advanced/decode-hw-acceleration.md b/docs/recipes/advanced/decode-hw-acceleration.md
new file mode 100644
index 0000000..18ba134
--- /dev/null
+++ b/docs/recipes/advanced/decode-hw-acceleration.md
@@ -0,0 +1,136 @@
+<!--
+======================================================================
+DeFFcode library source-code is deployed under the Apache 2.0 License:
+
+Copyright (c) 2021 Abhishek Thakur(@abhiTronix) <abhi.una12@gmail.com>
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+   http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+======================================================================
+-->
+
+# :octicons-cpu-16: Hardware-Accelerated Video Decoding
+
+!!! abstract "FFmpeg offer access to dedicated GPU hardware with varying support on different platforms for performing a range of video-related tasks to be completed faster or using less of other resources (particularly CPU)."
+
+> By default, DeFFcode's FFdecoder API uses the Input Source's video-decoder _(extracted using Sourcer API)_ itself for decoding its input. However, you could easily change the video-decoder to your desired specific [**supported Video-Decoder**](../../reference/ffdecoder/params/#supported-decoders) using the `-vcodec` FFmpeg option by way of its [`ffparams`](../../reference/ffdecoder/params/#ffparams) dictionary parameter. This means easy access to GPU Accelerated Hardware Decoder to get better playback and accelerated video decoding on GPUs that will generate equivalent output to software decoders, but may use less power and CPU to do so.
+
+We'll discuss its Hardware-Accelerated Video Decoding capabilities briefly in the following recipes:
+
+&thinsp;
+
+!!! warning "DeFFcode APIs requires FFmpeg executable"
+
+    ==DeFFcode APIs **MUST** requires valid FFmpeg executable for all of its core functionality==, and any failure in detection will raise `RuntimeError` immediately. Follow dedicated [FFmpeg Installation doc ➶](../../../installation/ffmpeg_install/) for its installation.
+
+???+ info "Additional Python Dependencies for following recipes"
+
+    Following recipes requires additional python dependencies which can be installed easily as below:
+
+    - [x] **OpenCV:** OpenCV is required for previewing video frames. You can easily install it directly via [`pip`](https://pypi.org/project/opencv-python/):
+
+        ??? tip "OpenCV installation from source"
+
+            You can also follow online tutorials for building & installing OpenCV on [Windows](https://www.learnopencv.com/install-opencv3-on-windows/), [Linux](https://www.pyimagesearch.com/2018/05/28/ubuntu-18-04-how-to-install-opencv/), [MacOS](https://www.pyimagesearch.com/2018/08/17/install-opencv-4-on-macos/) and [Raspberry Pi](https://www.pyimagesearch.com/2018/09/26/install-opencv-4-on-your-raspberry-pi/) machines manually from its source. 
+
+            :warning: Make sure not to install both *pip* and *source* version together. Otherwise installation will fail to work!
+
+        ??? info "Other OpenCV binaries"
+
+            OpenCV mainainers also provide additional binaries via pip that contains both main modules and contrib/extra modules [`opencv-contrib-python`](https://pypi.org/project/opencv-contrib-python/), and for server (headless) environments like [`opencv-python-headless`](https://pypi.org/project/opencv-python-headless/) and [`opencv-contrib-python-headless`](https://pypi.org/project/opencv-contrib-python-headless/). You can also install ==any one of them== in similar manner. More information can be found [here](https://github.com/opencv/opencv-python#installation-and-usage).
+
+
+        ```sh
+        pip install opencv-python       
+        ```
+
+
+!!! note "Always use FFdecoder API's [`terminate()`](../../reference/ffdecoder/#deffcode.ffdecoder.FFdecoder.terminate) method at the end to avoid undesired behavior."
+
+??? danger "Never name your python script `deffcode.py`"
+
+    When trying out these recipes, never name your python script `deffcode.py` otherwise it will result in `ModuleNotFound` error.
+
+&thinsp;
+
+## GPU-accelerated Hardware-based Video Decoding
+
+???+ alert "Example Assumptions"
+
+    **Please note that following recipe explicitly assumes:**
+
+    - You're running :fontawesome-brands-windows: Windows operating system with a [**supported NVIDIA GPU**](https://developer.nvidia.com/nvidia-video-codec-sdk).
+    - You're using FFmpeg 4.4 or newer, configured with atleast `--enable-nonfree --enable-libx264 --enable-cuda --enable-cuvid --enable-cuda-nvcc` options during compilation. For manual compilation follow [these instructions ➶](https://docs.nvidia.com/video-technologies/video-codec-sdk/ffmpeg-with-nvidia-gpu/#prerequisites)
+    - You already have appropriate Nvidia video drivers and related softwares installed on your machine.
+
+    These assumptions **MAY/MAY NOT** suit your current setup. Kindly use suitable parameters based your system platform and hardware settings only.
+
+
+In this example, we will be using Nvidia's **H.264 CUVID Video-decoder(`h264_cuvid`)** in FFdecoder API to achieve fully-accelerated hardware video decoding of **BGR24** frames from a given Video file _(say `foo.mp4`)_ on :fontawesome-brands-windows: Windows Machine, and preview them using OpenCV Library's `cv2.imshow()` method.
+
+!!! info "More information on Nvidia's CUVID can be found [here ➶](https://developer.nvidia.com/blog/nvidia-ffmpeg-transcoding-guide/)"
+
+???+ warning "Remember to check H.264 CUVID Video-decoder support in FFmpeg"
+
+    To use `h264_cuvid` decoder, remember to check if your FFmpeg compiled with H.264 CUVID decoder support. You can easily do this by executing following one-liner command in your terminal, and observing if output contains something similar as follows:
+
+    ```sh
+    $ ffmpeg  -hide_banner -decoders | grep h264 
+
+    VFS..D h264                 H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10
+    V....D h264_qsv             H264 video (Intel Quick Sync Video acceleration) (codec h264)
+    V..... h264_cuvid           Nvidia CUVID H264 decoder (codec h264)
+    ```
+
+    !!! tip "You can also use optimized HEVC CUVID Video-decoder(`hevc_cuvid`) in the similar way, if supported."
+
+
+!!! note "To learn about exclusive `-ffprefixes` parameter. See [Exclusive Parameters ➶](../../reference/ffdecoder/params/#b-exclusive-parameters)"
+
+```python
+# import the necessary packages
+from deffcode import FFdecoder
+import cv2
+
+# define suitable FFmpeg parameter
+ffparams = {
+    "-vcodec": "h264_cuvid", # CUVID H.264 Video-decoder
+    "-ffprefixes": ["-vsync", "0"],
+}
+
+# initialize and formulate the decoder with suitable source and params
+decoder = FFdecoder(
+    "foo.mp4", frame_format="bgr24", verbose=True, **ffparams
+).formulate()
+
+# grab the RGB24(default) frame from the decoder
+for frame in decoder.generateFrame():
+
+    # check if frame is None
+    if frame is None:
+        break
+
+    # Show output window
+    cv2.imshow("Output", frame)
+
+    # check for 'q' key if pressed
+    key = cv2.waitKey(1) & 0xFF
+    if key == ord("q"):
+        break
+
+# close output window
+cv2.destroyAllWindows()
+# terminate the decoder
+decoder.terminate()
+```
+
+&nbsp;
\ No newline at end of file
diff --git a/docs/recipes/advanced/decode-live-virtual-sources.md b/docs/recipes/advanced/decode-live-virtual-sources.md
new file mode 100644
index 0000000..b1adddd
--- /dev/null
+++ b/docs/recipes/advanced/decode-live-virtual-sources.md
@@ -0,0 +1,379 @@
+<!--
+======================================================================
+DeFFcode library source-code is deployed under the Apache 2.0 License:
+
+Copyright (c) 2021 Abhishek Thakur(@abhiTronix) <abhi.una12@gmail.com>
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+   http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+======================================================================
+-->
+
+# :material-file-hidden: Decoding Live Virtual Sources
+
+> Instead of using prerecorded video files as streams, DeFFcode's FFdecoder API with the help of powerful [`lavfi`](http://underpop.online.fr/f/ffmpeg/help/lavfi.htm.gz) _(**Libavfilter** input virtual device)_ source that reads data from the open output pads of a libavfilter filtergraph, is also capable of creating virtual video frames out of thin air in real-time, which you might want to use as input for testing, compositing, and merging with other streams to obtain desired output on-the-fly. 
+
+We'll discuss the recipies for generating Live Fake Sources briefly below:
+
+&thinsp;
+
+!!! warning "DeFFcode APIs requires FFmpeg executable"
+
+    ==DeFFcode APIs **MUST** requires valid FFmpeg executable for all of its core functionality==, and any failure in detection will raise `RuntimeError` immediately. Follow dedicated [FFmpeg Installation doc ➶](../../../installation/ffmpeg_install/) for its installation.
+
+???+ info "Additional Python Dependencies for following recipes"
+
+    Following recipes requires additional python dependencies which can be installed easily as below:
+
+    - [x] **OpenCV:** OpenCV is required for previewing video frames. You can easily install it directly via [`pip`](https://pypi.org/project/opencv-python/):
+
+        ??? tip "OpenCV installation from source"
+
+            You can also follow online tutorials for building & installing OpenCV on [Windows](https://www.learnopencv.com/install-opencv3-on-windows/), [Linux](https://www.pyimagesearch.com/2018/05/28/ubuntu-18-04-how-to-install-opencv/), [MacOS](https://www.pyimagesearch.com/2018/08/17/install-opencv-4-on-macos/) and [Raspberry Pi](https://www.pyimagesearch.com/2018/09/26/install-opencv-4-on-your-raspberry-pi/) machines manually from its source. 
+
+            :warning: Make sure not to install both *pip* and *source* version together. Otherwise installation will fail to work!
+
+        ??? info "Other OpenCV binaries"
+
+            OpenCV mainainers also provide additional binaries via pip that contains both main modules and contrib/extra modules [`opencv-contrib-python`](https://pypi.org/project/opencv-contrib-python/), and for server (headless) environments like [`opencv-python-headless`](https://pypi.org/project/opencv-python-headless/) and [`opencv-contrib-python-headless`](https://pypi.org/project/opencv-contrib-python-headless/). You can also install ==any one of them== in similar manner. More information can be found [here](https://github.com/opencv/opencv-python#installation-and-usage).
+
+
+        ```sh
+        pip install opencv-python       
+        ```
+
+
+!!! note "Always use FFdecoder API's [`terminate()`](../../reference/ffdecoder/#deffcode.ffdecoder.FFdecoder.terminate) method at the end to avoid undesired behavior."
+
+??? danger "Never name your python script `deffcode.py`"
+
+    When trying out these recipes, never name your python script `deffcode.py` otherwise it will result in `ModuleNotFound` error.
+
+&thinsp;
+
+## Generate and Decode frames from Sierpinski pattern
+
+> The [`sierpinski`](https://ffmpeg.org/ffmpeg-filters.html#toc-sierpinski) graph generates a Sierpinski carpet/triangle fractal, and randomly pan around by a single pixel each frame.
+
+<figure markdown>
+  ![sierpinski pattern](../../../assets/gifs/sierpinski.gif){ width="500" }
+  <figcaption>Sierpinski carpet fractal</figcaption>
+</figure>
+
+In this example we will generate and decode 8 seconds of a **Sierpinski carpet fractal pattern** of `1280x720` frame size and `30` framerate using [`sierpinski`](https://ffmpeg.org/ffmpeg-filters.html#toc-sierpinski) graph source with `lavfi` input virtual device in FFdecoder API, and preview decoded frames using OpenCV Library's `cv2.imshow()` method in real-time. 
+
+!!! alert "By default, OpenCV expects `BGR` format frames in its `cv2.imshow()` method."
+
+```python
+# import the necessary packages
+from deffcode import FFdecoder
+import cv2
+
+# playback time of 8 seconds
+ffparams = {"-ffprefixes": ["-t", "8"]}
+
+# initialize and formulate the decoder with "sierpinski" source of
+# `1280x720` frame size and `30` framerate for BGR24 output
+decoder = FFdecoder(
+    "sierpinski=size=1280x720:rate=30",
+    source_demuxer="lavfi",
+    frame_format="bgr24",
+    **ffparams
+).formulate()
+
+# grab the BGR24 frame from the decoder
+for frame in decoder.generateFrame():
+
+    # check if frame is None
+    if frame is None:
+        break
+
+    # {do something with the frame here}
+
+    # Show output window
+    cv2.imshow("Output", frame)
+
+    # check for 'q' key if pressed
+    key = cv2.waitKey(1) & 0xFF
+    if key == ord("q"):
+        cv2.imwrite('foo_image.gif', frame)
+        break
+
+# close output window
+cv2.destroyAllWindows()
+
+# terminate the decoder
+decoder.terminate()
+```
+
+&nbsp;
+
+## Generate and Decode frames from Test Source pattern
+
+> The [`testsrc`](https://ffmpeg.org/ffmpeg-filters.html#toc-allrgb_002c-allyuv_002c-color_002c-colorchart_002c-colorspectrum_002c-haldclutsrc_002c-nullsrc_002c-pal75bars_002c-pal100bars_002c-rgbtestsrc_002c-smptebars_002c-smptehdbars_002c-testsrc_002c-testsrc2_002c-yuvtestsrc) graph generates a test video pattern showing a color pattern, a scrolling gradient, and a timestamp. This is useful for testing purposes.
+
+<figure markdown>
+  ![testsrc pattern](../../../assets/gifs/testsrc.gif){ width="500" }
+  <figcaption>Test Source pattern</figcaption>
+</figure>
+
+In this example we will generate and decode `10` seconds of a **Test Source pattern** _(`1280x720` frame size & `30` framerate)_ using [`testsrc`](https://ffmpeg.org/ffmpeg-filters.html#toc-allrgb_002c-allyuv_002c-color_002c-colorchart_002c-colorspectrum_002c-haldclutsrc_002c-nullsrc_002c-pal75bars_002c-pal100bars_002c-rgbtestsrc_002c-smptebars_002c-smptehdbars_002c-testsrc_002c-testsrc2_002c-yuvtestsrc) graph source with `lavfi` input virtual device in FFdecoder API, all while previewing decoded frames using OpenCV Library's `cv2.imshow()` method in real-time. 
+
+!!! alert "By default, OpenCV expects `BGR` format frames in its `cv2.imshow()` method."
+
+```python
+# import the necessary packages
+from deffcode import FFdecoder
+import cv2
+
+# define parameters
+ffparams = {
+    "-ffprefixes": ["-t", "10"],  # playback time of 10 seconds
+}
+
+# initialize and formulate the decoder with "testsrc" source of
+# `1280x720` frame size and `30` framerate for BGR24 output
+decoder = FFdecoder(
+    "testsrc=size=1280x720:rate=30",
+    source_demuxer="lavfi",
+    frame_format="bgr24",
+    **ffparams
+).formulate()
+
+# grab the BGR24 frame from the decoder
+for frame in decoder.generateFrame():
+
+    # check if frame is None
+    if frame is None:
+        break
+
+    # {do something with the frame here}
+
+    # Show output window
+    cv2.imshow("Output", frame)
+
+    # check for 'q' key if pressed
+    key = cv2.waitKey(1) & 0xFF
+    if key == ord("q"):
+        break
+
+# close output window
+cv2.destroyAllWindows()
+
+# terminate the decoder
+decoder.terminate()
+```
+
+&nbsp;
+
+
+## Generate and Decode frames from Gradients with custom Text effect
+
+> The [`gradients`](https://ffmpeg.org/ffmpeg-filters.html#toc-gradients) graph (as name suggests) generates several random gradients.
+
+<figure markdown>
+  ![gradients test pattern](../../../assets/gifs/gradients.gif){ width="500" }
+  <figcaption>Gradients pattern with real-time text output</figcaption>
+</figure>
+
+In this example we will generate and decode `15` seconds of **Gradients** using [`gradients`](https://ffmpeg.org/ffmpeg-filters.html#toc-gradients) graph source with `lavfi` input virtual device and also draw real-time text output _(format `HH::MM::SS`)_ scrolling upward direction on it using [`drawtext`](https://ffmpeg.org/ffmpeg-filters.html#toc-drawtext-1) filter in FFdecoder API, all while previewing decoded frames using OpenCV Library's `cv2.imshow()` method in real-time. 
+
+!!! warning "This example assumes you're running :fontawesome-brands-windows: Windows machine. If not, then change `fontfile` parameter path in `drawtext` video filtergraph definition accordingly." 
+
+!!! alert "By default, OpenCV expects `BGR` format frames in its `cv2.imshow()` method."
+
+```python
+# import the necessary packages
+from deffcode import FFdecoder
+import cv2
+
+# define parameters
+ffparams = {
+    "-ffprefixes": ["-t", "15"],  # playback time of 15 seconds
+    "-vf": "drawtext="  # draw text
+    + "text='%{localtime\:%X}':"  # real time text (HH::MM::SS)
+    + "fontfile='c\:\/windows\/fonts\/arial.ttf':"  # fontfile path (Only Windows)
+    + "x=(w-text_w)/2:y=h-40*t:"  # scroll upward effect
+    + "fontsize=50:"  # font size 50
+    + "fontcolor=white",  # font color white
+}
+
+
+# initialize and formulate the decoder with 
+# "gradients" source for BGR24 output
+decoder = FFdecoder(
+    "gradients=n=3",
+    source_demuxer="lavfi",
+    frame_format="bgr24",
+    **ffparams
+).formulate()
+
+# grab the BGR24 frame from the decoder
+for frame in decoder.generateFrame():
+
+    # check if frame is None
+    if frame is None:
+        break
+
+    # {do something with the frame here}
+
+    # Show output window
+    cv2.imshow("Output", frame)
+
+    # check for 'q' key if pressed
+    key = cv2.waitKey(1) & 0xFF
+    if key == ord("q"):
+        break
+
+# close output window
+cv2.destroyAllWindows()
+
+# terminate the decoder
+decoder.terminate()
+```
+
+&nbsp;
+
+
+## Generate and Decode frames from Mandelbrot test pattern with vectorscope & waveforms
+
+> The [`mandelbrot`](https://ffmpeg.org/ffmpeg-filters.html#toc-mandelbrot) graph generate a [**Mandelbrot set fractal**](https://en.wikipedia.org/wiki/Mandelbrot_set), that progressively zoom towards a specfic point.
+
+<figure markdown>
+  ![mandelbrot test pattern](../../../assets/gifs/mandelbrot_vectorscope_waveforms.gif){ width="500" }
+  <figcaption>Mandelbrot pattern with a Vectorscope & two Waveforms</figcaption>
+</figure>
+
+
+In this example we will generate and decode `20` seconds of a **Mandelbrot test pattern** _(`1280x720` frame size & `30` framerate)_ using [`mandelbrot`](https://ffmpeg.org/ffmpeg-filters.html#toc-mandelbrot) graph source with `lavfi` input virtual device with a [vectorscope](https://www.studiobinder.com/blog/what-is-a-vectorscope-definition/) _(plots 2 color component values)_ & two [waveforms](https://ffmpeg.org/ffmpeg-filters.html#toc-waveform) _(plots YUV color component intensity)_ stacked to it in FFdecoder API, all while previewing decoded frames using OpenCV Library's `cv2.imshow()` method in real-time. 
+
+!!! alert "By default, OpenCV expects `BGR` format frames in its `cv2.imshow()` method."
+
+```python
+# import the necessary packages
+from deffcode import FFdecoder
+import cv2
+
+# define parameters
+ffparams = {
+    "-ffprefixes": ["-t", "20"],  # playback time of 20 seconds
+    "-vf": "format=yuv444p," # change input format to yuv444p
+    + "split=4[a][b][c][d]," # split input into 4 identical outputs.
+    + "[a]waveform[aa],"  # apply waveform on first output
+    + "[b][aa]vstack[V],"  # vertical stack 2nd output with waveform [V]
+    + "[c]waveform=m=0[cc],"  # apply waveform on 3rd output
+    + "[d]vectorscope=color4[dd],"  # apply vectorscope on 4th output
+    + "[cc][dd]vstack[V2],"  # vertical stack waveform and vectorscope [V2]
+    + "[V][V2]hstack",  # horizontal stack [V] and [V2] vertical stacks
+}
+
+# initialize and formulate the decoder with "mandelbrot" source of
+# `1280x720` frame size and `30` framerate for BGR24 output
+decoder = FFdecoder(
+    "mandelbrot=size=1280x720:rate=30",
+    source_demuxer="lavfi",
+    frame_format="bgr24",
+    **ffparams
+).formulate()
+
+# grab the BGR24 frame from the decoder
+for frame in decoder.generateFrame():
+
+    # check if frame is None
+    if frame is None:
+        break
+
+    # {do something with the frame here}
+
+    # Show output window
+    cv2.imshow("Output", frame)
+
+    # check for 'q' key if pressed
+    key = cv2.waitKey(1) & 0xFF
+    if key == ord("q"):
+        break
+
+# close output window
+cv2.destroyAllWindows()
+
+# terminate the decoder
+decoder.terminate()
+```
+
+&nbsp;
+
+## Generate and Decode frames from Game of Life Visualization
+
+> The [`life`](https://ffmpeg.org/ffmpeg-filters.html#toc-life) graph generates a life pattern based on a generalization of John Conway’s life game. The sourced input represents a life grid, each pixel represents a cell which can be in one of two possible states, alive or dead. Every cell interacts with its eight neighbours, which are the cells that are horizontally, vertically, or diagonally adjacent. At each interaction the grid evolves according to the adopted rule, which specifies the number of neighbor alive cells which will make a cell stay alive or born.
+
+<figure markdown>
+  ![life pattern](../../../assets/gifs/life.gif){ width="500" }
+  <figcaption>Game of Life Visualization</figcaption>
+</figure>
+
+In this example we will generate and decode `25` seconds of **Game of Life Visualization**  using [`life`](https://ffmpeg.org/ffmpeg-filters.html#toc-life) graph source with `lavfi` input virtual device in FFdecoder API, all while previewing decoded frames using OpenCV Library's `cv2.imshow()` method in real-time. 
+
+
+
+!!! alert "By default, OpenCV expects `BGR` format frames in its `cv2.imshow()` method."
+
+```python
+# import the necessary packages
+from deffcode import FFdecoder
+import cv2
+
+# define parameters
+ffparams = {
+    "-ffprefixes": ["-t", "25"],  # playback time of 25 seconds
+}
+
+# initialize and formulate the decoder with "life" source for BGR24 output
+decoder = FFdecoder(
+    "life="  # life graph
+    + "s=640x480:"  # grid size (in pixels)
+    + "mold=10:"  # cell mold speed
+    + "r=36:"  # framerate
+    + "ratio=0.5:"  # random fill ratio for the initial random grid
+    + "death_color=#39FF14:"  # color of dead cells
+    + "life_color=#1d1160" # color of living (or new born) cells
+    + ",scale=640:480:" # frame size
+    + "flags=16",
+    source_demuxer="lavfi",
+    frame_format="bgr24",
+    **ffparams
+).formulate()
+
+# grab the BGR24 frame from the decoder
+for frame in decoder.generateFrame():
+
+    # check if frame is None
+    if frame is None:
+        break
+
+    # {do something with the frame here}
+
+    # Show output window
+    cv2.imshow("Output", frame)
+
+    # check for 'q' key if pressed
+    key = cv2.waitKey(1) & 0xFF
+    if key == ord("q"):
+        break
+
+# close output window
+cv2.destroyAllWindows()
+
+# terminate the decoder
+decoder.terminate()
+```
+
+&nbsp;
\ No newline at end of file
diff --git a/docs/recipes/advanced/index.md b/docs/recipes/advanced/index.md
new file mode 100644
index 0000000..421c168
--- /dev/null
+++ b/docs/recipes/advanced/index.md
@@ -0,0 +1,89 @@
+<!--
+===============================================
+DeFFcode library source-code is deployed under the Apache 2.0 License:
+
+Copyright (c) 2021 Abhishek Thakur(@abhiTronix) <abhi.una12@gmail.com>
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+   http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+===============================================
+-->
+
+# Advanced Recipes :croissant:
+
+
+The following challenging recipes will take your skills to the next level and will give access to new DeFFcode techniques, tricky examples, and advanced FFmpeg parameters:
+
+<figure>
+<img src="https://c.tenor.com/x-5ZtqDFt6sAAAAC/challenge-accepted-let-the-challenge-commence.gif" loading="lazy" alt="challenge-accepted-let-the-challenge-commence" />
+<figcaption>Courtesy - <a href="https://tenor.com/view/challenge-accepted-let-the-challenge-commence-elmo-on-fire-flaming-gif-17013941">tenor</a></figcaption>
+</figure>
+
+
+!!! alert "Refer Basic Recipes first!"
+
+    If you're just getting started, check out the Beginner's [**Basic Recipes :cake:**](../basic) first before trying these advanced recipes.
+
+??? tip "Any proficiency with OpenCV-Python will be Helpful"
+    
+    Any proficiency with [**OpenCV-Python**](https://docs.opencv.org/4.x/d6/d00/tutorial_py_root.html) _(Python API for OpenCV)_ surely help you with these recipes. 
+
+??? question "Wanna suggest any improvements or additional recipes?"
+
+    Please feel free to suggest any improvements or additional recipes on our [**Gitter community channel ➶**][gitter]
+
+
+&thinsp;
+
+## Advanced :material-movie-play: Decoding Recipes
+
+- [x] **[:material-file-hidden: Decoding Live Virtual Sources](../advanced/decode-live-virtual-sources/#decoding-live-virtual-sources)**
+    - [Generate and Decode frames from Sierpinski pattern](../advanced/decode-live-virtual-sources/#generate-and-decode-frames-from-sierpinski-pattern)
+    - [Generate and Decode frames from Test Source pattern](../advanced/decode-live-virtual-sources/#generate-and-decode-frames-from-test-source-pattern)
+    - [Generate and Decode frames from Gradients with custom Text effect](../advanced/decode-live-virtual-sources/#generate-and-decode-frames-from-gradients-with-custom-text-effect)
+    - [Generate and Decode frames from Mandelbrot test pattern with vectorscope & waveforms](../advanced/decode-live-virtual-sources/#generate-and-decode-frames-from-mandelbrot-test-pattern-with-vectorscope-waveforms)
+    - [Generate and Decode frames from Game of Life Visualization](../advanced/decode-live-virtual-sources/#generate-and-decode-frames-from-game-of-life-visualization)
+- [x] **[:octicons-cpu-16: Hardware-Accelerated Video Decoding](../advanced/decode-hw-acceleration/#hardware-accelerated-video-decoding)**
+    - [GPU-accelerated Hardware-based Video Decoding](../advanced/decode-hw-acceleration/#gpu-accelerated-hardware-based-video-decoding)
+
+<div class="spacer"></div>
+
+## Advanced :material-movie-edit: Transcoding Recipes
+
+- [x] **[:fontawesome-solid-wand-magic-sparkles: Transcoding Live Complex Filtergraphs](../advanced/transcode-live-frames-complexgraphs/#transcoding-live-complex-filtergraphs)**
+    - [Transcoding video with Live Custom watermark image overlay](../advanced/transcode-live-frames-complexgraphs/#transcoding-video-with-live-custom-watermark-image-overlay)
+    - [Transcoding video from sequence of Images with additional filtering](../advanced/transcode-live-frames-complexgraphs/#transcoding-video-from-sequence-of-images-with-additional-filtering)
+- [x] **[:fontawesome-solid-paintbrush: Transcoding Video Art with Filtergraphs](../advanced/transcode-art-filtergraphs/#transcoding-video-art-with-filtergraphs)**
+    - [Transcoding video art with YUV Bitplane Visualization](../advanced/transcode-art-filtergraphs/#transcoding-video-art-with-yuv-bitplane-visualization)
+    - [Transcoding video art with Jetcolor effect](../advanced/transcode-art-filtergraphs/#transcoding-video-art-with-jetcolor-effect) 
+    - [Transcoding video art with Ghosting effect](../advanced/transcode-art-filtergraphs/#transcoding-video-art-with-ghosting-effect)
+    - [Transcoding video art with Pixelation effect](../advanced/transcode-art-filtergraphs/#transcoding-video-art-with-pixelation-effect)
+- [x] **[:fontawesome-solid-microchip: Hardware-Accelerated Video Transcoding](../advanced/transcode-hw-acceleration/#hardware-accelerated-video-transcoding)**
+    - [GPU-accelerated Hardware-based Video Transcoding with WriteGear API](../advanced/transcode-hw-acceleration/#gpu-accelerated-hardware-based-video-transcoding-with-writegear-api)
+
+<div class="spacer"></div>
+
+## Advanced :material-movie-search: Metadata Recipes
+
+- [x] **[:material-cog-refresh: Updating Video Metadata](../advanced/update-metadata/#updating-video-metadata)**
+    - [Added new attributes to metadata in FFdecoder API](../advanced/update-metadata/#added-new-attributes-to-metadata-in-ffdecoder-api)
+    - [Overriding source video metadata in FFdecoder API](../advanced/update-metadata/#overriding-source-video-metadata-in-ffdecoder-api)
+
+
+&thinsp;
+
+
+<!--
+External URLs
+-->
+[gitter]: https://gitter.im/deffcode-python/community
+[ffmpeg]:https://www.ffmpeg.org/
\ No newline at end of file
diff --git a/docs/recipes/advanced/transcode-art-filtergraphs.md b/docs/recipes/advanced/transcode-art-filtergraphs.md
new file mode 100644
index 0000000..cedb1f2
--- /dev/null
+++ b/docs/recipes/advanced/transcode-art-filtergraphs.md
@@ -0,0 +1,363 @@
+<!--
+======================================================================
+DeFFcode library source-code is deployed under the Apache 2.0 License:
+
+Copyright (c) 2021 Abhishek Thakur(@abhiTronix) <abhi.una12@gmail.com>
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+   http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+======================================================================
+-->
+
+# :fontawesome-solid-paintbrush: Transcoding Video Art with Filtergraphs
+
+??? abstract "What are Simple filtergraphs?"
+
+    Before heading straight into recipes we will talk about Simple filtergraphs: 
+    
+    > Simple filtergraphs are those filters that have exactly one input and output, both of the same type. 
+
+    They can be processed by simply inserting an additional step between decoding and encoding of video frames:
+
+    ![Simple filtergraphs](../../../assets/images/simplefiltergraphs.png){ loading=lazy }
+
+    Simple filtergraphs are configured with the per-stream `-filter` option _(with `-vf` for video)_. 
+
+
+> DeFFcode's FFdecoder API unlocks the power of ffmpeg backend for creating real-time artistic generative video art using simple and complex filtergraphs, and decoding them into live video frames. 
+
+We'll discuss the Transcoding Video Art with Filtergraphs in the following recipes:
+
+&thinsp;
+
+
+!!! warning "DeFFcode APIs requires FFmpeg executable"
+
+    ==DeFFcode APIs **MUST** requires valid FFmpeg executable for all of its core functionality==, and any failure in detection will raise `RuntimeError` immediately. Follow dedicated [FFmpeg Installation doc ➶](../../installation/ffmpeg_install/) for its installation.
+
+???+ info "Additional Python Dependencies for following recipes"
+
+    Following recipes requires additional python dependencies which can be installed easily as below:
+
+    - [x] **OpenCV:** OpenCV is required for previewing and encoding video frames. You can easily install it directly via [`pip`](https://pypi.org/project/opencv-python/):
+
+        ??? tip "OpenCV installation from source"
+
+            You can also follow online tutorials for building & installing OpenCV on [Windows](https://www.learnopencv.com/install-opencv3-on-windows/), [Linux](https://www.pyimagesearch.com/2018/05/28/ubuntu-18-04-how-to-install-opencv/), [MacOS](https://www.pyimagesearch.com/2018/08/17/install-opencv-4-on-macos/) and [Raspberry Pi](https://www.pyimagesearch.com/2018/09/26/install-opencv-4-on-your-raspberry-pi/) machines manually from its source. 
+
+            :warning: Make sure not to install both *pip* and *source* version together. Otherwise installation will fail to work!
+
+        ??? info "Other OpenCV binaries"
+
+            OpenCV mainainers also provide additional binaries via pip that contains both main modules and contrib/extra modules [`opencv-contrib-python`](https://pypi.org/project/opencv-contrib-python/), and for server (headless) environments like [`opencv-python-headless`](https://pypi.org/project/opencv-python-headless/) and [`opencv-contrib-python-headless`](https://pypi.org/project/opencv-contrib-python-headless/). You can also install ==any one of them== in similar manner. More information can be found [here](https://github.com/opencv/opencv-python#installation-and-usage).
+
+
+        ```sh
+        pip install opencv-python       
+        ```
+
+    - [x] **VidGear:** VidGear is required for lossless encoding of video frames into file/stream. You can easily install it directly via [`pip`](https://pypi.org/project/opencv-python/):
+
+        ```sh
+        pip install vidgear[core]       
+        ```
+
+
+!!! note "Always use FFdecoder API's [`terminate()`](../../reference/ffdecoder/#deffcode.ffdecoder.FFdecoder.terminate) method at the end to avoid undesired behavior."
+
+
+!!! danger "==WriteGear's Compression Mode support for FFdecoder API is currently in beta so you can expect much higher than usual CPU utilization!=="
+
+&thinsp;
+
+## Transcoding video art with YUV Bitplane Visualization
+
+> Based on the QCTools bitplane visualization, this video art has numerical values ranging between `-1`(no change) and `10`(noisiest) for the `Y` _(luminance)_, `U` and `V` _(chroma or color difference)_ planes, yielding cool and different results for different values.
+
+<figure markdown>
+  ![Bitplane Visualization](../../../assets/gifs/bitplane_visualization.gif)
+  <figcaption>YUV Bitplane Visualization</figcaption>
+</figure>
+
+!!! quote "This Video Art idea credits goes to [ffmpeg-artschool](https://amiaopensource.github.io/ffmpeg-artschool/) - An AMIA workshop featuring scripts, exercises, and activities to make art using FFmpeg."
+
+In this example we will generate 8 seconds of **Bitplane Visualization** by binding the bit position of the `Y`, `U`, and `V` planes of a video file _(say `foo.mp4`)_ by using FFmpeg's [`lutyuv`](https://ffmpeg.org/ffmpeg-filters.html#toc-lut_002c-lutrgb_002c-lutyuv) filter and assigning them random values _(between `-1`(no change) and `10`(noisiest))_, and decode live **BGR24** video frames in FFdecoder API. We'll also be encoding those decoded frames in real-time into lossless video file using WriteGear API with controlled framerate.
+
+```python
+# import the necessary packages
+from deffcode import FFdecoder
+from vidgear.gears import WriteGear
+import cv2, json
+
+# define Video Filter definition
+ffparams = {
+    "-ffprefixes": ["-t", "8"],  # playback time of 8 seconds
+    "-vf": "format=yuv444p," # change input format to yuv444p
+    + "lutyuv="  # use  lutyuv filter for binding bit position of the Y, U, and V planes
+    + "y=if(eq({y}\,-1)\,512\,if(eq({y}\,0)\,val\,bitand(val\,pow(2\,10-{y}))*pow(2\,{y}))):".format(
+        y=3 # define `Y` (luminance) plane value (b/w -1 and 10)
+    )
+    + "u=if(eq({u}\,-1)\,512\,if(eq({u}\,0)\,val\,bitand(val\,pow(2\,10-{u}))*pow(2\,{u}))):".format(
+        u=1 # define `U` (chroma or color difference) plane value (b/w -1 and 10)
+    )
+    + "v=if(eq({v}\,-1)\,512\,if(eq({v}\,0)\,val\,bitand(val\,pow(2\,10-{v}))*pow(2\,{v}))),".format(
+        v=3 # define `V` (chroma or color difference) plane value (b/w -1 and 10)
+    )
+    + "format=yuv422p10le", # change output format to yuv422p10le
+}
+
+# initialize and formulate the decoder with suitable source
+decoder = FFdecoder("foo.mp4", frame_format="bgr24", verbose=True, **ffparams).formulate()
+
+# retrieve framerate from source JSON Metadata and pass it as `-input_framerate`
+# parameter for controlled framerate and define other parameters
+output_params = {
+    "-input_framerate": json.loads(decoder.metadata)["source_video_framerate"],
+}
+
+# Define writer with default parameters and suitable
+# output filename for e.g. `output_foo.mp4`
+writer = WriteGear(output_filename="output_foo.mp4", logging=True, **output_params)
+
+# grab the BGR24 frame from the decoder
+for frame in decoder.generateFrame():
+
+    # check if frame is None
+    if frame is None:
+        break
+
+    # {do something with the frame here}
+
+    # writing BGR24 frame to writer
+    writer.write(frame)
+
+# terminate the decoder
+decoder.terminate()
+
+# safely close writer
+writer.close()
+```
+
+&nbsp;
+
+
+## Transcoding video art with Jetcolor effect 
+
+> This video art uses FFmpeg's [`pseudocolor`](https://ffmpeg.org/ffmpeg-filters.html#toc-pseudocolor) filter to create a **Jetcolor effect** which is high contrast, high brightness, and high saturation colormap that ranges from blue to red, and passes through the colors cyan, yellow, and orange. The jet colormap is associated with an astrophysical fluid jet simulation from the National Center for Supercomputer Applications. 
+
+<figure markdown>
+  ![Jetcolor effect](../../../assets/gifs/jetcolor_effect.gif)
+  <figcaption>Jetcolor effect</figcaption>
+</figure>
+
+!!! quote "This Video Art idea credits goes to [ffmpeg-artschool](https://amiaopensource.github.io/ffmpeg-artschool/) - An AMIA workshop featuring scripts, exercises, and activities to make art using FFmpeg."
+
+In this example we will generate 8 seconds of **Jetcolor effect** by changing frame colors of a video file _(say `foo.mp4`)_ using  FFmpeg's [`pseudocolor`](https://ffmpeg.org/ffmpeg-filters.html#toc-pseudocolor) filter in different modes _(values between `0` (cleaner) **[default]** and `2`(noisiest))_, and decode live **BGR24** video frames in FFdecoder API. We'll also be encoding those decoded frames in real-time into lossless video file using WriteGear API with controlled framerate.
+
+```python
+# import the necessary packages
+from deffcode import FFdecoder
+from vidgear.gears import WriteGear
+import cv2, json
+
+# define Video Filter definition
+ffparams = {
+    "-ffprefixes": ["-t", "8"],  # playback time of 8 seconds
+    "-vf": "format=yuv444p,"  # change input format to `yuv444p`
+    + "eq=brightness=0.40:saturation=8,"  # default `brightness = 0.40` and `saturation=8`
+    + "pseudocolor='"  # dynamically controlled colors through `pseudocolor` filter
+    + "if(between(val,0,85),lerp(45,159,(val-0)/(85-0)),"
+    + "if(between(val,85,170),lerp(159,177,(val-85)/(170-85)),"
+    + "if(between(val,170,255),lerp(177,70,(val-170)/(255-170))))):"  # mode 0 (cleaner) [default]
+    + "if(between(val,0,85),lerp(205,132,(val-0)/(85-0)),"
+    + "if(between(val,85,170),lerp(132,59,(val-85)/(170-85)),"
+    + "if(between(val,170,255),lerp(59,100,(val-170)/(255-170))))):"  # mode 1
+    + "if(between(val,0,85),lerp(110,59,(val-0)/(85-0)),"
+    + "if(between(val,85,170),lerp(59,127,(val-85)/(170-85)),"
+    + "if(between(val,170,255),lerp(127,202,(val-170)/(255-170))))):"  # mode 2 (noisiest)
+    + "i={mode}',".format(
+        mode=0  # define mode value (b/w `0` and `2`) to control colors
+    )
+    + "format=yuv422p10le",  # change output format to `yuv422p10le`
+}
+
+# initialize and formulate the decoder with suitable source
+decoder = FFdecoder(
+    "foo.mp4", frame_format="bgr24", verbose=True, **ffparams
+).formulate()
+
+# retrieve framerate from source JSON Metadata and pass it as `-input_framerate`
+# parameter for controlled framerate and define other parameters
+output_params = {
+    "-input_framerate": json.loads(decoder.metadata)["source_video_framerate"],
+}
+
+# Define writer with default parameters and suitable
+# output filename for e.g. `output_foo.mp4`
+writer = WriteGear(output_filename="output_foo.mp4", logging=True, **output_params)
+
+# grab the BGR24 frame from the decoder
+for frame in decoder.generateFrame():
+
+    # check if frame is None
+    if frame is None:
+        break
+
+    # {do something with the frame here}
+
+    # writing BGR24 frame to writer
+    writer.write(frame)
+
+# terminate the decoder
+decoder.terminate()
+
+# safely close writer
+writer.close()
+```
+
+&nbsp;
+
+
+## Transcoding video art with Ghosting effect
+
+> This video art using FFmpeg’s [`lagfun`](https://ffmpeg.org/ffmpeg-filters.html#toc-lagfun) filter to create a video echo/ghost/trailing effect.
+
+<figure markdown>
+  ![Ghosting effect](../../../assets/gifs/ghosting_effect.gif)
+  <figcaption>Ghosting effect</figcaption>
+</figure>
+
+!!! quote "This Video Art idea credits goes to [ffmpeg-artschool](https://amiaopensource.github.io/ffmpeg-artschool/) - An AMIA workshop featuring scripts, exercises, and activities to make art using FFmpeg."
+
+In this example we will generate 8 seconds of **Ghosting effect** using FFmpeg's [`lagfun`](https://ffmpeg.org/ffmpeg-filters.html#toc-lagfun) filter on a video file _(say `foo.mp4`)_, and decode live **BGR24** video frames in FFdecoder API. We'll also be encoding those decoded frames in real-time into lossless video file using WriteGear API with controlled framerate.
+
+```python
+# import the necessary packages
+from deffcode import FFdecoder
+from vidgear.gears import WriteGear
+import cv2, json
+
+# define Video Filter definition
+ffparams = {
+    "-ffprefixes": ["-t", "8"],  # playback time of 8 seconds
+    "-filter_complex": "format=yuv444p[formatted];"  # change video input format to yuv444p
+    + "[formatted]split[a][b];"  # split input into 2 identical outputs
+    + "[a]lagfun=decay=.99:planes=1[a];"  # apply lagfun filter on first output
+    + "[b]lagfun=decay=.98:planes=2[b];"  # apply lagfun filter on 2nd output
+    + "[a][b]blend=all_mode=screen:c0_opacity=.5:c1_opacity=.5,"  # apply screen blend mode both outputs
+    + "format=yuv422p10le[out]",  # change output format to yuv422p10le
+    "-map": "[out]",  # map the output
+}
+
+# initialize and formulate the decoder with suitable source
+decoder = FFdecoder(
+    "foo.mp4", frame_format="bgr24", verbose=True, **ffparams
+).formulate()
+
+# retrieve framerate from source JSON Metadata and pass it as `-input_framerate`
+# parameter for controlled framerate and define other parameters
+output_params = {
+    "-input_framerate": json.loads(decoder.metadata)["source_video_framerate"],
+}
+
+# Define writer with default parameters and suitable
+# output filename for e.g. `output_foo.mp4`
+writer = WriteGear(output_filename="output_foo.mp4", logging=True, **output_params)
+
+# grab the BGR24 frame from the decoder
+for frame in decoder.generateFrame():
+
+    # check if frame is None
+    if frame is None:
+        break
+
+    # {do something with the frame here}
+
+    # writing BGR24 frame to writer
+    writer.write(frame)
+
+# terminate the decoder
+decoder.terminate()
+
+# safely close writer
+writer.close()
+```
+
+&nbsp;
+
+
+## Transcoding video art with Pixelation effect
+
+> This video art uses FFmpeg’s `overlay`, `smartblur` and stacks of `dilation` filters to intentionally Pixelate your video in artistically cool looking ways such that each pixel become visible to the naked eye.
+
+<figure markdown>
+  ![Pixelation effect](../../../assets/gifs/pixelation_effect.gif)
+  <figcaption>Pixelation effect</figcaption>
+</figure>
+
+!!! quote "This Video Art idea credits goes to [oioiiooixiii blogspot](https://oioiiooixiii.blogspot.com/2018/04/ffmpeg-colour-animation-from-macroblock.html)."
+
+In this example we will generate 8 seconds of **Pixelation effect** using FFmpeg’s `smartblur` and stacks of `dilation` filters overlayed on a video file _(say `foo.mp4`)_, and decode live **BGR24** video frames in FFdecoder API. We'll also be encoding those decoded frames in real-time into lossless video file using WriteGear API with controlled framerate.
+
+```python
+# import the necessary packages
+from deffcode import FFdecoder
+from vidgear.gears import WriteGear
+import cv2, json
+
+# define Video Filter definition
+ffparams = {
+    "-ffprefixes": ["-t", "8"],  # playback time of 8 seconds
+    "-vf": "format=yuv444p,"  # change input format to yuv444p
+    + "split [out1][out2];"  # split input into 2 identical outputs
+    + "[out1][out2] overlay,smartblur,"  # apply overlay,smartblur filter on both outputs
+    + "dilation,dilation,dilation,dilation,dilation,"  # apply stacks of dilation filters on both outputs
+    + "eq=contrast=1.4:brightness=-0.09 [pixels];"  # change brightness and contrast
+    + "[pixels]format=yuv422p10le[out]",  # change output format to yuv422p10le
+    "-mode": "[out]",  # map the output
+}
+
+# initialize and formulate the decoder with suitable source
+decoder = FFdecoder(
+    "foo.mp4", frame_format="bgr24", verbose=True, **ffparams
+).formulate()
+
+# retrieve framerate from source JSON Metadata and pass it as `-input_framerate`
+# parameter for controlled framerate and define other parameters
+output_params = {
+    "-input_framerate": json.loads(decoder.metadata)["source_video_framerate"],
+}
+
+# Define writer with default parameters and suitable
+# output filename for e.g. `output_foo.mp4`
+writer = WriteGear(output_filename="output_foo.mp4", logging=True, **output_params)
+
+# grab the BGR24 frame from the decoder
+for frame in decoder.generateFrame():
+
+    # check if frame is None
+    if frame is None:
+        break
+
+    # {do something with the frame here}
+
+    # writing BGR24 frame to writer
+    writer.write(frame)
+
+# terminate the decoder
+decoder.terminate()
+
+# safely close writer
+writer.close()
+```
+
+&nbsp;
diff --git a/docs/recipes/advanced/transcode-hw-acceleration.md b/docs/recipes/advanced/transcode-hw-acceleration.md
new file mode 100644
index 0000000..ea1d7d8
--- /dev/null
+++ b/docs/recipes/advanced/transcode-hw-acceleration.md
@@ -0,0 +1,194 @@
+<!--
+======================================================================
+DeFFcode library source-code is deployed under the Apache 2.0 License:
+
+Copyright (c) 2021 Abhishek Thakur(@abhiTronix) <abhi.una12@gmail.com>
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+   http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+======================================================================
+-->
+
+# :fontawesome-solid-microchip: Hardware-Accelerated Video Transcoding
+
+??? abstract "What exactly is Transcoding?"
+
+    Before heading directly into recipes we have to talk about Transcoding: 
+    
+    > Transcoding is the technique of transforming one media encoding format into another. 
+
+    This is typically done for compatibility purposes, such as when a media source provides a format that the intended target is not able to process; an in-between adaptation step is required:
+
+    - **Decode** media from its originally encoded state into raw, uncompressed information.
+    - **Encode** the raw data back, using a different codec that is supported by end user.
+
+> DeFFcode's FFdecoder API in conjunction with VidGear's WriteGear API creates a high-level **High-performance Lossless FFmpeg Transcoding _(Decoding & Encoding respectively)_ Pipeline :fire:** that is able to exploit almost any FFmpeg parameter for achieving anything imaginable with multimedia video data all while allow us to manipulate the real-time video frames with immense flexibility. Both these APIs are capable of utilizing the potential of GPU supported fully-accelerated **Hardware based video Decoding(FFdecoder API with hardware decoder) and Encoding (WriteGear API with hardware encoder)**, thus dramatically improving the performance of the end-to-end transcoding.
+
+We'll discuss its Hardware-Accelerated Video Transcoding capabilities using these APIs briefly in the following recipes:
+
+&thinsp;
+
+
+!!! warning "DeFFcode APIs requires FFmpeg executable"
+
+    ==DeFFcode APIs **MUST** requires valid FFmpeg executable for all of its core functionality==, and any failure in detection will raise `RuntimeError` immediately. Follow dedicated [FFmpeg Installation doc ➶](../../../installation/ffmpeg_install/) for its installation.
+
+???+ info "Additional Python Dependencies for following recipes"
+
+    Following recipes requires additional python dependencies which can be installed easily as below:
+
+    - [x] **OpenCV:** OpenCV is required for previewing and encoding video frames. You can easily install it directly via [`pip`](https://pypi.org/project/opencv-python/):
+
+        ??? tip "OpenCV installation from source"
+
+            You can also follow online tutorials for building & installing OpenCV on [Windows](https://www.learnopencv.com/install-opencv3-on-windows/), [Linux](https://www.pyimagesearch.com/2018/05/28/ubuntu-18-04-how-to-install-opencv/), [MacOS](https://www.pyimagesearch.com/2018/08/17/install-opencv-4-on-macos/) and [Raspberry Pi](https://www.pyimagesearch.com/2018/09/26/install-opencv-4-on-your-raspberry-pi/) machines manually from its source. 
+
+            :warning: Make sure not to install both *pip* and *source* version together. Otherwise installation will fail to work!
+
+        ??? info "Other OpenCV binaries"
+
+            OpenCV mainainers also provide additional binaries via pip that contains both main modules and contrib/extra modules [`opencv-contrib-python`](https://pypi.org/project/opencv-contrib-python/), and for server (headless) environments like [`opencv-python-headless`](https://pypi.org/project/opencv-python-headless/) and [`opencv-contrib-python-headless`](https://pypi.org/project/opencv-contrib-python-headless/). You can also install ==any one of them== in similar manner. More information can be found [here](https://github.com/opencv/opencv-python#installation-and-usage).
+
+
+        ```sh
+        pip install opencv-python       
+        ```
+
+    - [x] **VidGear:** VidGear is required for lossless encoding of video frames into file/stream. You can easily install it directly via [`pip`](https://pypi.org/project/opencv-python/):
+
+        ```sh
+        pip install vidgear[core]       
+        ```
+
+!!! note "Always use FFdecoder API's [`terminate()`](../../reference/ffdecoder/#deffcode.ffdecoder.FFdecoder.terminate) method at the end to avoid undesired behavior."
+
+!!! danger "==WriteGear's Compression Mode support for FFdecoder API is currently in beta so you can expect much higher than usual CPU utilization!=="
+
+&thinsp;
+
+## GPU-accelerated Hardware-based Video Transcoding with WriteGear API 
+
+???+ alert "Example Assumptions"
+
+    **Please note that following recipe explicitly assumes:**
+
+    - You're running :fontawesome-brands-windows: Windows operating system with a [**supported NVIDIA GPU**](https://developer.nvidia.com/nvidia-video-codec-sdk).
+    - You're using FFmpeg 4.4 or newer, configured with atleast `--enable-nonfree --enable-libx264 --enable-cuda --enable-nvenc --enable-nvdec --enable-cuda-nvcc --enable-libnpp` options during compilation.  For manual compilation follow [these instructions ➶](https://docs.nvidia.com/video-technologies/video-codec-sdk/ffmpeg-with-nvidia-gpu/#prerequisites)
+    - You already have appropriate Nvidia video drivers and related softwares installed on your machine.
+
+    These assumptions **MAY/MAY NOT** suit your current setup. Kindly use suitable parameters based your system platform and hardware settings only.
+
+
+??? danger "Limitation: Bottleneck in Hardware-Accelerated Video Transcoding Performance"
+
+    Generally, adding the `–hwaccel cuvid`/`–hwaccel cuda -hwaccel_output_format cuda` options means the raw decoded frames will not be copied between system and GPU memory _(via the PCIe bus)_, and the transcoding will be faster and use less system resources, and may even result in up to 2x the throughput compared to the unoptimized calls:
+
+    <figure markdown>
+      ![HW Acceleration](../../../assets/images/hw_accel.png){ width="350" }
+      <figcaption>General Memory Flow with Hardware Acceleration</figcaption>
+    </figure>
+    
+    But unfortunately, for processing real-time frames in our python script with FFdecoder and WriteGear APIs, we're bound to sacrifice this performance gained by explicitly copying raw decoded frames between System and GPU memory via the PCIe bus, thereby creating self-made latency in transfer time and increasing PCIe bandwidth occupancy due to overheads in communication over the bus. Also, given PCIe bandwidth limits, copying uncompressed image data would quickly saturate the PCIe bus. 
+
+    <figure markdown>
+      ![HW Acceleration Limitation](../../../assets/images/hw_accel_limitation.png){ width="350" }
+      <figcaption>Memory Flow with Hardware Acceleration <br>and Real-time Processing</figcaption>
+    </figure>
+
+    On the bright side however, GPU supported hardware based encoding/decoding is inherently faster and more efficient _(do not use much CPU resources)_ thus freeing up the CPU for other tasks, as compared to software based encoding/decoding that is generally known to be quite CPU intensive. Plus scaling, deinterlacing, filtering, and other post-processing tasks will be faster than usual using these hardware based decoders/encoders with same equivalent output to software ones, and will use less power and CPU to do so. 
+
+    !!! summary "On the whole, You don't have to worry about it as you're getting to manipulate the real-time video frames with immense speed and flexibility which is impossible to do otherwise."
+
+In this example, we will be using Nvidia's **H.264 CUVID Video-decoder(`h264_cuvid`) with `–hwaccel cuvid` accelerator** in FFdecoder API to decode and keep decoded **BGR24** frames from a given Video file _(say `foo.mp4`)_ within GPU, all while rescaling _(with nvcuvid's `resize`)_ as well as encoding them in real-time with WriteGear API using Nvidia's hardware accelerated **H.264 NVENC Video-encoder(`h264_nvenc`)** into lossless video file within GPU. 
+
+??? warning "Remember to check H.264 CUVID decoder and H.264 NVENC encoder support in FFmpeg"
+
+    - [x] **Using `h264_cuvid` decoder**: Remember to check if your FFmpeg compiled with H.264 CUVID decoder support. You can easily do this by executing following one-liner command in your terminal, and observing if output contains something similar as follows:
+
+        ```sh
+        $ ffmpeg  -hide_banner -decoders | grep h264 
+
+        VFS..D h264                 H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10
+        V....D h264_qsv             H264 video (Intel Quick Sync Video acceleration) (codec h264)
+        V..... h264_cuvid           Nvidia CUVID H264 decoder (codec h264)
+        ```
+
+        !!! note "You can also use optimized HEVC CUVID decoder(`hevc_cuvid`) in the similar way, if supported."
+
+    - [x] **Using `h264_nvenc` encoder**: Remember to check if your FFmpeg compiled with H.264 NVENC encoder support. You can easily do this by executing following one-liner command in your terminal, and observing if output contains something similar as follows:
+
+        ```sh
+        $ ffmpeg  -hide_banner -encoders | grep nvenc 
+
+        V....D h264_amf             AMD AMF H.264 Encoder (codec h264)
+        V....D h264_mf              H264 via MediaFoundation (codec h264)
+        V....D h264_nvenc           NVIDIA NVENC H.264 encoder (codec h264)
+        ```
+
+        !!! note "You can also use optimized HEVC NVENC encoder(`hevc_nvenc`) in the similar way, if supported."
+
+!!! info "Additional Parameters in WriteGear API"
+    
+    WriteGear API only requires a valid Output filename _(e.g. `output_foo.mp4`)_ as input, but you can easily control any output specifications _(such as bitrate, codec, framerate, resolution, subtitles, etc.)_ supported by FFmpeg _(in use)_.
+
+!!! tip "You can use FFdecoder's [`metadata`](../../reference/ffdecoder/#deffcode.ffdecoder.FFdecoder.metadata) property object that dumps source Video's metadata information _(as JSON string)_ to retrieve source framerate."
+
+
+```python
+# import the necessary packages
+from deffcode import FFdecoder
+from vidgear.gears import WriteGear
+import json
+
+# define suitable FFmpeg parameter
+ffparams = {
+    "-vcodec": "h264_cuvid",  # H.264 CUVID decoder
+    "-ffprefixes": ["-vsync", "0", "–hwaccel", "cuvid"],  # accelerator
+}
+
+# initialize and formulate the decoder with suitable source and params
+decoder = FFdecoder(
+    "foo.mp4", frame_format="bgr24", verbose=True, **ffparams
+).formulate()
+
+# retrieve framerate from source JSON Metadata and pass it as `-input_framerate`
+# parameter for controlled framerate and define other parameters
+output_params = {
+    "-input_framerate": json.loads(decoder.metadata)["source_video_framerate"],
+    "-vcodec": "h264_nvenc",  # H.264 NVENC encoder
+    "–resize": "1280x720",  # rescale to 1280x720
+}
+
+# Define writer with defined parameters and suitable
+# output filename for e.g. `output_foo.mp4`
+writer = WriteGear(output_filename="output_foo.mp4", logging=True, **output_params)
+
+# grab the BGR24 frame from the decoder
+for frame in decoder.generateFrame():
+
+    # check if frame is None
+    if frame is None:
+        break
+
+    # {do something with the frame here}
+
+    # writing BGR24 frame to writer
+    writer.write(frame)
+
+# terminate the decoder
+decoder.terminate()
+
+# safely close writer
+writer.close()
+```
+
+&nbsp;
\ No newline at end of file
diff --git a/docs/recipes/advanced/transcode-live-frames-complexgraphs.md b/docs/recipes/advanced/transcode-live-frames-complexgraphs.md
new file mode 100644
index 0000000..353dce0
--- /dev/null
+++ b/docs/recipes/advanced/transcode-live-frames-complexgraphs.md
@@ -0,0 +1,250 @@
+<!--
+======================================================================
+DeFFcode library source-code is deployed under the Apache 2.0 License:
+
+Copyright (c) 2021 Abhishek Thakur(@abhiTronix) <abhi.una12@gmail.com>
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+   http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+======================================================================
+-->
+
+# :fontawesome-solid-wand-magic-sparkles: Transcoding Live Complex Filtergraphs
+
+??? abstract "What are Complex filtergraphs?"
+
+    Before heading straight into recipes we will talk about Complex filtergraphs: 
+    
+    > Complex filtergraphs are those which cannot be described as simply a linear processing chain applied to one stream.  
+
+    Complex filtergraphs are configured with the `-filter_complex` global option. 
+
+    !!! note "The `-lavfi` option is equivalent to `-filter_complex`."
+
+    A trivial example of a complex filtergraph is the `overlay` filter, which has two video inputs and one video output, containing one video overlaid on top of the other.
+
+
+> DeFFcode's FFdecoder API seamlessly supports processing multiple input streams including real-time frames through multiple filter chains combined into a filtergraph _(via. `-filter_complex` FFmpeg parameter)_, and use their outputs as inputs for other filter chains. 
+
+We'll discuss the transcoding of live complex filtergraphs in the following recipes:
+
+&thinsp;
+
+!!! warning "DeFFcode APIs requires FFmpeg executable"
+
+    ==DeFFcode APIs **MUST** requires valid FFmpeg executable for all of its core functionality==, and any failure in detection will raise `RuntimeError` immediately. Follow dedicated [FFmpeg Installation doc ➶](../../../installation/ffmpeg_install/) for its installation.
+
+???+ info "Additional Python Dependencies for following recipes"
+
+    Following recipes requires additional python dependencies which can be installed easily as below:
+
+    - [x] **OpenCV:** OpenCV is required for previewing and encoding video frames. You can easily install it directly via [`pip`](https://pypi.org/project/opencv-python/):
+
+        ??? tip "OpenCV installation from source"
+
+            You can also follow online tutorials for building & installing OpenCV on [Windows](https://www.learnopencv.com/install-opencv3-on-windows/), [Linux](https://www.pyimagesearch.com/2018/05/28/ubuntu-18-04-how-to-install-opencv/), [MacOS](https://www.pyimagesearch.com/2018/08/17/install-opencv-4-on-macos/) and [Raspberry Pi](https://www.pyimagesearch.com/2018/09/26/install-opencv-4-on-your-raspberry-pi/) machines manually from its source. 
+
+            :warning: Make sure not to install both *pip* and *source* version together. Otherwise installation will fail to work!
+
+        ??? info "Other OpenCV binaries"
+
+            OpenCV mainainers also provide additional binaries via pip that contains both main modules and contrib/extra modules [`opencv-contrib-python`](https://pypi.org/project/opencv-contrib-python/), and for server (headless) environments like [`opencv-python-headless`](https://pypi.org/project/opencv-python-headless/) and [`opencv-contrib-python-headless`](https://pypi.org/project/opencv-contrib-python-headless/). You can also install ==any one of them== in similar manner. More information can be found [here](https://github.com/opencv/opencv-python#installation-and-usage).
+
+
+        ```sh
+        pip install opencv-python       
+        ```
+
+    - [x] **VidGear:** VidGear is required for lossless encoding of video frames into file/stream. You can easily install it directly via [`pip`](https://pypi.org/project/opencv-python/):
+
+        ```sh
+        pip install vidgear[core]       
+        ```
+
+!!! note "Always use FFdecoder API's [`terminate()`](../../reference/ffdecoder/#deffcode.ffdecoder.FFdecoder.terminate) method at the end to avoid undesired behavior."
+
+
+&thinsp;
+
+## Transcoding video with Live Custom watermark image overlay
+
+<figure markdown>
+  ![Big Buck Bunny with watermark](../../../assets/gifs/watermark_overlay.gif)
+  <figcaption>Big Buck Bunny with custom watermark</figcaption>
+</figure>
+
+
+In this example we will apply a watermark image _(say `watermark.png` with transparent background)_ overlay to the `10` seconds of video file _(say `foo.mp4`)_ using FFmpeg's [`overlay`](https://ffmpeg.org/ffmpeg-filters.html#toc-overlay-1) filter with some additional filtering, , and decode live **BGR24** video frames in FFdecoder API. We'll also be encoding those decoded frames in real-time into lossless video file using WriteGear API with controlled framerate.
+
+!!! info "You can use FFdecoder's [`metadata`](../../reference/ffdecoder/#deffcode.ffdecoder.FFdecoder.metadata) property object that dumps Source Metadata as JSON to retrieve source framerate and frame-size."
+
+!!! tip "To learn about exclusive `-ffprefixes` & `-clones` parameter. See [Exclusive Parameters ➶](../../reference/ffdecoder/params/#b-exclusive-parameters)"
+
+```python
+# import the necessary packages
+from deffcode import FFdecoder
+from vidgear.gears import WriteGear
+import json, cv2
+
+# define the Complex Video Filter with additional `watermark.png` image input
+ffparams = {
+    "-ffprefixes": ["-t", "10"],  # playback time of 10 seconds
+    "-clones": [
+        "-i",
+        "watermark.png",  # !!! [WARNING] define your `watermark.png` here.
+    ],
+    "-filter_complex": "[1]format=rgba,"  # change 2nd(image) input format to yuv444p
+    + "colorchannelmixer=aa=0.7[logo];"  # apply colorchannelmixer to image for controlling alpha [logo]
+    + "[0][logo]overlay=W-w-{pixel}:H-h-{pixel}:format=auto,".format(  # apply overlay to 1st(video) with [logo]
+        pixel=5  # at 5 pixels from the bottom right corner of the input video
+    )
+    + "format=bgr24",  # change output format to `yuv422p10le`
+}
+
+# initialize and formulate the decoder for BGR24 output with given params
+decoder = FFdecoder(
+    "foo.mp4", frame_format="bgr24", verbose=True, **ffparams
+).formulate()
+
+# retrieve framerate from source JSON Metadata and pass it as `-input_framerate`
+# parameter for controlled framerate and define other parameters
+output_params = {
+    "-input_framerate": json.loads(decoder.metadata)["source_video_framerate"],
+}
+
+# Define writer with default parameters and suitable
+# output filename for e.g. `output_foo.mp4`
+writer = WriteGear(output_filename="output_foo.mp4", logging=True, **output_params)
+
+# grab the BGR24 frame from the decoder
+for frame in decoder.generateFrame():
+
+    # check if frame is None
+    if frame is None:
+        break
+
+    # {do something with the frame here}
+
+    # writing BGR24 frame to writer
+    writer.write(frame)
+
+# terminate the decoder
+decoder.terminate()
+
+# safely close writer
+writer.close()
+```
+
+&nbsp;
+
+## Transcoding video from sequence of Images with additional filtering
+
+<figure markdown>
+  ![mandelbrot test pattern](../../../assets/gifs/fish_mandelbrot.gif)
+  <figcaption>Mandelbrot pattern blend with Fish school video</figcaption>
+</figure>
+
+??? info "Available blend mode options" 
+
+    **Other blend mode options for `blend` filter include:** `addition`, `addition128`, `grainmerge`, `and`, `average`, `burn`, `darken`, `difference`, `difference128`, `grainextract`, `divide`, `dodge`, `freeze`, `exclusion`, `extremity`, `glow`, `hardlight`, `hardmix`, `heat`, `lighten`, `linearlight`, `multiply`, `multiply128`, `negation`, `normal`, `or`, `overlay`, `phoenix`, `pinlight`, `reflect`, `screen`, `softlight`, `subtract`, `vividlight`, `xor`
+
+
+In this example we will blend **`10` seconds of Mandelbrot test pattern** _(generated using `lavfi` input virtual device)_ that serves as the "top" layer with **`10` seconds of Image Sequence** that serves as the "bottom" layer, using `blend` filter _(with `heat` blend mode)_, and decode live **BGR24** video frames in FFdecoder API. We'll also be encoding those decoded frames in real-time into lossless video file using WriteGear API with controlled framerate.
+
+!!! danger "==WriteGear's Compression Mode support for FFdecoder API is currently in beta so you can expect much higher than usual CPU utilization!=="
+
+??? tip "Extracting Image Sequences from a video"
+    
+    **You can use following FFmpeg command to extract sequences of images from a video file `foo.mp4` _(restricted to 12 seconds)_:**
+    
+    ```sh
+    $ ffmpeg -t 12 -i foo.mp4 /path/to/image-%03d.png
+    ```
+
+    The default framerate is `25` fps, therefore this command will extract `25 images/sec` from the video file, and save them as sequences of images _(starting from `image-000.png`, `image-001.png`, `image-002.png` up to `image-999.png`)_. 
+
+    !!! info "If there are more than `1000` frames then the last image will be overwritten with the remaining frames leaving only the last frame."
+
+    The default images width and height is same as the video.
+
+??? question "How to start with specific number image?"
+    You can use `-start_number` FFmpeg parameter if you want to start with specific number image:
+
+    ```python
+    # define `-start_number` such as `5`
+    ffparams = {"-ffprefixes":["-start_number", "5"]}
+
+    # initialize and formulate the decoder with define parameters
+    decoder = FFdecoder('/path/to/img%03d.png', verbose=True, **ffparams).formulate()
+    ```
+
+!!! note "FFdecoder API also accepts Glob pattern(`*.png`) as well Single looping image as as input to its [`source`](../../reference/sourcer/params/#source) parameter. See this [Basic Recipe :material-pot-steam: ➶](../../basic/decode-image-sequences/#decoding-image-sequences) for more information."
+
+```python
+# import the necessary packages
+from deffcode import FFdecoder
+from vidgear.gears import WriteGear
+import cv2, json
+
+# define mandelbrot pattern generator
+# and the Video Filter definition
+ffparams = {
+    "-ffprefixes": [
+        "-t", "10", # playback time of 10 seconds for mandelbrot pattern
+        "-f", "lavfi", # use input virtual device
+        "-i", "mandelbrot=rate=25", # create mandelbrot pattern at 25 fps
+        "-t", "10", # playback time of 10 seconds for video
+    ],  
+    "-custom_resolution": (1280, 720), # resize to 1280x720
+    "-filter_complex":"[1:v]format=yuv444p[v1];" # change 2nd(video) input format to yuv444p
+        + "[0:v]format=gbrp10le[v0];" # change 1st(mandelbrot pattern) input format to gbrp10le
+        + "[v1][v0]scale2ref[v1][v0];" # resize the 1st(mandelbrot pattern), based on a 2nd(video).
+        + "[v0][v1]blend=all_mode='heat'," # apply heat blend mode to output
+        + "format=yuv422p10le[v]", # change output format to `yuv422p10le`
+    "-map": "[v]", # map the output
+}
+
+# initialize and formulate the decoder with suitable source
+decoder = FFdecoder(
+    "/path/to/image-%03d.png", frame_format="bgr24", verbose=True, **ffparams
+).formulate()
+
+# define your parameters
+# [WARNING] framerate must match original source framerate !!!
+output_params = {
+    "-input_framerate": 25,  # Default
+}
+
+# Define writer with default parameters and suitable
+# output filename for e.g. `output_foo.mp4`
+writer = WriteGear(output_filename="output_foo.mp4", logging=True, **output_params)
+
+# grab the BGR24 frame from the decoder
+for frame in decoder.generateFrame():
+
+    # check if frame is None
+    if frame is None:
+        break
+
+    # {do something with the frame here}
+
+    # writing BGR24 frame to writer
+    writer.write(frame)
+
+# terminate the decoder
+decoder.terminate()
+
+# safely close writer
+writer.close()
+```
+
+&nbsp;
\ No newline at end of file
diff --git a/docs/recipes/advanced/update-metadata.md b/docs/recipes/advanced/update-metadata.md
new file mode 100644
index 0000000..d7d02a6
--- /dev/null
+++ b/docs/recipes/advanced/update-metadata.md
@@ -0,0 +1,223 @@
+<!--
+======================================================================
+DeFFcode library source-code is deployed under the Apache 2.0 License:
+
+Copyright (c) 2021 Abhishek Thakur(@abhiTronix) <abhi.una12@gmail.com>
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+   http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+======================================================================
+-->
+
+# :material-cog-refresh: Updating Video Metadata
+
+> In addition of using [`metadata`](../../reference/ffdecoder/#deffcode.ffdecoder.FFdecoder.metadata) property object in FFdecoder API for probing metadata information _(only as JSON string)_  for each multimedia stream available in the given video source, you can also easily update the video metadata on-the-fly by assigning desired data as python dictionary to the same overloaded `metadata` property object. This feature can be used either for adding new custom properties to metadata, or to override source metadata properties used by FFdecoder API to formulate its default Decoder Pipeline for real-time video-frames generation.
+
+We'll discuss video metadata extraction using both these APIs briefly in the following recipes:
+
+!!! quote "This feature is not yet fully explored, but in the near future you'll be able to use it to dynamically override any Video frames Decoder Pipeline property _(such as frame-size, pixel-format, etc.)_ in real-time like a pro. Stay tuned for more updates :eyes:"
+
+&thinsp;
+
+!!! warning "DeFFcode APIs requires FFmpeg executable"
+
+    ==DeFFcode APIs **MUST** requires valid FFmpeg executable for all of its core functionality==, and any failure in detection will raise `RuntimeError` immediately. Follow dedicated [FFmpeg Installation doc ➶](../../../installation/ffmpeg_install/) for its installation.
+
+??? danger "Never name your python script `deffcode.py`"
+
+    When trying out these recipes, never name your python script `deffcode.py` otherwise it will result in `ModuleNotFound` error.
+
+&thinsp;
+
+## Added new properties to metadata in FFdecoder API
+
+> In FFdecoder API, you can easily define **any number** of new properties for its metadata _(formatted as python dictionary)_ with desired data of **any datatype(s)[^1]** , without affecting its default Video frames Decoder pipeline.
+
+In this example we will probe all metadata information available within `foo.mp4` video file on :fontawesome-brands-windows: Windows machine, thereby add new propertys  _(formatted as python dictionary)_ with desired data of different datatype(s) through overloaded `metadata` property object, and then finally print it as JSON string using the same `metadata` property object in FFdecoder API.
+
+!!! warning "The value assigned to [`metadata`](../../reference/ffdecoder/#deffcode.ffdecoder.FFdecoder.metadata) property object can be of [`dictionary`](https://docs.python.org/3/tutorial/datastructures.html#dictionaries) datatype only. Any other type will immediately raise `ValueError`!"
+
+```python
+# import the necessary packages
+from deffcode import FFdecoder
+import json
+
+# initialize the decoder using suitable source
+decoder = FFdecoder("foo.mp4", verbose=True)
+
+# format your data as dictionary (with data of any [printable] datatype)
+data = dict(
+    mystring="abcd",  # string data
+    myint=1234,  # integers data
+    mylist=[1, "Rohan", ["inner_list"]],  # list data
+    mytuple=(1, "John", ("inner_tuple")),  # tuple data
+    mydict={"anotherstring": "hello"},  # dictionary data
+    myjson=json.loads('{"name": "John", "age": 30, "city": "New York"}'),  # json data
+)
+
+# assign your dictionary data
+decoder.metadata = data
+
+# finally formulate the decoder
+decoder.formulate()
+
+# print metadata as `json.dump`
+print(decoder.metadata)
+
+# terminate the decoder
+decoder.terminate()
+```
+??? abstract "After running above python code, the resultant Terminal Output will look something as following on :fontawesome-brands-windows:Windows machine:"
+    ```json
+    {
+      "ffmpeg_binary_path": "C:\\Users\\foo\\AppData\\Local\\Temp\\ffmpeg-static-win64-gpl/bin/ffmpeg.exe",
+      "source": "D:\\foo.mp4",
+      "source_extension": ".mp4",
+      "source_video_resolution": [
+        1920,
+        1080
+      ],
+      "source_video_framerate": 29.97,
+      "source_video_pixfmt": "yuv420p",
+      "source_video_decoder": "h264",
+      "source_duration_sec": 21.03,
+      "approx_video_nframes": 630,
+      "source_video_bitrate": "4937k",
+      "source_audio_bitrate": "256k",
+      "source_audio_samplerate": "48000 Hz",
+      "source_has_video": true,
+      "source_has_audio": true,
+      "source_has_image_sequence": false,
+      "ffdecoder_operational_mode": "Video-Only",
+      "output_frames_pixfmt": "rgb24",
+      "mystring": "abcd",
+      "myint": 1234,
+      "mylist": [
+        1,
+        "Rohan",
+        [
+          "inner_list"
+        ]
+      ],
+      "mytuple": [
+        1,
+        "John",
+        "inner_tuple"
+      ],
+      "mydict": {
+        "anotherstring": "hello"
+      },
+      "myjson": {
+        "name": "John",
+        "age": 30,
+        "city": "New York"
+      }
+    }
+    ```
+
+&nbsp;
+
+
+## Overriding source video metadata in FFdecoder API
+
+> In FFdecoder API, you can also use its `metadata` to manually override the source properties _(as frame-size, frame pixel-format, video-framerate, video-decoder etc.)_ that directly affects its default Video frames Decoder pipeline that decodes real-time video-frames.
+
+!!! info "The `"source"` property in metadata cannot be altered in any manner."
+
+??? warning "Source Video metadata values must be handled carefully"
+
+    > Source Video metadata information is used by FFdecoder API to formulate its default Video frames Decoder pipeline, and any improper or invalid inputted source property could crash the pipeline with `RuntimeError`. 
+
+    Therefore to safeguard against it, **FFdecoder API discards any Source Video metadata dictionary keys, if its value's datatype fails to match the exact valid datatype defined in following table:**
+
+    !!! info "Only either `source_demuxer` or `source_extension` property can be present in source metadata." 
+
+    !!! quote "Not all Source Video metadata properties directly affects the pipeline _(as mentioned in the table)_. But this might change in future versions."
+
+
+    | Source Video Metadata Keys | Valid Value Datatype | Effect on Pipeline |
+    |:---------------------------:|:---------------------:|:---:|
+    |`"source_extension"`|`string`| None |
+    |`"source_demuxer"`|`string`| Direct |
+    |`"source_video_resolution"`|`list of integers` _e.g. `[1280,720]`_| Direct |
+    |`"source_video_framerate"`|`float`| Direct |
+    |`"source_video_pixfmt"`|`string`| Direct |
+    |`"source_video_decoder"`|`string`| Direct |
+    |`"source_duration_sec"`|`float`| None |
+    |`"approx_video_nframes"`|`integer`| Direct |
+    |`"source_video_bitrate"`|`string`| None |
+    |`"source_audio_bitrate"`|`string`| None |
+    |`"source_audio_samplerate"`|`string`| None |
+    |`"source_has_video"`|`bool`| Direct |
+    |`"source_has_audio"`|`bool`| None |
+    |`"source_has_image_sequence"`|`bool`| Direct |
+    |`"ffdecoder_operational_mode"`|`str`| None |
+    |`"output_frames_pixfmt"`|`str`| Direct |
+
+
+    Hence for instance, if "source_video_resolution" is assigned `"1280x720"` _(i.e. `string` datatype value instead of `list`)_, then it will be discarded.
+
+
+In this example we will probe all metadata information available within `foo.mp4` video file, and override frame size _(originally `1920x1080`)_ and pixel-format  _(originally `rgb24`)_ to our desired values through overloaded `metadata` property object in FFdecoder API, and thereby preview them using OpenCV Library's `cv2.imshow()` method.
+
+!!! danger "The value assigned to [`metadata`](../../reference/ffdecoder/#deffcode.ffdecoder.FFdecoder.metadata) property object can be of [`dictionary`](https://docs.python.org/3/tutorial/datastructures.html#dictionaries) datatype only. Any other type will immediately raise `ValueError`!"
+
+!!! alert "Once the [`formulate()`](../../reference/ffdecoder/#deffcode.ffdecoder.FFdecoder.formulate) method is called, the metadata information present in FFdecoder API is finalized and thereby used to formulate its default pipeline for decoding real-time video-frames. Therefore make all changes to video properties beforehand."
+
+```python
+# import the necessary packages
+from deffcode import FFdecoder
+import cv2
+
+# initialize and formulate the decoder using suitable source
+decoder = FFdecoder("foo.mp4", verbose=True)
+
+# override source metadata values
+# !!! [WARNING] Make sure each value datatype matches the table !!!
+decoder.metadata = {
+    "output_frames_pixfmt": "gray",  # gray frame-pixfmt
+    "source_video_resolution": [1280, 720],  # 1280x720 frame-size
+}
+
+# finally formulate the decoder
+decoder.formulate()
+
+# [NOTE] uncomment following line to debug values
+# print(decoder.metadata)
+
+# let's grab the 1280x720 sized gray frames from decoder
+for frame in decoder.generateFrame():
+
+    # check if frame is None
+    if frame is None:
+        break
+
+    # {do something with gray frame here}
+
+    # Show gray frames in output window
+    cv2.imshow("Output gray", frame)
+
+    # check for 'q' key if pressed
+    key = cv2.waitKey(1) & 0xFF
+    if key == ord("q"):
+        break
+
+# close output window
+cv2.destroyAllWindows()
+
+# terminate the decoder
+decoder.terminate()
+```
+
+&nbsp;
+
+[^1]: :warning: **There is no concept of `tuple` datatype in the JSON format.** Thereby, Python's [`json`](https://docs.python.org/3/library/json.html) module auto-converts all `tuple` python values into JSON `list` because that's the closest thing in JSON format to a tuple.
\ No newline at end of file
diff --git a/docs/recipes/basic/decode-image-sequences.md b/docs/recipes/basic/decode-image-sequences.md
new file mode 100644
index 0000000..1fa31e3
--- /dev/null
+++ b/docs/recipes/basic/decode-image-sequences.md
@@ -0,0 +1,220 @@
+<!--
+======================================================================
+DeFFcode library source-code is deployed under the Apache 2.0 License:
+
+Copyright (c) 2021 Abhishek Thakur(@abhiTronix) <abhi.una12@gmail.com>
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+   http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+======================================================================
+-->
+
+# :material-image-multiple: Decoding Image sequences
+
+> DeFFcode's FFdecoder API supports a wide-ranging media streams as input to its [`source`](../../reference/sourcer/params/#source) parameter, which also includes **Image Sequences** such as Sequential(`img%03d.png`) and Glob pattern(`*.png`) as well as **Single looping image**. 
+
+We'll discuss both briefly in the following recipes:
+
+&thinsp;
+
+!!! warning "DeFFcode APIs requires FFmpeg executable"
+
+    ==DeFFcode APIs **MUST** requires valid FFmpeg executable for all of its core functionality==, and any failure in detection will raise `RuntimeError` immediately. Follow dedicated [FFmpeg Installation doc ➶](../../../installation/ffmpeg_install/) for its installation.
+
+???+ info "Additional Python Dependencies for following recipes"
+
+    Following recipes requires additional python dependencies which can be installed easily as below:
+
+    - [x] **OpenCV:** OpenCV is required for previewing video frames. You can easily install it directly via [`pip`](https://pypi.org/project/opencv-python/):
+
+        ??? tip "OpenCV installation from source"
+
+            You can also follow online tutorials for building & installing OpenCV on [Windows](https://www.learnopencv.com/install-opencv3-on-windows/), [Linux](https://www.pyimagesearch.com/2018/05/28/ubuntu-18-04-how-to-install-opencv/), [MacOS](https://www.pyimagesearch.com/2018/08/17/install-opencv-4-on-macos/) and [Raspberry Pi](https://www.pyimagesearch.com/2018/09/26/install-opencv-4-on-your-raspberry-pi/) machines manually from its source. 
+
+            :warning: Make sure not to install both *pip* and *source* version together. Otherwise installation will fail to work!
+
+        ??? info "Other OpenCV binaries"
+
+            OpenCV mainainers also provide additional binaries via pip that contains both main modules and contrib/extra modules [`opencv-contrib-python`](https://pypi.org/project/opencv-contrib-python/), and for server (headless) environments like [`opencv-python-headless`](https://pypi.org/project/opencv-python-headless/) and [`opencv-contrib-python-headless`](https://pypi.org/project/opencv-contrib-python-headless/). You can also install ==any one of them== in similar manner. More information can be found [here](https://github.com/opencv/opencv-python#installation-and-usage).
+
+
+        ```sh
+        pip install opencv-python       
+        ```
+
+
+!!! note "Always use FFdecoder API's [`terminate()`](../../reference/ffdecoder/#deffcode.ffdecoder.FFdecoder.terminate) method at the end to avoid undesired behavior."
+
+??? danger "Never name your python script `deffcode.py`"
+
+    When trying out these recipes, never name your python script `deffcode.py` otherwise it will result in `ModuleNotFound` error.
+
+&thinsp;
+
+## Capturing and Previewing frames from Sequence of images
+
+In this example we will capture video frames from a given Image Sequence using FFdecoder API, and preview them using OpenCV Library's `cv2.imshow()` method in real-time.
+
+!!! alert "OpenCV expects `BGR` format frames in its `cv2.imshow()` method."
+
+
+??? tip "Extracting Image Sequences from a video"
+    
+    **You can use following FFmpeg command to extract sequences of images from a video file `foo.mp4`:**
+    
+    ```sh
+    $ ffmpeg -i foo.mp4 /path/to/image-%03d.png
+    ```
+
+    The default framerate is `25` fps, therefore this command will extract `25 images/sec` from the video file, and save them as sequences of images _(starting from `image-000.png`, `image-001.png`, `image-002.png` up to `image-999.png`)_. 
+
+    !!! info "If there are more than `1000` frames then the last image will be overwritten with the remaining frames leaving only the last frame."
+
+    The default images width and height is same as the video.
+
+=== "Sequential"
+
+    ??? question "How to start with specific number image?"
+        You can use `-start_number` FFmpeg parameter if you want to start with specific number image:
+
+        ```python
+        # define `-start_number` such as `5`
+        ffparams = {"-ffprefixes":["-start_number", "5"]}
+
+        # initialize and formulate the decoder with define parameters
+        decoder = FFdecoder('img%03d.png', verbose=True, **ffparams).formulate()
+        ```
+
+    ```python
+    # import the necessary packages
+    from deffcode import FFdecoder
+    import cv2
+
+    # initialize and formulate the decoder with suitable source
+    decoder = FFdecoder("/path/to/pngs/img%03d.png", frame_format="bgr24", verbose=True).formulate()
+
+    # grab the BGR24 frame from the decoder
+    for frame in decoder.generateFrame():
+
+        # check if frame is None
+        if frame is None:
+            break
+
+        # {do something with the frame here}
+
+        # Show output window
+        cv2.imshow("Output", frame)
+
+        # check for 'q' key if pressed
+        key = cv2.waitKey(1) & 0xFF
+        if key == ord("q"):
+            break
+
+    # close output window
+    cv2.destroyAllWindows()
+
+    # terminate the decoder
+    decoder.terminate()
+    ```
+
+=== "Glob pattern"
+
+    !!! abstract "Bash-style globbing _(`*` represents any number of any characters)_ is useful if your images are sequential but not necessarily in a numerically sequential order."
+
+    !!! warning "The glob pattern is not available on Windows FFmpeg builds."
+
+    !!! note "To learn more about exclusive `-ffprefixes` parameter. See [Exclusive Parameters ➶](../../reference/ffdecoder/params/#b-exclusive-parameters)"
+
+    ```python
+    # import the necessary packages
+    from deffcode import FFdecoder
+    import cv2
+
+    # define `-pattern_type glob` for accepting glob pattern
+    ffparams = {"-ffprefixes":["-pattern_type", "glob"]}
+
+    # initialize and formulate the decoder with suitable source
+    decoder = FFdecoder("/path/to/pngs/img*.png", frame_format="bgr24", verbose=True, **ffparams).formulate()
+
+
+    # grab the GRAYSCALE frame from the decoder
+    for frame in decoder.generateFrame():
+
+        # check if frame is None
+        if frame is None:
+            break
+
+        # {do something with the frame here}
+
+        # Show output window
+        cv2.imshow("Output", frame)
+
+        # check for 'q' key if pressed
+        key = cv2.waitKey(1) & 0xFF
+        if key == ord("q"):
+            break
+
+
+    # close output window
+    cv2.destroyAllWindows()
+
+    # terminate the decoder
+    decoder.terminate()
+    ```
+
+&nbsp;
+
+## Capturing and Previewing frames from Single looping image
+
+In this example we will capture video frames from a Single Looping image using FFdecoder API, and preview them using OpenCV Library's `cv2.imshow()` method in real-time.
+
+!!! alert "By default, OpenCV expects `BGR` format frames in its `cv2.imshow()` method."
+
+!!! note "To learn more about exclusive `-ffprefixes` parameter. See [Exclusive Parameters ➶](../../reference/ffdecoder/params/#b-exclusive-parameters)"
+
+```python
+# import the necessary packages
+from deffcode import FFdecoder
+import cv2
+
+# define `-loop 1` for looping
+ffparams = {"-ffprefixes":["-loop", "1"]}
+
+# initialize and formulate the decoder with suitable source
+decoder = FFdecoder("img.png", frame_format="bgr24", verbose=True, **ffparams).formulate()
+
+# grab the BGR24 frame from the decoder
+for frame in decoder.generateFrame():
+
+    # check if frame is None
+    if frame is None:
+        break
+
+    # {do something with the frame here}
+
+    # Show output window
+    cv2.imshow("Output", frame)
+
+    # check for 'q' key if pressed
+    key = cv2.waitKey(1) & 0xFF
+    if key == ord("q"):
+        break
+
+# close output window
+cv2.destroyAllWindows()
+
+# terminate the decoder
+decoder.terminate()
+```
+
+
+&nbsp;
\ No newline at end of file
diff --git a/docs/recipes/basic/decode-live-feed-devices.md b/docs/recipes/basic/decode-live-feed-devices.md
new file mode 100644
index 0000000..b81eaa3
--- /dev/null
+++ b/docs/recipes/basic/decode-live-feed-devices.md
@@ -0,0 +1,478 @@
+<!--
+======================================================================
+DeFFcode library source-code is deployed under the Apache 2.0 License:
+
+Copyright (c) 2021 Abhishek Thakur(@abhiTronix) <abhi.una12@gmail.com>
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+   http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+======================================================================
+-->
+
+# :material-webcam: Decoding Live Feed Devices
+
+> DeFFcode's FFdecoder API provide effortless support for Live Feed Devices using two parameters: [`source`](../../reference/sourcer/params/#source) parameter which accepts device name or its path, and [`source_demuxer`](../../reference/sourcer/params/#source_demuxer) parameter to specify demuxer for the given input device. 
+
+We'll discuss the Live Feed Devices support using both these parameters briefly in the following recipes:
+
+&thinsp;
+
+!!! warning "DeFFcode APIs requires FFmpeg executable"
+
+    ==DeFFcode APIs **MUST** requires valid FFmpeg executable for all of its core functionality==, and any failure in detection will raise `RuntimeError` immediately. Follow dedicated [FFmpeg Installation doc ➶](../../../installation/ffmpeg_install/) for its installation.
+
+???+ info "Additional Python Dependencies for following recipes"
+
+    Following recipes requires additional python dependencies which can be installed easily as below:
+
+    - [x] **OpenCV:** OpenCV is required for previewing video frames. You can easily install it directly via [`pip`](https://pypi.org/project/opencv-python/):
+
+        ??? tip "OpenCV installation from source"
+
+            You can also follow online tutorials for building & installing OpenCV on [Windows](https://www.learnopencv.com/install-opencv3-on-windows/), [Linux](https://www.pyimagesearch.com/2018/05/28/ubuntu-18-04-how-to-install-opencv/), [MacOS](https://www.pyimagesearch.com/2018/08/17/install-opencv-4-on-macos/) and [Raspberry Pi](https://www.pyimagesearch.com/2018/09/26/install-opencv-4-on-your-raspberry-pi/) machines manually from its source. 
+
+            :warning: Make sure not to install both *pip* and *source* version together. Otherwise installation will fail to work!
+
+        ??? info "Other OpenCV binaries"
+
+            OpenCV mainainers also provide additional binaries via pip that contains both main modules and contrib/extra modules [`opencv-contrib-python`](https://pypi.org/project/opencv-contrib-python/), and for server (headless) environments like [`opencv-python-headless`](https://pypi.org/project/opencv-python-headless/) and [`opencv-contrib-python-headless`](https://pypi.org/project/opencv-contrib-python-headless/). You can also install ==any one of them== in similar manner. More information can be found [here](https://github.com/opencv/opencv-python#installation-and-usage).
+
+
+        ```sh
+        pip install opencv-python       
+        ```
+
+
+!!! note "Always use FFdecoder API's [`terminate()`](../../reference/ffdecoder/#deffcode.ffdecoder.FFdecoder.terminate) method at the end to avoid undesired behavior."
+
+??? danger "Never name your python script `deffcode.py`"
+
+    When trying out these recipes, never name your python script `deffcode.py` otherwise it will result in `ModuleNotFound` error.
+
+&thinsp;
+
+## Capturing and Previewing frames from a Webcam
+
+???+ alert "Example Assumptions"
+
+    FFmpeg provide set of specific Demuxers on different platforms to read the multimedia streams from a particular type of Video Capture source/device. Please note that following recipe explicitly assumes: 
+
+    - You're running Linux Machine with USB webcam connected to it at node/path `/dev/video0`. 
+    - You already have appropriate Linux video drivers and related softwares installed on your machine.
+    - You machine uses FFmpeg binaries built with `--enable-libv4l2` flag to support `video4linux2, v4l2` demuxer. BTW, you can list all supported demuxers using the `#!sh ffmpeg --list-demuxers` terminal command.
+
+    These assumptions **MAY/MAY NOT** suit your current setup. Kindly use suitable parameters based your system platform and hardware settings only.
+
+
+In this example we will decode **BGR24** video frames from a USB webcam device connected at path `/dev/video0` on a Linux Machine with `video4linux2` _(or simply `v4l2`)_ demuxer, and preview them using OpenCV Library's `cv2.imshow()` method.
+
+
+??? tip "Identifying and Specifying Video Capture Device Name/Path/Index and suitable Demuxer on different OS platforms"
+
+    === ":fontawesome-brands-windows: Windows"
+
+        Windows OS users can use the [dshow](https://trac.ffmpeg.org/wiki/DirectShow) (DirectShow) to list video input device which is the preferred option for Windows users. You can refer following steps to identify and specify your input video device's name:
+
+        - [x] **Identify Video Devices:** You can locate your video device's name _(already connected to your system)_ using `dshow` as follows:
+
+            ```sh
+            c:\> ffmpeg.exe -list_devices true -f dshow -i dummy
+            
+            ffmpeg version N-45279-g6b86dd5... --enable-runtime-cpudetect
+              libavutil      51. 74.100 / 51. 74.100
+              libavcodec     54. 65.100 / 54. 65.100
+              libavformat    54. 31.100 / 54. 31.100
+              libavdevice    54.  3.100 / 54.  3.100
+              libavfilter     3. 19.102 /  3. 19.102
+              libswscale      2.  1.101 /  2.  1.101
+              libswresample   0. 16.100 /  0. 16.100
+            [dshow @ 03ACF580] DirectShow video devices
+            [dshow @ 03ACF580]  "Integrated Camera"
+            [dshow @ 03ACF580]  "USB2.0 Camera"
+            [dshow @ 03ACF580] DirectShow audio devices
+            [dshow @ 03ACF580]  "Microphone (Realtek High Definition Audio)"
+            [dshow @ 03ACF580]  "Microphone (USB2.0 Camera)"
+            dummy: Immediate exit requested
+            ```
+
+
+        - [x] **Specify Video Device's name:** Then, you can specify and initialize your located Video device's name in FFdecoder API as follows:
+
+            ```python
+            # initialize and formulate the decoder with "USB2.0 Camera" source for BGR24 output
+            decoder = FFdecoder("USB2.0 Camera", source_demuxer="dshow", frame_format="bgr24", verbose=True).formulate()
+            ```
+
+        - [x] **[OPTIONAL] Specify Video Device's index along with name:** If there are multiple Video devices with similar name, then you can use `-video_device_number` parameter to specify the arbitrary index of the particular device. For instance, to open second video device with name `"Camera"` you can do as follows:
+
+            ```python
+            # define video_device_number as 1 (numbering start from 0)
+            ffparams = {"-ffprefixes":["-video_device_number", "1"]}
+
+            # initialize and formulate the decoder with "Camera" source for BGR24 output
+            decoder = FFdecoder("Camera", source_demuxer="dshow", frame_format="bgr24", verbose=True, **ffparams).formulate()
+            ```
+
+    === ":material-linux: Linux"
+
+        Linux OS users can use the [`video4linux2`](https://trac.ffmpeg.org/wiki/Capture/Webcam#Linux) _(or its alias `v4l2`)_ to list to all capture video devices such as from an USB webcam. You can refer following steps to identify and specify your capture video device's path:
+
+        - [x] **Identify Video Devices:** Linux systems tend to automatically create file device node/path when the device _(e.g. an USB webcam)_ is plugged into the system, and has a name of the kind `'/dev/videoN'`, where `N` is a index associated to the device. To get the list of all available file device node/path on your Linux machine, you can use the `v4l-ctl` command.
+
+            !!! tip "You can use `#!sh sudo apt install v4l-utils` APT command to install `v4l-ctl` tool on Debian-based Linux distros."
+
+            ```sh
+            $ v4l2-ctl --list-devices
+
+            USB2.0 PC CAMERA (usb-0000:00:1d.7-1):
+                    /dev/video1
+
+            UVC Camera (046d:0819) (usb-0000:00:1d.7-2):
+                    /dev/video0
+            ```
+
+        - [x] **Specify Video Device's path:** Then, you can specify and initialize your located Video device's path in FFdecoder API as follows:
+
+            ```python
+            # initialize and formulate the decoder with "/dev/video0" source for BGR24 output
+            decoder = FFdecoder("/dev/video0", source_demuxer="v4l2", frame_format="bgr24", verbose=True).formulate()
+            ```
+
+        - [x] **[OPTIONAL] Specify Video Device's additional specifications:** You can also specify additional specifications _(such as pixel format(s), video format(s), framerate, and frame dimensions)_ supported by your Video Device as follows:
+
+            !!! tip "You can use `#!sh ffmpeg -f v4l2 -list_formats all -i /dev/video0` terminal command to list available specifications."
+
+            ```python
+            # define video device specifications
+            ffparams = {"-ffprefixes":["-framerate", "25", "-video_size", "640x480"]}
+
+            # initialize and formulate the decoder with "/dev/video0" source for BGR24 output
+            decoder = FFdecoder("/dev/video0", source_demuxer="v4l2", frame_format="bgr24", verbose=True, **ffparams).formulate()
+            ```
+
+    === ":material-apple: MacOS"
+
+        MacOS users can use the [AVFoundation](https://ffmpeg.org/ffmpeg-devices.html#avfoundation) to list input devices and is the currently recommended framework by Apple for streamgrabbing on Mac OSX-10.7 (Lion) and later as well as on iOS. You can refer following steps to identify and specify your capture video device's name or index on MacOS/OSX machines:
+
+        !!! note "QTKit is also available for streamgrabbing on Mac OS X 10.4 (Tiger) and later, but has been marked deprecated since OS X 10.7 (Lion) and may not be available on future releases."
+
+
+        - [x] **Identify Video Devices:** Then, You can locate your Video device's name and index using `avfoundation` as follows:
+
+            ```sh
+            $ ffmpeg -f avfoundation -list_devices true -i ""
+
+            ffmpeg version N-45279-g6b86dd5... --enable-runtime-cpudetect
+              libavutil      51. 74.100 / 51. 74.100
+              libavcodec     54. 65.100 / 54. 65.100
+              libavformat    54. 31.100 / 54. 31.100
+              libavdevice    54.  3.100 / 54.  3.100
+              libavfilter     3. 19.102 /  3. 19.102
+              libswscale      2.  1.101 /  2.  1.101
+              libswresample   0. 16.100 /  0. 16.100
+            [AVFoundation input device @ 0x7f8e2540ef20] AVFoundation video devices:
+            [AVFoundation input device @ 0x7f8e2540ef20] [0] FaceTime HD camera (built-in)
+            [AVFoundation input device @ 0x7f8e2540ef20] [1] Capture screen 0
+            [AVFoundation input device @ 0x7f8e2540ef20] AVFoundation audio devices:
+            [AVFoundation input device @ 0x7f8e2540ef20] [0] Blackmagic Audio
+            [AVFoundation input device @ 0x7f8e2540ef20] [1] Built-in Microphone
+            ```
+
+
+        - [x] **Specify Video Device's name or index:** Then, you can specify and initialize your located Video device in FFdecoder API using its either the name or the index shown in the device listing:
+
+            === "Using device's index"
+
+                ```python
+                # initialize and formulate the decoder with `1` index source for BGR24 output
+                decoder = FFdecoder("1", source_demuxer="avfoundation", frame_format="bgr24", verbose=True).formulate()
+                ```
+
+            === "Using device's name"
+
+                When specifying device's name, abbreviations using just the beginning of the device name are possible. Thus, to capture from a device named "Integrated iSight-camera" just "Integrated" is sufficient:
+
+                ```python
+                # initialize and formulate the decoder with "Integrated iSight-camera" source for BGR24 output
+                decoder = FFdecoder("Integrated", source_demuxer="avfoundation", frame_format="bgr24", verbose=True).formulate()
+                ```
+
+        - [x] **[OPTIONAL] Specify Default Video device:** You can also use the default device which is usually the first device in the listing by using "default" as source:
+
+            ```python
+            # initialize and formulate the decoder with "default" source for BGR24 output
+            decoder = FFdecoder("default", source_demuxer="avfoundation", frame_format="bgr24", verbose=True).formulate()
+            ```
+
+    !!! fail "If these steps doesn't work for you then reach us out on [Gitter ➶][gitter] Community channel"
+
+
+
+```python
+# import the necessary packages
+from deffcode import FFdecoder
+import cv2
+
+# initialize and formulate the decoder with "/dev/video0" source for BGR24 output
+decoder = FFdecoder("/dev/video0", source_demuxer="v4l2", frame_format="bgr24", verbose=True).formulate()
+
+# grab the BGR24 frames from decoder
+for frame in decoder.generateFrame():
+
+    # check if frame is None
+    if frame is None:
+        break
+
+    # {do something with the frame here}
+    
+    # Show output window
+    cv2.imshow("Output", frame)
+
+    # check for 'q' key if pressed
+    key = cv2.waitKey(1) & 0xFF
+    if key == ord("q"):
+        break
+
+# close output window
+cv2.destroyAllWindows()
+
+# terminate the decoder
+decoder.terminate()
+```
+
+&nbsp;
+
+## Capturing and Previewing frames from your Desktop 
+
+???+ alert "Example Assumptions"
+
+    Similar to Webcam capturing, FFmpeg provide set of specific Demuxers on different platforms for capturing your desktop _(Screen recording)_. Please note that following recipe explicitly assumes: 
+
+    - You're running Linux Machine with `libxcb` module installed properly on your machine.
+    - You machine uses FFmpeg binaries built with `--enable-libxcb` flag to support `x11grab` demuxer. BTW, you can list all supported demuxers using the `#!sh ffmpeg --list-demuxers` terminal command.
+
+    These assumptions **MAY/MAY NOT** suit your current setup. Kindly use suitable parameters based your system platform and hardware settings only.
+
+In this example we will decode live **BGR** video frames from your complete screen as well as a region in FFdecoder API, and preview them using OpenCV Library's `cv2.imshow()` method.
+
+??? tip "Specifying suitable Parameter(s) and Demuxer for Capturing your Desktop on different OS platforms"
+
+    === ":fontawesome-brands-windows: Windows"
+
+        Windows OS users can use the [gdigrab](https://ffmpeg.org/ffmpeg-devices.html#gdigrab) to grab video from the Windows screen. You can refer following steps to specify source for capturing different regions of your display:
+
+        !!! fail "For Windows OS users [`dshow`](https://github.com/rdp/screen-capture-recorder-to-video-windows-free) is also available for grabbing frames from your desktop. But it is highly unreliable and don't works most of the times."
+
+        - [x] **Capturing entire desktop:** For capturing all your displays as one big contiguous display, you can specify source, suitable parameters and demuxers in FFdecoder API as follows:
+
+            ```python
+            # define framerate
+            ffparams = {"-framerate": "30"}
+
+            # initialize and formulate the decoder with "desktop" source for BGR24 output
+            decoder = FFdecoder("desktop", source_demuxer="gdigrab", frame_format="bgr24", verbose=True, **ffparams).formulate()
+            ```
+
+        - [x] **Capturing a region:** If you want to limit capturing to a region, and show the area being grabbed, you can specify source and suitable parameters in FFdecoder API as follows:
+
+            !!! info "`x_offset` and `y_offset` specify the offsets of the grabbed area with respect to the top-left border of the desktop screen. They default to `0`. "
+
+            ```python
+            # define suitable parameters
+            ffparams = {
+                "-framerate": "30", # input framerate
+                "-ffprefixes": [
+                    "-offset_x", "10", "-offset_y", "20", # grab at position 10,20
+                    "-video_size", "640x480", # frame size
+                    "-show_region", "1", # show only region
+                ],
+            }
+
+            # initialize and formulate the decoder with "desktop" source for BGR24 output
+            decoder = FFdecoder("desktop", source_demuxer="gdigrab", frame_format="bgr24", verbose=True, **ffparams).formulate()
+            ```
+
+    === ":material-linux: Linux"
+
+        Linux OS users can use the [x11grab](https://ffmpeg.org/ffmpeg-devices.html#x11grab) to capture an X11 display. You can refer following steps to specify source for capturing different regions of your display:
+
+        !!! note "For X11 display, the source input has the syntax: `"display_number.screen_number[+x_offset,y_offset]"`."
+
+        - [x] **Capturing entire desktop:** For capturing all your displays as one big contiguous display, you can specify source, suitable parameters and demuxers in FFdecoder API as follows:
+
+            ```python
+            # define framerate
+            ffparams = {"-framerate": "30"}
+
+            # initialize and formulate the decoder with ":0.0" desktop source for BGR24 output
+            decoder = FFdecoder(":0.0", source_demuxer="x11grab", frame_format="bgr24", verbose=True, **ffparams).formulate()
+            ```
+
+        - [x] **Capturing a region:** If you want to limit capturing to a region, and show the area being grabbed, you can specify source and suitable parameters in FFdecoder API as follows:
+
+            !!! info "`x_offset` and `y_offset` specify the offsets of the grabbed area with respect to the top-left border of the X11 screen. They default to `0`. "
+
+            ```python
+            # define suitable parameters
+            ffparams = {
+                "-framerate": "30", # input framerate
+                "-ffprefixes": [
+                    "-video_size", "1024x768", # frame size
+                ],
+            }
+
+            # initialize and formulate the decoder with ":0.0" desktop source(starting with the upper-left corner at x=10, y=20) 
+            # for BGR24 output
+            decoder = FFdecoder(":0.0+10,20", source_demuxer="x11grab", frame_format="bgr24", verbose=True, **ffparams).formulate()
+            ```
+
+    === ":material-apple: MacOS"
+
+        MacOS users can use the [AVFoundation](https://ffmpeg.org/ffmpeg-devices.html#avfoundation) to list input devices and is the currently recommended framework by Apple for streamgrabbing on Mac OSX-10.7 (Lion) and later as well as on iOS. You can refer following steps to identify and specify your capture video device's name or index on MacOS/OSX machines:
+
+        !!! note "QTKit is also available for streamgrabbing on Mac OS X 10.4 (Tiger) and later, but has been marked deprecated since OS X 10.7 (Lion) and may not be available on future releases."
+
+
+        - [x] **Identify Video Devices:**  You can enumerate all the available input devices including screens ready to be captured using `avfoundation` as follows:
+
+            ```sh
+            $ ffmpeg -f avfoundation -list_devices true -i ""
+
+            ffmpeg version N-45279-g6b86dd5... --enable-runtime-cpudetect
+              libavutil      51. 74.100 / 51. 74.100
+              libavcodec     54. 65.100 / 54. 65.100
+              libavformat    54. 31.100 / 54. 31.100
+              libavdevice    54.  3.100 / 54.  3.100
+              libavfilter     3. 19.102 /  3. 19.102
+              libswscale      2.  1.101 /  2.  1.101
+              libswresample   0. 16.100 /  0. 16.100
+            [AVFoundation input device @ 0x7f8e2540ef20] AVFoundation video devices:
+            [AVFoundation input device @ 0x7f8e2540ef20] [0] FaceTime HD camera (built-in)
+            [AVFoundation input device @ 0x7f8e2540ef20] [1] Capture screen 0
+            [AVFoundation input device @ 0x7f8e2540ef20] AVFoundation audio devices:
+            [AVFoundation input device @ 0x7f8e2540ef20] [0] Blackmagic Audio
+            [AVFoundation input device @ 0x7f8e2540ef20] [1] Built-in Microphone
+            ```
+
+
+        - [x] **Capturing entire desktop:** Then, you can specify and initialize your located screens in FFdecoder API using its index shown:
+
+            ```python
+            # initialize and formulate the decoder with `0:` index desktop screen for BGR24 output
+            decoder = FFdecoder("0:", source_demuxer="avfoundation", frame_format="bgr24", verbose=True).formulate()
+            ```
+
+        - [x] **[OPTIONAL] Capturing mouse:** You can also specify additional specifications to capture the mouse pointer and screen mouse clicks as follows:
+
+            ```python
+            # define specifications
+            ffparams = {"-ffprefixes":["-capture_cursor", "1", "-capture_mouse_clicks", "0"]}
+
+            # initialize and formulate the decoder with "0:" source for BGR24 output
+            decoder = FFdecoder("0:", source_demuxer="avfoundation", frame_format="bgr24", verbose=True, **ffparams).formulate()
+            ```
+
+    !!! fail "If these steps doesn't work for you then reach us out on [Gitter ➶][gitter] Community channel"
+
+=== "Capturing entire desktop" 
+
+    For capturing all your displays as one big contiguous display in FFdecoder API:
+
+    ```python
+    # import the necessary packages
+    from deffcode import FFdecoder
+    import cv2
+
+    # define framerate
+    ffparams = {"-framerate": "30"}
+
+    # initialize and formulate the decoder with ":0.0" desktop source for BGR24 output
+    decoder = FFdecoder(":0.0", source_demuxer="x11grab", frame_format="bgr24", verbose=True, **ffparams).formulate()
+
+    # grab the BGR24 frames from decoder
+    for frame in decoder.generateFrame():
+
+        # check if frame is None
+        if frame is None:
+            break
+
+        # {do something with the frame here}
+        
+        # Show output window
+        cv2.imshow("Output", frame)
+
+        # check for 'q' key if pressed
+        key = cv2.waitKey(1) & 0xFF
+        if key == ord("q"):
+            break
+
+    # close output window
+    cv2.destroyAllWindows()
+
+    # terminate the decoder
+    decoder.terminate()
+    ```
+
+
+=== "Capturing a region" 
+
+    For limit capturing to a region, and show the area being grabbed:
+
+    !!! info "`x_offset` and `y_offset` specify the offsets of the grabbed area with respect to the top-left border of the X11 screen. They default to `0`. "
+
+    ```python
+    # import the necessary packages
+    from deffcode import FFdecoder
+    import cv2
+
+    # define suitable parameters
+    ffparams = {
+        "-framerate": "30", # input framerate
+        "-ffprefixes": [
+            "-video_size", "1024x768", # frame size
+        ],
+    }
+
+    # initialize and formulate the decoder with ":0.0" desktop source(starting with the upper-left corner at x=10, y=20) 
+    # for BGR24 output
+    decoder = FFdecoder(":0.0+10,20", source_demuxer="x11grab", frame_format="bgr24", verbose=True, **ffparams).formulate()
+
+    # grab the BGR24 frames from decoder
+    for frame in decoder.generateFrame():
+
+        # check if frame is None
+        if frame is None:
+            break
+
+        # {do something with the frame here}
+        
+        # Show output window
+        cv2.imshow("Output", frame)
+
+        # check for 'q' key if pressed
+        key = cv2.waitKey(1) & 0xFF
+        if key == ord("q"):
+            break
+
+    # close output window
+    cv2.destroyAllWindows()
+
+    # terminate the decoder
+    decoder.terminate()
+    ```
+
+&nbsp;
+
+<!--
+External URLs
+-->
+[gitter]: https://gitter.im/deffcode-python/community
\ No newline at end of file
diff --git a/docs/recipes/basic/decode-network-streams.md b/docs/recipes/basic/decode-network-streams.md
new file mode 100644
index 0000000..7a8c0e6
--- /dev/null
+++ b/docs/recipes/basic/decode-network-streams.md
@@ -0,0 +1,149 @@
+<!--
+======================================================================
+DeFFcode library source-code is deployed under the Apache 2.0 License:
+
+Copyright (c) 2021 Abhishek Thakur(@abhiTronix) <abhi.una12@gmail.com>
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+   http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+======================================================================
+-->
+
+# :fontawesome-solid-cloud-arrow-down: Decoding Network Streams
+
+> Similar to decoding Video files, DeFFcode's FFdecoder API directly supports Network Streams with specific protocols _(such as RTSP/RTP, HTTP(s), MPEG-TS, etc.)_ as input to its [`source`](../../reference/sourcer/params/#source) parameter. 
+
+We'll discuss Network Streams support briefly in the following recipes:
+
+&thinsp;
+
+!!! warning "DeFFcode APIs requires FFmpeg executable"
+
+    ==DeFFcode APIs **MUST** requires valid FFmpeg executable for all of its core functionality==, and any failure in detection will raise `RuntimeError` immediately. Follow dedicated [FFmpeg Installation doc ➶](../../installation/ffmpeg_install/) for its installation.
+
+???+ info "Additional Python Dependencies for following recipes"
+
+    Following recipes requires additional python dependencies which can be installed easily as below:
+
+    - [x] **OpenCV:** OpenCV is required for previewing video frames. You can easily install it directly via [`pip`](https://pypi.org/project/opencv-python/):
+
+        ??? tip "OpenCV installation from source"
+
+            You can also follow online tutorials for building & installing OpenCV on [Windows](https://www.learnopencv.com/install-opencv3-on-windows/), [Linux](https://www.pyimagesearch.com/2018/05/28/ubuntu-18-04-how-to-install-opencv/), [MacOS](https://www.pyimagesearch.com/2018/08/17/install-opencv-4-on-macos/) and [Raspberry Pi](https://www.pyimagesearch.com/2018/09/26/install-opencv-4-on-your-raspberry-pi/) machines manually from its source. 
+
+            :warning: Make sure not to install both *pip* and *source* version together. Otherwise installation will fail to work!
+
+        ??? info "Other OpenCV binaries"
+
+            OpenCV mainainers also provide additional binaries via pip that contains both main modules and contrib/extra modules [`opencv-contrib-python`](https://pypi.org/project/opencv-contrib-python/), and for server (headless) environments like [`opencv-python-headless`](https://pypi.org/project/opencv-python-headless/) and [`opencv-contrib-python-headless`](https://pypi.org/project/opencv-contrib-python-headless/). You can also install ==any one of them== in similar manner. More information can be found [here](https://github.com/opencv/opencv-python#installation-and-usage).
+
+
+        ```sh
+        pip install opencv-python       
+        ```
+
+
+!!! note "Always use FFdecoder API's [`terminate()`](../../reference/ffdecoder/#deffcode.ffdecoder.FFdecoder.terminate) method at the end to avoid undesired behavior."
+
+??? danger "Never name your python script `deffcode.py`"
+
+    When trying out these recipes, never name your python script `deffcode.py` otherwise it will result in `ModuleNotFound` error.
+
+&thinsp;
+
+
+## Capturing and Previewing frames from a HTTPs Stream
+
+In this example we will decode live **BGR24** video frames from a HTTPs protocol Stream in FFdecoder API, and preview them using OpenCV Library's `cv2.imshow()` method.
+
+
+```python
+# import the necessary packages
+from deffcode import FFdecoder
+import cv2
+
+# initialize and formulate the decoder for BGR24 pixel format output
+decoder = FFdecoder("https://abhitronix.github.io/html/Big_Buck_Bunny_1080_10s_1MB.mp4", frame_format="bgr24").formulate()
+
+# grab the BGR24 frames from decoder
+for frame in decoder.generateFrame():
+
+    # check if frame is None
+    if frame is None:
+        break
+
+    # {do something with the frame here}
+    
+    # Show output window
+    cv2.imshow("Output", frame)
+
+    # check for 'q' key if pressed
+    key = cv2.waitKey(1) & 0xFF
+    if key == ord("q"):
+        break
+
+# close output window
+cv2.destroyAllWindows()
+
+# terminate the decoder
+decoder.terminate()
+```
+
+&nbsp;
+
+## Capturing and Previewing frames from a RTSP/RTP Stream
+
+In this example we will decode live **BGR24** video frames from RTSP/RTP protocol Streams in FFdecoder API, and preview them using OpenCV Library's `cv2.imshow()` method.
+
+!!! alert "This example assume you already have a RSTP Server running at specified RSTP address with syntax `rtsp://[RTSP_ADDRESS]:[RTSP_PORT]/[RTSP_PATH]` with video data already being published to it."
+
+!!! tip "For creating your own RSTP Server locally and publishing video data to it, You can refer this [WriteGear API's bonus example ➶](https://abhitronix.github.io/vidgear/dev/help/writegear_ex/#using-writegears-compression-mode-for-rtsprtp-live-streaming)"
+
+!!! danger "Make sure to change RSTP address `rtsp://localhost:8554/mystream` with yours in following code before running"
+
+```python
+# import the necessary packages
+from deffcode import FFdecoder
+import cv2
+
+# define suitable parameters
+ffparams = {"-rtsp_transport": "tcp"}
+
+# initialize and formulate the decoder with RTSP protocol source for BGR24 output
+# [WARNING] Change your RSTP address `rtsp://localhost:8554/mystream` with yours!
+decoder = FFdecoder("rtsp://localhost:8554/mystream", frame_format="bgr24", verbose=True, **ffparams).formulate()
+
+# grab the BGR24 frames from decoder
+for frame in decoder.generateFrame():
+
+    # check if frame is None
+    if frame is None:
+        break
+
+    # {do something with the frame here}
+    
+    # Show output window
+    cv2.imshow("Output", frame)
+
+    # check for 'q' key if pressed
+    key = cv2.waitKey(1) & 0xFF
+    if key == ord("q"):
+        break
+
+# close output window
+cv2.destroyAllWindows()
+
+# terminate the decoder
+decoder.terminate()
+```
+
+&nbsp;
\ No newline at end of file
diff --git a/docs/recipes/basic/decode-video-files.md b/docs/recipes/basic/decode-video-files.md
new file mode 100644
index 0000000..3938033
--- /dev/null
+++ b/docs/recipes/basic/decode-video-files.md
@@ -0,0 +1,252 @@
+<!--
+======================================================================
+DeFFcode library source-code is deployed under the Apache 2.0 License:
+
+Copyright (c) 2021 Abhishek Thakur(@abhiTronix) <abhi.una12@gmail.com>
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+   http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+======================================================================
+-->
+
+# :material-file-eye: Decoding Video files
+
+> DeFFcode's FFdecoder API readily supports multimedia Video files path as input to its [`source`](../../reference/sourcer/params/#source) parameter. And with its [`frame_format`](../../reference/sourcer/params/#frame_format) parameter, you can easily decode video frames in any pixel format(s) that are readily supported by all well known Computer Vision libraries _(such as OpenCV)_.  
+
+We'll discuss its video files support and pixel format capabilities briefly in the following recipes:
+
+&thinsp;
+
+!!! warning "DeFFcode APIs requires FFmpeg executable"
+
+    ==DeFFcode APIs **MUST** requires valid FFmpeg executable for all of its core functionality==, and any failure in detection will raise `RuntimeError` immediately. Follow dedicated [FFmpeg Installation doc ➶](../../../installation/ffmpeg_install/) for its installation.
+
+???+ info "Additional Python Dependencies for following recipes"
+
+    Following recipes requires additional python dependencies which can be installed easily as below:
+
+    - [x] **OpenCV:** OpenCV is required for previewing video frames. You can easily install it directly via [`pip`](https://pypi.org/project/opencv-python/):
+
+        ??? tip "OpenCV installation from source"
+
+            You can also follow online tutorials for building & installing OpenCV on [Windows](https://www.learnopencv.com/install-opencv3-on-windows/), [Linux](https://www.pyimagesearch.com/2018/05/28/ubuntu-18-04-how-to-install-opencv/), [MacOS](https://www.pyimagesearch.com/2018/08/17/install-opencv-4-on-macos/) and [Raspberry Pi](https://www.pyimagesearch.com/2018/09/26/install-opencv-4-on-your-raspberry-pi/) machines manually from its source. 
+
+            :warning: Make sure not to install both *pip* and *source* version together. Otherwise installation will fail to work!
+
+        ??? info "Other OpenCV binaries"
+
+            OpenCV mainainers also provide additional binaries via pip that contains both main modules and contrib/extra modules [`opencv-contrib-python`](https://pypi.org/project/opencv-contrib-python/), and for server (headless) environments like [`opencv-python-headless`](https://pypi.org/project/opencv-python-headless/) and [`opencv-contrib-python-headless`](https://pypi.org/project/opencv-contrib-python-headless/). You can also install ==any one of them== in similar manner. More information can be found [here](https://github.com/opencv/opencv-python#installation-and-usage).
+
+
+        ```sh
+        pip install opencv-python       
+        ```
+
+
+!!! note "Always use FFdecoder API's [`terminate()`](../../reference/ffdecoder/#deffcode.ffdecoder.FFdecoder.terminate) method at the end to avoid undesired behavior."
+
+??? danger "Never name your python script `deffcode.py`"
+
+    When trying out these recipes, never name your python script `deffcode.py` otherwise it will result in `ModuleNotFound` error.
+
+&thinsp;
+
+
+## Capturing RGB frames from a video file
+
+
+!!! abstract "The default function of FFdecoder API is to **decode 24-bit RGB video frames** from the given source."
+
+> FFdecoder API's [`generateFrame()`](../../reference/ffdecoder/#deffcode.ffdecoder.FFdecoder.generateFrame) function can be used both as a **Generator** _(Recommended Approach)_ and **Iterator**. 
+
+In this example we will decode the default **RGB24** video frames from a given Video file _(say `foo.mp4`)_ using both approaches:
+
+
+=== "As a Generator (Recommended)"
+
+    !!! quote "This is a recommended approach for faster and safer decoding."
+
+    ```python
+    # import the necessary packages
+    from deffcode import FFdecoder
+
+    # initialize and formulate the decoder
+    decoder = FFdecoder("foo.mp4").formulate()
+
+    # grab RGB24(default) frame from decoder
+    for frame in decoder.generateFrame():
+
+        # check if frame is None
+        if frame is None:
+            break
+
+        # {do something with the frame here}
+
+        # lets print its shape
+        print(frame.shape) # for e.g. (1080, 1920, 3)
+
+    # terminate the decoder
+    decoder.terminate()
+    ```
+
+=== "As a Iterator"
+
+    !!! quote "This Iterator Approach bears a close resemblance to **OpenCV-Python** _(Python API for OpenCV)_ coding syntax, thereby easier to learn and remember."
+
+    ```python
+    # import the necessary packages
+    from deffcode import FFdecoder
+
+    # initialize and formulate the decoder
+    decoder = FFdecoder("foo.mp4").formulate()
+
+    # loop over frames
+    while True:
+
+        # grab RGB24(default) frames from decoder
+        frame = next(decoder.generateFrame(), None)
+
+        # check if frame is None
+        if frame is None:
+            break
+
+        # {do something with the frame here}
+        
+        # lets print its shape
+        print(frame.shape) # for e.g. (1080, 1920, 3)
+
+    # terminate the decoder
+    decoder.terminate()
+    ```
+
+
+&nbsp;
+
+## Capturing and Previewing BGR frames from a video file
+
+In this example we will decode **OpenCV supported** live **BGR24** video frames from a given Video file _(say `foo.mp4`)_ in FFdecoder API, and preview them using OpenCV Library's `cv2.imshow()` method.
+
+!!! alert "By default, OpenCV expects `BGR` format frames in its `cv2.imshow()` method."
+
+```python
+# import the necessary packages
+from deffcode import FFdecoder
+import cv2
+
+# initialize and formulate the decoder for BGR24 pixel format output
+decoder = FFdecoder("foo.mp4", frame_format="bgr24").formulate()
+
+# grab the BGR24 frames from decoder
+for frame in decoder.generateFrame():
+
+    # check if frame is None
+    if frame is None:
+        break
+
+    # {do something with the frame here}
+    
+    # Show output window
+    cv2.imshow("Output", frame)
+
+    # check for 'q' key if pressed
+    key = cv2.waitKey(1) & 0xFF
+    if key == ord("q"):
+        break
+
+# close output window
+cv2.destroyAllWindows()
+
+# terminate the decoder
+decoder.terminate()
+```
+
+&nbsp;
+
+## Playing with any other FFmpeg pixel formats
+
+!!! abstract "Similar to BGR, you can input any pixel format _(supported by installed FFmpeg)_ by way of `frame_format` parameter of FFdecoder API for the desired video frame format."
+
+In this example we will decode live **Grayscale** and **YUV** video frames from a given Video file _(say `foo.mp4`)_ in FFdecoder API, and preview them using OpenCV Library's `cv2.imshow()` method.
+
+!!! tip "Use `#!sh ffmpeg -pix_fmts` terminal command to lists all FFmpeg supported pixel formats."
+
+=== "Decode Grayscale"
+
+    ```python
+    # import the necessary packages
+    from deffcode import FFdecoder
+    import cv2
+
+    # initialize and formulate the decoder for GRAYSCALE output
+    decoder = FFdecoder("input_foo.mp4", frame_format="gray", verbose=True).formulate()
+
+    # grab the GRAYSCALE frames from the decoder
+    for gray in decoder.generateFrame():
+
+        # check if frame is None
+        if gray is None:
+            break
+
+        # {do something with the gray frame here}
+        
+        # Show output window
+        cv2.imshow("Gray Output", gray)
+
+        # check for 'q' key if pressed
+        key = cv2.waitKey(1) & 0xFF
+        if key == ord("q"):
+            break
+
+    # close output window
+    cv2.destroyAllWindows()
+
+    # terminate the decoder
+    decoder.terminate()
+    ```
+
+=== "Decode YUV"
+
+    !!! info "You can also use `yuv422p`(4:2:2 subsampling) or `yuv444p`(4:4:4 subsampling) instead for more higher dynamic range."
+
+    ```python
+    # import the necessary packages
+    from deffcode import FFdecoder
+    import cv2
+
+    # initialize and formulate the decoder for YUV420 output
+    decoder = FFdecoder("input_foo.mp4", frame_format="yuv420p", verbose=True).formulate()
+
+    # grab the YUV420 frames from the decoder
+    for yuv in decoder.generateFrame():
+
+        # check if frame is None
+        if yuv is None:
+            break
+
+        # {do something with the yuv frame here}
+        
+        # Show output window
+        cv2.imshow("YUV Output", yuv)
+
+        # check for 'q' key if pressed
+        key = cv2.waitKey(1) & 0xFF
+        if key == ord("q"):
+            break
+
+    # close output window
+    cv2.destroyAllWindows()
+    
+    # terminate the decoder
+    decoder.terminate()
+    ```
+
+&nbsp;
\ No newline at end of file
diff --git a/docs/recipes/basic/extract-video-metadata.md b/docs/recipes/basic/extract-video-metadata.md
new file mode 100644
index 0000000..0c84280
--- /dev/null
+++ b/docs/recipes/basic/extract-video-metadata.md
@@ -0,0 +1,149 @@
+<!--
+======================================================================
+DeFFcode library source-code is deployed under the Apache 2.0 License:
+
+Copyright (c) 2021 Abhishek Thakur(@abhiTronix) <abhi.una12@gmail.com>
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+   http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+======================================================================
+-->
+
+# :material-file-cog: Extracting Video Metadata
+
+> DeFFcode's Sourcer API acts as **Source Probing Utility** for easily probing metadata information for each multimedia stream available in the given video source, and return it as in Human-readable _(as JSON string)_ or Machine-readable _(as Dictionary object)_ type with its [`retrieve_metadata()`](../../reference/sourcer/#deffcode.sourcer.Sourcer.retrieve_metadata) class method. Apart from this, you can also use [`metadata`](../../reference/ffdecoder/#deffcode.ffdecoder.FFdecoder.metadata) property object in FFdecoder API to extract this metadata information _(only as JSON string)_.
+
+We'll discuss video metadata extraction using both these APIs briefly in the following recipes:
+
+&thinsp;
+
+!!! warning "DeFFcode APIs requires FFmpeg executable"
+
+    ==DeFFcode APIs **MUST** requires valid FFmpeg executable for all of its core functionality==, and any failure in detection will raise `RuntimeError` immediately. Follow dedicated [FFmpeg Installation doc ➶](../../../installation/ffmpeg_install/) for its installation.
+
+??? danger "Never name your python script `deffcode.py`"
+
+    When trying out these recipes, never name your python script `deffcode.py` otherwise it will result in `ModuleNotFound` error.
+
+&thinsp;
+
+## Extracting video metadata using Sourcer API
+
+!!! quote "This is the recommended way for extracting video metadata."
+
+In this example we will probe all metadata information available within `foo.mp4` video file on :fontawesome-brands-windows: Windows machine, and print it in both Human-readable _(as JSON string)_ and Machine-readable _(as Dictionary object)_ types using `retrieve_metadata()` class method in Sourcer API:
+
+!!! info "The Sourcer API's `retrieve_metadata()` class method provides `pretty_json` boolean parameter to return metadata as JSON string _(if `True`)_ and as Dictionary _(if `False`)_."
+
+=== "As JSON string"
+
+    ```python
+    # import the necessary packages
+    from deffcode import Sourcer
+
+    # initialize and formulate the decoder using suitable source
+    sourcer = Sourcer("foo.mp4").probe_stream()
+
+    # print metadata as `json.dump`
+    print(sourcer.retrieve_metadata(pretty_json=True))
+    ```
+    ???+ abstract "After running above python code, the resultant Terminal Output will look something as following on :fontawesome-brands-windows:Windows machine:"
+        ```json
+        {
+          "ffmpeg_binary_path": "C:\\Users\\foo\\AppData\\Local\\Temp\\ffmpeg-static-win64-gpl/bin/ffmpeg.exe",
+          "source": "foo.mp4",
+          "source_extension": ".mp4",
+          "source_video_resolution": [
+            1280,
+            720
+          ],
+          "source_video_framerate": 25.0,
+          "source_video_pixfmt": "yuv420p",
+          "source_video_decoder": "h264",
+          "source_duration_sec": 5.31,
+          "approx_video_nframes": 133,
+          "source_video_bitrate": "1205k",
+          "source_audio_bitrate": "384k",
+          "source_audio_samplerate": "48000 Hz",
+          "source_has_video": true,
+          "source_has_audio": true,
+          "source_has_image_sequence": false,
+        }
+        ```
+
+=== "As Dictionary object"
+
+    ```python
+    # import the necessary packages
+    from deffcode import Sourcer
+
+    # initialize and formulate the decoder using suitable source
+    sourcer = Sourcer("foo.mp4").probe_stream()
+
+    # print metadata as `dict`
+    print(sourcer.retrieve_metadata())
+    ```
+    
+    ???+ abstract "After running above python code, the resultant Terminal Output will look something as following on :fontawesome-brands-windows:Windows machine:"
+        ```py
+        {'ffmpeg_binary_path': 'C:\\Users\\foo\\AppData\\Local\\Temp\\ffmpeg-static-win64-gpl/bin/ffmpeg.exe', 'source': 'foo.mp4', 'source_extension': '.mp4', 'source_video_resolution': [1280, 720], 'source_video_framerate': 25.0, 'source_video_pixfmt': 'yuv420p', 'source_video_decoder': 'h264', 'source_duration_sec': 5.31, 'approx_video_nframes': 133, 'source_video_bitrate': '1205k', 'source_audio_bitrate': '384k', 'source_audio_samplerate': '48000 Hz', 'source_has_video': True, 'source_has_audio': True, 'source_has_image_sequence': False}
+    
+        ```
+
+&nbsp;
+
+## Extracting video metadata using FFdecoder API
+
+In this example we will probe all metadata information available within `foo.mp4` video file on :fontawesome-brands-windows: Windows machine, and print it as JSON string using  [`metadata`](../../reference/ffdecoder/#deffcode.ffdecoder.FFdecoder.metadata) property object in FFdecoder API.
+
+!!! note "You can also update video's metadata by using the same overloaded [`metadata`](../../reference/ffdecoder/#deffcode.ffdecoder.FFdecoder.metadata) property object in FFdecoder API. More information can be found in this [Advanced Recipe :material-pot-steam: ➶](../../advanced/update-metadata/#updating-source-video-metadata-in-ffdecoder-api)"
+
+```python
+# import the necessary packages
+from deffcode import FFdecoder
+
+# initialize and formulate the decoder using suitable source
+decoder = FFdecoder("foo.mp4").formulate()
+
+# print metadata as `json.dump`
+print(decoder.metadata)
+
+# terminate the decoder
+decoder.terminate()
+```
+??? abstract "After running above python code, the resultant Terminal Output will look something as following on :fontawesome-brands-windows:Windows machine:"
+    ```json
+    {
+      "ffmpeg_binary_path": "C:\\Users\\foo\\AppData\\Local\\Temp\\ffmpeg-static-win64-gpl/bin/ffmpeg.exe",
+      "source": "foo.mp4",
+      "source_extension": ".mp4",
+      "source_video_resolution": [
+        1280,
+        720
+      ],
+      "source_video_framerate": 25.0,
+      "source_video_pixfmt": "yuv420p",
+      "source_video_decoder": "h264",
+      "source_duration_sec": 5.31,
+      "approx_video_nframes": 133,
+      "source_video_bitrate": "1205k",
+      "source_audio_bitrate": "384k",
+      "source_audio_samplerate": "48000 Hz",
+      "source_has_video": true,
+      "source_has_audio": true,
+      "source_has_image_sequence": false,
+      "ffdecoder_operational_mode": "Video-Only",
+      "output_frames_pixfmt": "rgb24"
+    }
+    ```
+
+&nbsp;
\ No newline at end of file
diff --git a/docs/recipes/basic/index.md b/docs/recipes/basic/index.md
new file mode 100644
index 0000000..ef8fe6d
--- /dev/null
+++ b/docs/recipes/basic/index.md
@@ -0,0 +1,110 @@
+<!--
+===============================================
+DeFFcode library source-code is deployed under the Apache 2.0 License:
+
+Copyright (c) 2021 Abhishek Thakur(@abhiTronix) <abhi.una12@gmail.com>
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+   http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+===============================================
+-->
+
+# Basic Recipes :cake:
+
+
+The following recipes should be reasonably accessible to beginners of any skill level to get started with DeFFcode APIs:
+
+
+<figure>
+<img src="https://c.tenor.com/uYqsM9uIyuYAAAAC/simple-easy.gif" loading="lazy" alt="easy-easy-game-easy-life-deal-with-it" />
+<figcaption>Courtesy - <a href="https://tenor.com/view/simple-easy-easy-game-easy-life-deal-with-it-gif-9276124">tenor</a></figcaption>
+</figure>
+
+!!! alert "Refer Installation doc first!"
+
+    If this is your first time using DeFFcode, head straight to the **[Installation Notes](../../installation/#installation-notes) to install DeFFcode with required prerequisites on your machine**.
+
+
+??? tip "Any proficiency with OpenCV-Python will be Helpful"
+    
+    If you've any proficiency with [**OpenCV-Python**](https://docs.opencv.org/4.x/d6/d00/tutorial_py_root.html) _(Python API for OpenCV)_, you will find these recipes really easy. 
+
+??? question "Wanna suggest any improvements or additional recipes?"
+
+    Please feel free to suggest any improvements or additional recipes on our [**Gitter community channel ➶**][gitter]
+
+??? info "Frames are actually 3D Numpy arrays"
+    
+    In python, "**Frames**" are actually three-dimensional :material-video-3d: [NumPy `ndarray`](https://numpy.org/doc/stable/reference/arrays.ndarray.html) composed of 3 nested levels of arrays, one for each dimension.
+
+
+&thinsp;
+
+## Basic :material-movie-play: Decoding Recipes
+
+- [x] **[:material-file-eye: Decoding Video files](../basic/decode-video-files/#decoding-video-files)**
+    - [Capturing RGB frames from a video file](../basic/decode-video-files/#capturing-rgb-frames-from-a-video-file)
+    - [Capturing and Previewing BGR frames from a video file](../basic/decode-video-files/#capturing-and-previewing-bgr-frames-from-a-video-file) _(OpenCV Support)_
+    - [Playing with any other FFmpeg pixel formats](../basic/decode-video-files/#capturing-and-previewing-bgr-frames-from-a-video-file)
+- [x] **[:material-webcam: Decoding Live Feed Devices](../basic/decode-live-feed-devices/#decoding-live-feed-devices)**
+    - [Capturing and Previewing frames from a Webcam](../basic/decode-live-feed-devices/#capturing-and-previewing-frames-from-a-webcam)
+    - [Capturing and Previewing frames from your Desktop](../basic/decode-live-feed-devices/#capturing-and-previewing-frames-from-your-desktop) _(Screen Recording)_
+- [x] **[:fontawesome-solid-cloud-arrow-down: Decoding Network Streams](../basic/decode-network-streams/#decoding-network-streams)**
+    - [Capturing and Previewing frames from a HTTPs Stream](../basic/decode-network-streams/#capturing-and-previewing-frames-from-a-https-stream)
+    - [Capturing and Previewing frames from a RTSP/RTP Stream](../basic/decode-network-streams/#capturing-and-previewing-frames-from-a-rtsprtp-stream)
+- [x] **[:material-image-multiple: Decoding Image sequences](../basic/decode-image-sequences/#decoding-image-sequences)**
+    - [Capturing and Previewing frames from Sequence of images](../basic/decode-image-sequences/#capturing-and-previewing-frames-from-sequence-of-images)
+    - [Capturing and Previewing frames from Single looping image](../basic/decode-image-sequences/#capturing-and-previewing-frames-from-single-looping-image)
+
+<div class="spacer"></div>
+
+## Basic :material-movie-edit: Transcoding Recipes
+
+- [x] **[:material-video-image: Transcoding Live frames](../basic/transcode-live-frames/)**
+    - [Transcoding video using OpenCV VideoWriter API](../basic/transcode-live-frames/#transcoding-video-using-opencv-videowriter-api)
+    - [Transcoding lossless video using WriteGear API](../basic/transcode-live-frames/#transcoding-lossless-video-using-writegear-api)
+- [x] **[:material-movie-filter: Transcoding Live Simple Filtergraphs](../basic/transcode-live-frames-simplegraphs/#transcoding-live-simple-filtergraphs)**
+    - [Transcoding Trimmed and Reversed video](../basic/transcode-live-frames-simplegraphs/#transcoding-trimmed-and-reversed-video)
+    - [Transcoding Cropped video](../basic/transcode-live-frames-simplegraphs/#transcoding-cropped-video)
+    - [Transcoding Rotated video (with `rotate` filter)](../basic/transcode-live-frames-simplegraphs/#transcoding-rotated-video-with-rotate-filter)
+    - [Transcoding Rotated video (with `transpose` filter)](../basic/transcode-live-frames-simplegraphs/#transcoding-rotated-video-with-transpose-filter)   
+    - [Transcoding Horizontally flipped and Scaled video](../basic/transcode-live-frames-simplegraphs/#transcoding-horizontally-flipped-and-scaled-video)
+- [x] **[:material-fast-forward-60: Saving Key-frames as Image](../basic/save-keyframe-image/#saving-key-frames-as-image)** _(Image processing)_
+    - [Extracting Key-frames as PNG image](../basic/save-keyframe-image/#extracting-key-frames-as-png-image)
+    - [Generating Thumbnail with a Fancy filter](../basic/save-keyframe-image/#generating-thumbnail-with-a-fancy-filter)
+
+<div class="spacer"></div>
+
+## Basic :material-movie-search: Metadata Recipes
+
+- [x] **[:material-file-cog: Extracting Video Metadata](../basic/extract-video-metadata/#extracting-video-metadata)**
+    - [Extracting video metadata using Sourcer API](../basic/extract-video-metadata/#extracting-video-metadata-using-sourcer-api)
+    - [Extracting video metadata using FFdecoder API](../basic/extract-video-metadata/#extracting-video-metadata-using-ffdecoder-api)
+
+
+
+&thinsp;
+
+
+## What's next?
+
+!!! success "Done already! Let's checkout [Advanced Recipes :croissant:](../advanced) to level up :fontawesome-solid-arrow-up-wide-short: your skills! " 
+
+
+&thinsp;
+
+
+<!--
+External URLs
+-->
+[gitter]: https://gitter.im/deffcode-python/community
+[ffmpeg]:https://www.ffmpeg.org/
\ No newline at end of file
diff --git a/docs/recipes/basic/save-keyframe-image.md b/docs/recipes/basic/save-keyframe-image.md
new file mode 100644
index 0000000..911e4e7
--- /dev/null
+++ b/docs/recipes/basic/save-keyframe-image.md
@@ -0,0 +1,268 @@
+<!--
+======================================================================
+DeFFcode library source-code is deployed under the Apache 2.0 License:
+
+Copyright (c) 2021 Abhishek Thakur(@abhiTronix) <abhi.una12@gmail.com>
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+   http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+======================================================================
+-->
+
+# :material-fast-forward-60: Saving Key-frames as Image
+
+
+> DeFFcode's FFdecoder API provide effortless and precise **Frame Seeking** with `-ss` FFmpeg parameter that enable us to save any frame from a specific part of our input source.  
+
+We'll discuss aboout it briefly in the following recipes:
+
+&thinsp;
+
+!!! warning "DeFFcode APIs requires FFmpeg executable"
+
+    ==DeFFcode APIs **MUST** requires valid FFmpeg executable for all of its core functionality==, and any failure in detection will raise `RuntimeError` immediately. Follow dedicated [FFmpeg Installation doc ➶](../../../installation/ffmpeg_install/) for its installation.
+
+???+ info "Additional Python Dependencies for following recipes"
+
+    Following recipes requires additional python dependencies which can be installed easily as below:
+
+    - [x] **OpenCV:** OpenCV is required for saving video frames. You can easily install it directly via [`pip`](https://pypi.org/project/opencv-python/):
+
+        ??? tip "OpenCV installation from source"
+
+            You can also follow online tutorials for building & installing OpenCV on [Windows](https://www.learnopencv.com/install-opencv3-on-windows/), [Linux](https://www.pyimagesearch.com/2018/05/28/ubuntu-18-04-how-to-install-opencv/), [MacOS](https://www.pyimagesearch.com/2018/08/17/install-opencv-4-on-macos/) and [Raspberry Pi](https://www.pyimagesearch.com/2018/09/26/install-opencv-4-on-your-raspberry-pi/) machines manually from its source. 
+
+            :warning: Make sure not to install both *pip* and *source* version together. Otherwise installation will fail to work!
+
+        ??? info "Other OpenCV binaries"
+
+            OpenCV mainainers also provide additional binaries via pip that contains both main modules and contrib/extra modules [`opencv-contrib-python`](https://pypi.org/project/opencv-contrib-python/), and for server (headless) environments like [`opencv-python-headless`](https://pypi.org/project/opencv-python-headless/) and [`opencv-contrib-python-headless`](https://pypi.org/project/opencv-contrib-python-headless/). You can also install ==any one of them== in similar manner. More information can be found [here](https://github.com/opencv/opencv-python#installation-and-usage).
+
+
+        ```sh
+        pip install opencv-python       
+        ```
+
+    - [x] **Pillow:** Pillow is a Imaging Library required for saving frame as Image. You can easily install it directly via [`pip`](https://pypi.org/project/opencv-python/):
+
+        ```sh
+        pip install Pillow     
+        ```
+
+    - [x] **Matplotlib:** Matplotlib is a comprehensive library for creating static, animated, and interactive visualizations, also required for saving frame as Image. You can easily install it directly via [`pip`](https://pypi.org/project/opencv-python/):
+
+        ```sh
+        pip install matplotlib   
+        ```
+
+    - [x] **Imageio:** Imageio is a Library for reading and writing a wide range of image, video, scientific, and volumetric data formats, also required for saving frame as Image. You can easily install it directly via [`pip`](https://pypi.org/project/opencv-python/):
+
+        ```sh
+        pip install imageio      
+        ```
+
+
+!!! note "Always use FFdecoder API's [`terminate()`](../../reference/ffdecoder/#deffcode.ffdecoder.FFdecoder.terminate) method at the end to avoid undesired behavior."
+
+??? danger "Never name your python script `deffcode.py`"
+
+    When trying out these recipes, never name your python script `deffcode.py` otherwise it will result in `ModuleNotFound` error.
+
+&thinsp;
+
+## Extracting Key-frames as PNG image
+
+In this example we will seek to `00:00:01.45`_(or 1045msec)_ in time and decode one single frame in FFdecoder API, and thereby saving it as PNG image using few prominent Image processing python libraries by providing valid filename _(e.g. `foo_image.png`)_.
+
+??? tip "Time unit syntax in `-ss` FFmpeg parameter"
+    
+    You can use two different time unit formats with `-ss` FFmpeg parameter: 
+    - [x] **Sexagesimal(in seconds):** Uses *(HOURS:MM:SS.MILLISECONDS)*, such as in `01:23:45.678`
+    - [x] **Fractional:** such as in `02:30.05`, this is interpreted as 2 minutes, 30 seconds, and a half a second, which would be the same as using 150.5 in seconds.
+
+=== "Using Pillow"
+
+    In Pillow, the `fromarray()` function can be used to create an image memory from an **RGB** frame:
+
+    ```python
+    # import the necessary packages
+    from deffcode import FFdecoder
+    from PIL import Image
+
+    # define the FFmpeg parameter to seek to 00:00:01.45(or 1s and 45msec)
+    # in time and get one single frame
+    ffparams = {"-ss": "00:00:01.45", "-frames:v": 1}
+
+    # initialize and formulate the decoder with suitable source
+    decoder = FFdecoder("foo.mp4", **ffparams).formulate()
+
+    # grab the RGB24(default) frame from the decoder
+    frame = next(decoder.generateFrame(), None)
+
+    # check if frame is None
+    if not (frame is None):
+        # Convert to Image
+        im = Image.fromarray(frame)
+        # Save Image as PNG
+        im.save("foo_image.png")
+    else:
+        raise ValueError("Something is wrong!")
+
+    # terminate the decoder
+    decoder.terminate()
+    ```
+
+=== "Using OpenCV"
+
+    In OpenCV, the `imwrite()` function can export **BGR** frame as an image file:
+
+    ```python
+    # import the necessary packages
+    from deffcode import FFdecoder
+    import cv2
+
+    # define the FFmpeg parameter to seek to 00:00:01.45(or 1s and 45msec) 
+    # in time and get one single frame
+    ffparams = {"-ss": "00:00:01.45", "-frames:v":1}
+
+    # initialize and formulate the decoder for BGR24 outputwith suitable source
+    decoder = FFdecoder("foo.mp4", frame_format="bgr24", **ffparams).formulate()
+
+    # grab the BGR24 frame from the decoder
+    frame = next(decoder.generateFrame(), None)
+
+    # check if frame is None
+    if not(frame is None):
+        # Save our image as PNG
+        cv2.imwrite('foo_image.png', frame)
+    else:
+        raise ValueError("Something is wrong!")
+
+    # terminate the decoder
+    decoder.terminate()
+    ```
+
+=== "Using Matplotlib"
+
+    In Matplotlib, the `imsave()` function can save an **RGB** frame as an image file:
+
+    ```python
+    # import the necessary packages
+    from deffcode import FFdecoder
+    import matplotlib.pyplot as plt
+
+    # define the FFmpeg parameter to seek to 00:00:01.45(or 1s and 45msec) 
+    # in time and get one single frame
+    ffparams = {"-ss": "00:00:01.45", "-frames:v":1}
+
+    # initialize and formulate the decoder with suitable source
+    decoder = FFdecoder("foo.mp4", **ffparams).formulate()
+
+    # grab the RGB24(default) frame from the decoder
+    frame = next(decoder.generateFrame(), None)
+
+    # check if frame is None
+    if not(frame is None):
+        # Save our image as PNG
+        plt.imsave('foo_image.png', frame)
+    else:
+        raise ValueError("Something is wrong!")
+
+    # terminate the decoder
+    decoder.terminate()
+    ```
+
+=== "Using Imageio"
+
+    In Imageio, the `imwrite()` function can be used to create an image memory from an **RGB** frame:
+
+    ```python
+    # import the necessary packages
+    from deffcode import FFdecoder
+    import imageio
+
+    # define the FFmpeg parameter to seek to 00:00:01.45(or 1s and 45msec) 
+    # in time and get one single frame
+    ffparams = {"-ss": "00:00:01.45", "-frames:v":1}
+
+    # initialize and formulate the decoder with suitable source
+    decoder = FFdecoder("foo.mp4", **ffparams).formulate()
+
+    # grab the RGB24(default) frame from the decoder
+    frame = next(decoder.generateFrame(), None)
+
+    # check if frame is None
+    if not(frame is None):
+        # Save our output
+        imageio.imwrite('foo_image.jpeg', frame)
+    else:
+        raise ValueError("Something is wrong!")
+
+    # terminate the decoder
+    decoder.terminate()
+    ```
+
+&nbsp;
+
+
+## Generating Thumbnail with a Fancy filter
+
+<figure>
+<img src="../../../assets/images/fancy_thumbnail.jpg" loading="lazy" alt="fancy_thumbnail.jpg" title="fancy_thumbnail.jpg" />
+<figcaption><code>fancy_thumbnail.jpg</code> (Courtesy - <a href="https://peach.blender.org/trailer-page/">BigBuckBunny</a>)</figcaption>
+</figure>
+
+In this example we first apply FFmpeg’s `tblend` filter  with an `hardmix` blend mode _(cool stuff)_ and then seek to `00:00:25.917`_(or 25.917sec)_ in time to retrieve our single frame thumbnail, and thereby save it as JPEG image with valid filename _(e.g. `fancy_thumbnail.jpg`)_ using Pillow library.
+
+??? tip "Time unit syntax in `-ss` FFmpeg parameter"
+    
+    You can use two different time unit formats with `-ss` FFmpeg parameter: 
+    - [x] **Sexagesimal(in seconds):** Uses *(HOURS:MM:SS.MILLISECONDS)*, such as in `01:23:45.678`
+    - [x] **Fractional:** such as in `02:30.05`, this is interpreted as 2 minutes, 30 seconds, and a half a second, which would be the same as using 150.5 in seconds.
+
+??? info "Available blend mode options" 
+
+    **Other blend mode options for `tblend` filter include:** `addition`, `addition128`, `grainmerge`, `and`, `average`, `burn`, `darken`, `difference`, `difference128`, `grainextract`, `divide`, `dodge`, `freeze`, `exclusion`, `extremity`, `glow`, `hardlight`, `hardmix`, `heat`, `lighten`, `linearlight`, `multiply`, `multiply128`, `negation`, `normal`, `or`, `overlay`, `phoenix`, `pinlight`, `reflect`, `screen`, `softlight`, `subtract`, `vividlight`, `xor`
+
+```python
+# import the necessary packages
+from deffcode import FFdecoder
+from PIL import Image
+
+# define the FFmpeg parameter to
+ffparams = {
+    "-vf": "tblend=all_mode='hardmix'",  # trim and reverse
+    "-ss": "00:00:25.917",  # seek to 00:00:25.917(or 25s 917msec)
+    "-frames:v": 1,  # get one single frame
+}
+
+# initialize and formulate the decoder with suitable source
+decoder = FFdecoder("BigBuckBunny.mp4", **ffparams).formulate()
+
+# grab the RGB24(default) frame from the decoder
+frame = next(decoder.generateFrame(), None)
+
+# check if frame is None
+if not (frame is None):
+    # Convert to Image
+    im = Image.fromarray(frame)
+    # Save Image as JPEG
+    im.save("fancy_thumbnail.jpg")
+else:
+    raise ValueError("Something is wrong!")
+
+# terminate the decoder
+decoder.terminate()
+
+```
+
+&nbsp;
\ No newline at end of file
diff --git a/docs/recipes/basic/transcode-live-frames-simplegraphs.md b/docs/recipes/basic/transcode-live-frames-simplegraphs.md
new file mode 100644
index 0000000..665e336
--- /dev/null
+++ b/docs/recipes/basic/transcode-live-frames-simplegraphs.md
@@ -0,0 +1,390 @@
+<!--
+======================================================================
+DeFFcode library source-code is deployed under the Apache 2.0 License:
+
+Copyright (c) 2021 Abhishek Thakur(@abhiTronix) <abhi.una12@gmail.com>
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+   http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+======================================================================
+-->
+
+# :material-movie-filter: Transcoding Live Simple Filtergraphs
+
+??? abstract "What are Simple filtergraphs?"
+
+    Before heading straight into recipes we will talk about Simple filtergraphs: 
+    
+    > Simple filtergraphs are those filters that have exactly one input and output, both of the same type. 
+
+    They can be processed by simply inserting an additional step between decoding and encoding of video frames:
+
+    ![Simple filtergraphs](../../../assets/images/simplefiltergraphs.png){ loading=lazy }
+
+    Simple filtergraphs are configured with the per-stream `-filter` option _(with `-vf` for video)_. 
+
+
+> DeFFcode's FFdecoder API handles a single chain of filtergraphs _(through `-vf` FFmpeg parameter)_ to the to real-time frames quite effortlessly. 
+
+We'll discuss the transcoding of live simple filtergraphs in the following recipes:
+
+&thinsp;
+
+!!! warning "DeFFcode APIs requires FFmpeg executable"
+
+    ==DeFFcode APIs **MUST** requires valid FFmpeg executable for all of its core functionality==, and any failure in detection will raise `RuntimeError` immediately. Follow dedicated [FFmpeg Installation doc ➶](../../../installation/ffmpeg_install/) for its installation.
+
+???+ info "Additional Python Dependencies for following recipes"
+
+    Following recipes requires additional python dependencies which can be installed easily as below:
+
+    - [x] **OpenCV:** OpenCV is required for previewing and encoding video frames. You can easily install it directly via [`pip`](https://pypi.org/project/opencv-python/):
+
+        ??? tip "OpenCV installation from source"
+
+            You can also follow online tutorials for building & installing OpenCV on [Windows](https://www.learnopencv.com/install-opencv3-on-windows/), [Linux](https://www.pyimagesearch.com/2018/05/28/ubuntu-18-04-how-to-install-opencv/), [MacOS](https://www.pyimagesearch.com/2018/08/17/install-opencv-4-on-macos/) and [Raspberry Pi](https://www.pyimagesearch.com/2018/09/26/install-opencv-4-on-your-raspberry-pi/) machines manually from its source. 
+
+            :warning: Make sure not to install both *pip* and *source* version together. Otherwise installation will fail to work!
+
+        ??? info "Other OpenCV binaries"
+
+            OpenCV mainainers also provide additional binaries via pip that contains both main modules and contrib/extra modules [`opencv-contrib-python`](https://pypi.org/project/opencv-contrib-python/), and for server (headless) environments like [`opencv-python-headless`](https://pypi.org/project/opencv-python-headless/) and [`opencv-contrib-python-headless`](https://pypi.org/project/opencv-contrib-python-headless/). You can also install ==any one of them== in similar manner. More information can be found [here](https://github.com/opencv/opencv-python#installation-and-usage).
+
+
+        ```sh
+        pip install opencv-python       
+        ```
+
+!!! note "Always use FFdecoder API's [`terminate()`](../../reference/ffdecoder/#deffcode.ffdecoder.FFdecoder.terminate) method at the end to avoid undesired behavior."
+
+!!! alert "OpenCV's' [`VideoWriter()`](https://docs.opencv.org/3.4/dd/d9e/classcv_1_1VideoWriter.html#ad59c61d8881ba2b2da22cff5487465b5) class lacks the ability to control output quality, bitrate, compression, and other important features which are only available with VidGear's WriteGear API."
+
+&thinsp;
+
+
+## Transcoding Trimmed and Reversed video
+
+<figure markdown>
+  ![Big Buck Bunny Reversed](../../../assets/gifs/bigbuckbunny_reversed.gif)
+  <figcaption>Big Buck Bunny Reversed</figcaption>
+</figure>
+
+
+In this example we will take the first 5 seconds of a video clip _(using [`trim`](https://ffmpeg.org/ffmpeg-filters.html#toc-trim) filter)_ and reverse it _(by applying [`reverse`](https://ffmpeg.org/ffmpeg-filters.html#toc-reverse) filter)_, and encode them using OpenCV Library's [`VideoWriter()`](https://docs.opencv.org/3.4/dd/d9e/classcv_1_1VideoWriter.html#ad59c61d8881ba2b2da22cff5487465b5) method in real-time. 
+
+!!! info "OpenCV's `VideoWriter()` class requires a valid Output filename _(e.g. output_foo.avi)_, [FourCC](https://www.fourcc.org/fourcc.php) code, framerate, and resolution as input."
+
+!!! tip "You can use FFdecoder's [`metadata`](../../reference/ffdecoder/#deffcode.ffdecoder.FFdecoder.metadata) property object that dumps source Video's metadata information _(as JSON string)_ to retrieve source framerate and resolution."
+
+!!! alert "By default, OpenCV expects `BGR` format frames in its `cv2.write()` method."
+
+```python
+# import the necessary packages
+from deffcode import FFdecoder
+import json, cv2
+
+# define the Video Filter definition
+# trim 5 sec from end and reverse
+ffparams = {
+    "-vf": "trim=end=5,reverse" 
+}
+
+# initialize and formulate the decoder for BGR24 output with given params
+decoder = FFdecoder(
+    "foo.mp4", frame_format="bgr24", verbose=True, **ffparams
+).formulate()
+
+# retrieve JSON Metadata and convert it to dict
+metadata_dict = json.loads(decoder.metadata)
+
+# prepare OpenCV parameters
+FOURCC = cv2.VideoWriter_fourcc("M", "J", "P", "G")
+FRAMERATE = metadata_dict["source_video_framerate"]
+FRAMESIZE = tuple(metadata_dict["source_video_resolution"])
+
+# Define writer with parameters and suitable output filename for e.g. `output_foo.avi`
+writer = cv2.VideoWriter("output_foo.avi", FOURCC, FRAMERATE, FRAMESIZE)
+
+# grab the BGR24 frame from the decoder
+for frame in decoder.generateFrame():
+
+    # check if frame is None
+    if frame is None:
+        break
+
+    # {do something with the frame here}
+
+    # writing BGR24 frame to writer
+    writer.write(frame)
+
+# terminate the decoder
+decoder.terminate()
+
+# safely close writer
+writer.release()
+```
+
+&nbsp;
+
+## Transcoding Cropped video
+
+<figure markdown>
+  ![Big Buck Bunny Cropped](../../../assets/gifs/bigbuckbunny_cropped.gif)
+  <figcaption>Big Buck Bunny Cropped</figcaption>
+</figure>
+
+
+In this example we will crop real-time video frames by an area with size 2/3 of the input video _(say `foo.mp4`)_ by applying [`crop`](https://ffmpeg.org/ffmpeg-filters.html#crop) filter in FFdecoder API, all while encoding them using OpenCV Library's [`VideoWriter()`](https://docs.opencv.org/3.4/dd/d9e/classcv_1_1VideoWriter.html#ad59c61d8881ba2b2da22cff5487465b5) method in real-time. 
+
+!!! info "OpenCV's `VideoWriter()` class requires a valid Output filename _(e.g. output_foo.avi)_, [FourCC](https://www.fourcc.org/fourcc.php) code, framerate, and resolution as input."
+
+!!! note "You can use FFdecoder's [`metadata`](../../reference/ffdecoder/#deffcode.ffdecoder.FFdecoder.metadata) property object that dumps source Video's metadata information _(as JSON string)_ to retrieve source framerate and resolution."
+
+!!! tip "More complex examples using `crop` filter can be found [here ➶](https://ffmpeg.org/ffmpeg-filters.html#toc-Examples-57) and can be applied similarly."
+
+```python
+# import the necessary packages
+from deffcode import FFdecoder
+import json, cv2
+
+# define the Video Filter definition
+# cropped the central input area with size 2/3 of the input video
+ffparams = {
+    "-vf": "crop=2/3*in_w:2/3*in_h"
+}
+
+# initialize and formulate the decoder for BGR24 output with given params
+decoder = FFdecoder(
+    "foo.mp4", frame_format="bgr24", verbose=True, **ffparams
+).formulate()
+
+# retrieve JSON Metadata and convert it to dict
+metadata_dict = json.loads(decoder.metadata)
+
+# prepare OpenCV parameters
+FOURCC = cv2.VideoWriter_fourcc("M", "J", "P", "G")
+FRAMERATE = metadata_dict["source_video_framerate"]
+FRAMESIZE = tuple(metadata_dict["source_video_resolution"])
+
+# Define writer with parameters and suitable output filename for e.g. `output_foo.avi`
+writer = cv2.VideoWriter("output_foo.avi", FOURCC, FRAMERATE, FRAMESIZE)
+
+# grab the BGR24 frame from the decoder
+for frame in decoder.generateFrame():
+
+    # check if frame is None
+    if frame is None:
+        break
+
+    # {do something with the frame here}
+
+    # writing BGR24 frame to writer
+    writer.write(frame)
+
+# terminate the decoder
+decoder.terminate()
+
+# safely close writer
+writer.release()
+```
+
+&nbsp;
+
+## Transcoding Rotated video (with `rotate` filter)
+
+!!! quote "FFmpeg features **Rotate** Filter that is used to rotate videos by an arbitrary angle (expressed in radians)."
+
+<figure markdown>
+  ![Big Buck Bunny Rotated](../../../assets/gifs/bigbuckbunny_rotate.gif)
+  <figcaption>Big Buck Bunny Rotated (with <code>rotate</code> filter)</figcaption>
+</figure>
+
+
+In this example we will rotate real-time video frames at an arbitrary angle by applying [`rotate`](https://ffmpeg.org/ffmpeg-filters.html#toc-rotate) filter in FFdecoder API and also using green color to fill the output area not covered by the rotated image, all while encoding them using OpenCV Library's [`VideoWriter()`](https://docs.opencv.org/3.4/dd/d9e/classcv_1_1VideoWriter.html#ad59c61d8881ba2b2da22cff5487465b5) method in real-time. 
+
+!!! info "OpenCV's `VideoWriter()` class requires a valid Output filename _(e.g. output_foo.avi)_, [FourCC](https://www.fourcc.org/fourcc.php) code, framerate, and resolution as input."
+
+!!! note "You can use FFdecoder's [`metadata`](../../reference/ffdecoder/#deffcode.ffdecoder.FFdecoder.metadata) property object that dumps source Video's metadata information _(as JSON string)_ to retrieve source framerate and resolution."
+
+```python
+# import the necessary packages
+from deffcode import FFdecoder
+import json, cv2
+
+# define the Video Filter definition
+# rotate by 0.35 rad and fill green
+ffparams = {
+    "-vf": "rotate=angle=-20*PI/180:fillcolor=green" 
+}
+
+# initialize and formulate the decoder for BGR24 output with given params
+decoder = FFdecoder(
+    "foo.mp4", frame_format="bgr24", verbose=True, **ffparams
+).formulate()
+
+# retrieve JSON Metadata and convert it to dict
+metadata_dict = json.loads(decoder.metadata)
+
+# prepare OpenCV parameters
+FOURCC = cv2.VideoWriter_fourcc("M", "J", "P", "G")
+FRAMERATE = metadata_dict["source_video_framerate"]
+FRAMESIZE = tuple(metadata_dict["source_video_resolution"])
+
+# Define writer with parameters and suitable output filename for e.g. `output_foo.avi`
+writer = cv2.VideoWriter("output_foo.avi", FOURCC, FRAMERATE, FRAMESIZE)
+
+# grab the BGR24 frame from the decoder
+for frame in decoder.generateFrame():
+
+    # check if frame is None
+    if frame is None:
+        break
+
+    # {do something with the frame here}
+
+    # writing BGR24 frame to writer
+    writer.write(frame)
+
+# terminate the decoder
+decoder.terminate()
+
+# safely close writer
+writer.release()
+```
+
+&nbsp;
+
+## Transcoding Rotated video (with `transpose` filter) 
+
+!!! quote "FFmpeg also features **Transpose** Filter that is used to rotate videos by 90 degrees clockwise and counter-clockwise direction as well as flip them vertically and horizontally."
+
+<figure markdown>
+  ![Big Buck Bunny Rotated](../../../assets/gifs/bigbuckbunny_transpose.gif)
+  <figcaption>Big Buck Bunny Rotated (with <code>transpose</code> filter)</figcaption>
+</figure>
+
+In this example we will rotate real-time video frames by 90 degrees counterclockwise and preserve portrait geometry by applying [`transpose`](https://ffmpeg.org/ffmpeg-filters.html#toc-transpose-1) filter in FFdecoder API, all while encoding them using OpenCV Library's [`VideoWriter()`](https://docs.opencv.org/3.4/dd/d9e/classcv_1_1VideoWriter.html#ad59c61d8881ba2b2da22cff5487465b5) method in real-time. 
+
+!!! info "OpenCV's `VideoWriter()` class requires a valid Output filename _(e.g. output_foo.avi)_, [FourCC](https://www.fourcc.org/fourcc.php) code, framerate, and resolution as input."
+
+!!! note "You can use FFdecoder's [`metadata`](../../reference/ffdecoder/#deffcode.ffdecoder.FFdecoder.metadata) property object that dumps source Video's metadata information _(as JSON string)_ to retrieve source framerate and resolution."
+
+```python
+# import the necessary packages
+from deffcode import FFdecoder
+import json, cv2
+
+# define the Video Filter definition
+# rotate by 90 degrees counter-clockwise and preserve portrait layout
+ffparams = {
+    "-vf": "transpose=dir=2:passthrough=portrait"
+}
+
+# initialize and formulate the decoder for BGR24 output with given params
+decoder = FFdecoder(
+    "foo.mp4", frame_format="bgr24", verbose=True, **ffparams
+).formulate()
+
+# retrieve JSON Metadata and convert it to dict
+metadata_dict = json.loads(decoder.metadata)
+
+# prepare OpenCV parameters
+FOURCC = cv2.VideoWriter_fourcc("M", "J", "P", "G")
+FRAMERATE = metadata_dict["source_video_framerate"]
+FRAMESIZE = tuple(metadata_dict["source_video_resolution"])
+
+# Define writer with parameters and suitable output filename for e.g. `output_foo.avi`
+writer = cv2.VideoWriter("output_foo.avi", FOURCC, FRAMERATE, FRAMESIZE)
+
+# grab the BGR24 frame from the decoder
+for frame in decoder.generateFrame():
+
+    # check if frame is None
+    if frame is None:
+        break
+
+    # {do something with the frame here}
+
+    # writing BGR24 frame to writer
+    writer.write(frame)
+
+# terminate the decoder
+decoder.terminate()
+
+# safely close writer
+writer.release()
+```
+
+&nbsp;
+
+## Transcoding Horizontally flipped and Scaled video
+
+<figure markdown>
+  ![Big Buck Bunny Horizontally flipped and Scaled](../../../assets/gifs/bigbuckbunny_hflip_scaled.gif)
+  <figcaption>Big Buck Bunny Horizontally flipped and Scaled</figcaption>
+</figure>
+
+In this example we will horizontally flip and scale real-time video frames to half its original size by applying [`hflip`](https://ffmpeg.org/ffmpeg-filters.html#toc-hflip) and [`scale`](https://ffmpeg.org/ffmpeg-filters.html#toc-scale-1) filter one-by-one in FFdecoder API, all while encoding them using OpenCV Library's [`VideoWriter()`](https://docs.opencv.org/3.4/dd/d9e/classcv_1_1VideoWriter.html#ad59c61d8881ba2b2da22cff5487465b5) method in real-time. 
+
+!!! info "OpenCV's `VideoWriter()` class requires a valid Output filename _(e.g. output_foo.avi)_, [FourCC](https://www.fourcc.org/fourcc.php) code, framerate, and resolution as input."
+
+!!! note "You can use FFdecoder's [`metadata`](../../reference/ffdecoder/#deffcode.ffdecoder.FFdecoder.metadata) property object that dumps source Video's metadata information _(as JSON string)_ to retrieve source framerate and resolution."
+
+!!! tip "More complex examples using `scale` filter can be found [here ➶](https://ffmpeg.org/ffmpeg-filters.html#toc-Examples-107) and can be applied similarly."
+
+```python
+# import the necessary packages
+from deffcode import FFdecoder
+import json, cv2
+
+# define the Video Filter definition
+# horizontally flip and scale to half its original size
+ffparams = {
+    "-vf": "hflip,scale=w=iw/2:h=ih/2"
+}
+
+# initialize and formulate the decoder for BGR24 output with given params
+decoder = FFdecoder(
+    "foo.mp4", frame_format="bgr24", verbose=True, **ffparams
+).formulate()
+
+# retrieve JSON Metadata and convert it to dict
+metadata_dict = json.loads(decoder.metadata)
+
+# prepare OpenCV parameters
+FOURCC = cv2.VideoWriter_fourcc("M", "J", "P", "G")
+FRAMERATE = metadata_dict["source_video_framerate"]
+FRAMESIZE = tuple(metadata_dict["source_video_resolution"])
+
+# Define writer with parameters and suitable output filename for e.g. `output_foo.avi`
+writer = cv2.VideoWriter("output_foo.avi", FOURCC, FRAMERATE, FRAMESIZE)
+
+# grab the BGR24 frame from the decoder
+for frame in decoder.generateFrame():
+
+    # check if frame is None
+    if frame is None:
+        break
+
+    # {do something with the frame here}
+
+    # writing BGR24 frame to writer
+    writer.write(frame)
+
+# terminate the decoder
+decoder.terminate()
+
+# safely close writer
+writer.release()
+```
+
+&nbsp;
\ No newline at end of file
diff --git a/docs/recipes/basic/transcode-live-frames.md b/docs/recipes/basic/transcode-live-frames.md
new file mode 100644
index 0000000..11f9cc7
--- /dev/null
+++ b/docs/recipes/basic/transcode-live-frames.md
@@ -0,0 +1,466 @@
+<!--
+======================================================================
+DeFFcode library source-code is deployed under the Apache 2.0 License:
+
+Copyright (c) 2021 Abhishek Thakur(@abhiTronix) <abhi.una12@gmail.com>
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+   http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+======================================================================
+-->
+
+# :material-video-image: Transcoding Live frames
+
+??? abstract "What exactly is Transcoding?"
+
+    Before heading directly into recipes we have to talk about Transcoding: 
+    
+    > Transcoding is the technique of transforming one media encoding format into another. 
+
+    This is typically done for compatibility purposes, such as when a media source provides a format that the intended target is not able to process; an in-between adaptation step is required:
+
+    - **Decode** media from its originally encoded state into raw, uncompressed information.
+    - **Encode** the raw data back, using a different codec that is supported by end user.
+
+
+> While decoding media into video frames is purely managed by DeFFcode's FFdecoder API, you can easily encode those video frames back into multimedia files using any well-known video processing library such as OpenCV and VidGear. 
+
+We'll discuss transcoding using both these libraries briefly in the following recipes:
+
+&thinsp;
+
+!!! warning "DeFFcode APIs requires FFmpeg executable"
+
+    ==DeFFcode APIs **MUST** requires valid FFmpeg executable for all of its core functionality==, and any failure in detection will raise `RuntimeError` immediately. Follow dedicated [FFmpeg Installation doc ➶](../../../installation/ffmpeg_install/) for its installation.
+
+???+ info "Additional Python Dependencies for following recipes"
+
+    Following recipes requires additional python dependencies which can be installed easily as below:
+
+    - [x] **OpenCV:** OpenCV is required for previewing and encoding video frames. You can easily install it directly via [`pip`](https://pypi.org/project/opencv-python/):
+
+        ??? tip "OpenCV installation from source"
+
+            You can also follow online tutorials for building & installing OpenCV on [Windows](https://www.learnopencv.com/install-opencv3-on-windows/), [Linux](https://www.pyimagesearch.com/2018/05/28/ubuntu-18-04-how-to-install-opencv/), [MacOS](https://www.pyimagesearch.com/2018/08/17/install-opencv-4-on-macos/) and [Raspberry Pi](https://www.pyimagesearch.com/2018/09/26/install-opencv-4-on-your-raspberry-pi/) machines manually from its source. 
+
+            :warning: Make sure not to install both *pip* and *source* version together. Otherwise installation will fail to work!
+
+        ??? info "Other OpenCV binaries"
+
+            OpenCV mainainers also provide additional binaries via pip that contains both main modules and contrib/extra modules [`opencv-contrib-python`](https://pypi.org/project/opencv-contrib-python/), and for server (headless) environments like [`opencv-python-headless`](https://pypi.org/project/opencv-python-headless/) and [`opencv-contrib-python-headless`](https://pypi.org/project/opencv-contrib-python-headless/). You can also install ==any one of them== in similar manner. More information can be found [here](https://github.com/opencv/opencv-python#installation-and-usage).
+
+
+        ```sh
+        pip install opencv-python       
+        ```
+
+    - [x] **VidGear:** VidGear is required for lossless encoding of video frames into file/stream. You can easily install it directly via [`pip`](https://pypi.org/project/opencv-python/):
+
+        ```sh
+        pip install vidgear[core]       
+        ```
+
+
+
+!!! note "Always use FFdecoder API's [`terminate()`](../../reference/ffdecoder/#deffcode.ffdecoder.FFdecoder.terminate) method at the end to avoid undesired behavior."
+
+??? danger "Never name your python script `deffcode.py`"
+
+    When trying out these recipes, never name your python script `deffcode.py` otherwise it will result in `ModuleNotFound` error.
+
+&thinsp;
+
+## Transcoding video using OpenCV VideoWriter API
+
+!!! quote "OpenCV's' [`VideoWriter()`](https://docs.opencv.org/3.4/dd/d9e/classcv_1_1VideoWriter.html#ad59c61d8881ba2b2da22cff5487465b5) class can be used directly with DeFFcode's FFdecoder API to encode video frames into a multimedia video file but it lacks the ability to control output quality, bitrate, compression, and other important features which are only available with VidGear's WriteGear API."
+
+In this example we will decode different pixel formats video frames from a given Video file _(say `foo.mp4`)_ in FFdecoder API, and encode them using OpenCV Library's `VideoWriter()` method in real-time. 
+
+!!! info "OpenCV's `VideoWriter()` class requires a valid Output filename _(e.g. output_foo.avi)_, [FourCC](https://www.fourcc.org/fourcc.php) code, framerate, and resolution as input."
+
+!!! tip "You can use FFdecoder's [`metadata`](../../reference/ffdecoder/#deffcode.ffdecoder.FFdecoder.metadata) property object that dumps source Video's metadata information _(as JSON string)_ to retrieve source framerate and resolution."
+
+!!! alert "By default, OpenCV expects `BGR` format frames in its `cv2.write()` method."
+
+=== "BGR frames"
+
+    ```python
+    # import the necessary packages
+    from deffcode import FFdecoder
+    import json, cv2
+
+    # initialize and formulate the decoder for BGR24 pixel format output
+    decoder = FFdecoder("foo.mp4", frame_format="bgr24").formulate()
+
+    # retrieve JSON Metadata and convert it to dict
+    metadata_dict = json.loads(decoder.metadata)
+
+    # prepare OpenCV parameters
+    FOURCC = cv2.VideoWriter_fourcc("M", "J", "P", "G")
+    FRAMERATE = metadata_dict["source_video_framerate"]
+    FRAMESIZE = tuple(metadata_dict["source_video_resolution"])
+
+    # Define writer with parameters and suitable output filename for e.g. `output_foo.avi`
+    writer = cv2.VideoWriter("output_foo.avi", FOURCC, FRAMERATE, FRAMESIZE)
+
+    # grab the BGR24 frame from the decoder
+    for frame in decoder.generateFrame():
+
+        # check if frame is None
+        if frame is None:
+            break
+
+        # {do something with the frame here}
+
+        # writing BGR24 frame to writer
+        writer.write(frame)
+
+         # let's also show output window
+        cv2.imshow("Output", frame)
+
+        # check for 'q' key if pressed
+        key = cv2.waitKey(1) & 0xFF
+        if key == ord("q"):
+            break
+
+    # close output window
+    cv2.destroyAllWindows()
+
+    # terminate the decoder
+    decoder.terminate()
+
+    # safely close writer
+    writer.release()
+    ```
+
+=== "RGB frames"
+
+    !!! info "Since OpenCV expects `BGR` format frames in its `cv2.write()` method, therefore we need to convert `RGB` frames into `BGR` before encoding."
+
+    ```python
+    # import the necessary packages
+    from deffcode import FFdecoder
+    import json, cv2
+
+    # initialize and formulate the decoder for RGB24 pixel format output
+    decoder = FFdecoder("foo.mp4").formulate()
+
+    # retrieve JSON Metadata and convert it to dict
+    metadata_dict = json.loads(decoder.metadata)
+
+    # prepare OpenCV parameters
+    FOURCC = cv2.VideoWriter_fourcc("M", "J", "P", "G")
+    FRAMERATE = metadata_dict["source_video_framerate"]
+    FRAMESIZE = tuple(metadata_dict["source_video_resolution"])
+
+    # Define writer with parameters and suitable output filename for e.g. `output_foo.avi`
+    writer = cv2.VideoWriter("output_foo.avi", FOURCC, FRAMERATE, FRAMESIZE)
+
+    # grab the RGB24 frame from the decoder
+    for frame in decoder.generateFrame():
+
+        # check if frame is None
+        if frame is None:
+            break
+
+        # {do something with the frame here}
+
+        # converting RGB24 to BGR24 frame
+        frame_bgr = cv2.cvtColor(frame, cv2.COLOR_RGB2BGR)
+
+        # writing BGR24 frame to writer
+        writer.write(frame_bgr)
+
+    # terminate the decoder
+    decoder.terminate()
+
+    # safely close writer
+    writer.release()
+    ```
+
+=== "GRAYSCALE frames"
+
+    !!! info "OpenCV directly consumes `GRAYSCALE` format frames in its `cv2.write()` method."
+
+    ```python
+    # import the necessary packages
+    from deffcode import FFdecoder
+    import json, cv2
+
+    # initialize and formulate the decoder for GRAYSCALE output
+    decoder = FFdecoder("foo.mp4", frame_format="gray", verbose=True).formulate()
+
+    # retrieve JSON Metadata and convert it to dict
+    metadata_dict = json.loads(decoder.metadata)
+
+    # prepare OpenCV parameters
+    FOURCC = cv2.VideoWriter_fourcc("M", "J", "P", "G")
+    FRAMERATE = metadata_dict["source_video_framerate"]
+    FRAMESIZE = tuple(metadata_dict["source_video_resolution"])
+
+    # Define writer with parameters and suitable output filename for e.g. `output_foo_gray.avi`
+    writer = cv2.VideoWriter("output_foo_gray.avi", FOURCC, FRAMERATE, FRAMESIZE)
+
+    # grab the GRAYSCALE frame from the decoder
+    for frame in decoder.generateFrame():
+
+        # check if frame is None
+        if frame is None:
+            break
+
+        # {do something with the frame here}
+
+        # writing GRAYSCALE frame to writer
+        writer.write(frame)
+
+    # terminate the decoder
+    decoder.terminate()
+
+    # safely close writer
+    writer.release()
+    ```
+
+=== "YUV frames"
+
+    !!! info "OpenCV also directly consumes `YUV` format frames in its `cv2.write()` method."
+
+    !!! note "You can also use `yuv422p`(4:2:2 subsampling) or `yuv444p`(4:4:4 subsampling) instead in `frame_format` parameter for more higher dynamic range."
+
+    ```python
+    # import the necessary packages
+    from deffcode import FFdecoder
+    import json, cv2
+
+    # initialize and formulate the decoder for YUV420 output
+    decoder = FFdecoder("foo.mp4", frame_format="yuv420p", verbose=True).formulate()
+
+    # retrieve JSON Metadata and convert it to dict
+    metadata_dict = json.loads(decoder.metadata)
+
+    # prepare OpenCV parameters
+    FOURCC = cv2.VideoWriter_fourcc("M", "J", "P", "G")
+    FRAMERATE = metadata_dict["source_video_framerate"]
+    FRAMESIZE = tuple(metadata_dict["source_video_resolution"])
+
+    # Define writer with parameters and suitable output filename for e.g. `output_foo_yuv.avi`
+    writer = cv2.VideoWriter("output_foo_yuv.avi", FOURCC, FRAMERATE, FRAMESIZE)
+
+    # grab the YUV420 frame from the decoder
+    for frame in decoder.generateFrame():
+
+        # check if frame is None
+        if frame is None:
+            break
+
+        # {do something with the frame here}
+
+        # writing YUV420 frame to writer
+        writer.write(frame)
+
+    # terminate the decoder
+    decoder.terminate()
+
+    # safely close writer
+    writer.release()
+    ```
+
+&nbsp;
+
+## Transcoding lossless video using WriteGear API
+
+!!! danger "==WriteGear's Compression Mode support for FFdecoder API is currently in beta so you can expect much higher than usual CPU utilization!=="
+
+???+ quote "Lossless transcoding  with FFdecoder and WriteGear API"
+    
+    VidGear's [**WriteGear API**](https://abhitronix.github.io/vidgear/latest/gears/writegear/introduction/) implements a complete, flexible, and robust wrapper around FFmpeg in [compression mode](https://abhitronix.github.io/vidgear/latest/gears/writegear/compression/overview/) for encoding real-time video frames to a lossless compressed multimedia output file(s)/stream(s). 
+
+    DeFFcode's FFdecoder API in conjunction with WriteGear API creates a high-level **High-performance Lossless FFmpeg Transcoding _(Decoding + Encoding)_ Pipeline :fire:** that is able to exploit almost any FFmpeg parameter for achieving anything imaginable with multimedia video data all while allow us to manipulate the real-time video frames with immense flexibility. 
+
+In this example we will decode different pixel formats video frames from a given Video file _(say `foo.mp4`)_ in FFdecoder API, and encode them into lossless video file with controlled framerate using WriteGear API in real-time. 
+
+!!! info "Additional Parameters in WriteGear API"
+    
+    WriteGear API only requires a valid Output filename _(e.g. `output_foo.mp4`)_ as input, but you can easily control any output specifications _(such as bitrate, codec, framerate, resolution, subtitles, etc.)_ supported by FFmpeg _(in use)_.
+
+!!! tip "You can use FFdecoder's [`metadata`](../../reference/ffdecoder/#deffcode.ffdecoder.FFdecoder.metadata) property object that dumps source Video's metadata information _(as JSON string)_ to retrieve source framerate."
+
+!!! alert "WriteGear API by default expects `BGR` format frames in its `write()` class method."
+
+=== "BGR frames"
+
+    ```python
+    # import the necessary packages
+    from deffcode import FFdecoder
+    from vidgear.gears import WriteGear
+    import json
+
+    # initialize and formulate the decoder for BGR24 output
+    decoder = FFdecoder("foo.mp4", frame_format="bgr24", verbose=True).formulate()
+
+    # retrieve framerate from source JSON Metadata and pass it as `-input_framerate` 
+    # parameter for controlled framerate
+    output_params = {
+        "-input_framerate": json.loads(decoder.metadata)["source_video_framerate"]
+    }
+
+    # Define writer with default parameters and suitable
+    # output filename for e.g. `output_foo.mp4`
+    writer = WriteGear(output_filename="output_foo.mp4", **output_params)
+
+    # grab the BGR24 frame from the decoder
+    for frame in decoder.generateFrame():
+
+        # check if frame is None
+        if frame is None:
+            break
+
+        # {do something with the frame here}
+
+        # writing BGR24 frame to writer
+        writer.write(frame)
+
+    # terminate the decoder
+    decoder.terminate()
+
+    # safely close writer
+    writer.close()
+    ```
+
+=== "RGB frames"
+
+    !!! info "You can use [`rgb_mode`](https://abhitronix.github.io/vidgear/latest/bonus/reference/writegear/#vidgear.gears.writegear.WriteGear.write) parameter in  `write()` class method to write `RGB` format frames instead of default `BGR`."
+
+    ```python
+    # import the necessary packages
+    from deffcode import FFdecoder
+    from vidgear.gears import WriteGear
+    import json
+
+    # initialize and formulate the decoder
+    decoder = FFdecoder("foo.mp4", verbose=True).formulate()
+
+    # retrieve framerate from source JSON Metadata and pass it as `-input_framerate` 
+    # parameter for controlled framerate
+    output_params = {
+        "-input_framerate": json.loads(decoder.metadata)["source_video_framerate"]
+    }
+
+    # Define writer with default parameters and suitable
+    # output filename for e.g. `output_foo.mp4`
+    writer = WriteGear(output_filename="output_foo.mp4", **output_params)
+
+    # grab the BGR24 frame from the decoder
+    for frame in decoder.generateFrame():
+
+        # check if frame is None
+        if frame is None:
+            break
+
+        # {do something with the frame here}
+
+        # writing RGB24 frame to writer
+        writer.write(frame, rgb_mode=True)
+
+    # terminate the decoder
+    decoder.terminate()
+
+    # safely close writer
+    writer.close()
+    ```
+
+=== "GRAYSCALE frames"
+
+    !!! info "WriteGear API directly consumes `GRAYSCALE` format frames in its `write()` class method. 
+
+    ```python
+    # import the necessary packages
+    from deffcode import FFdecoder
+    from vidgear.gears import WriteGear
+    import json
+
+    # initialize and formulate the decoder for GRAYSCALE output
+    decoder = FFdecoder("foo.mp4", frame_format="gray", verbose=True).formulate()
+
+    # retrieve framerate from source JSON Metadata and pass it as `-input_framerate` parameter
+    # for controlled output framerate
+    output_params = {
+        "-input_framerate": json.loads(decoder.metadata)["source_video_framerate"]
+    }
+
+    # Define writer with default parameters and suitable
+    # output filename for e.g. `output_foo_gray.mp4`
+    writer = WriteGear(output_filename="output_foo_gray.mp4", **output_params)
+
+    # grab the GRAYSCALE frame from the decoder
+    for frame in decoder.generateFrame():
+
+        # check if frame is None
+        if frame is None:
+            break
+
+        # {do something with the frame here}
+
+        # writing GRAYSCALE frame to writer
+        writer.write(frame)
+
+    # terminate the decoder
+    decoder.terminate()
+
+    # safely close writer
+    writer.close()
+    ```
+
+=== "YUV frames"
+
+    !!! info "WriteGear API also directly consumes `YUV` format frames in its `write()` class method. 
+
+    !!! note "You can also use `yuv422p`(4:2:2 subsampling) or `yuv444p`(4:4:4 subsampling) instead in `frame_format` parameter for more higher dynamic range."
+
+    ```python
+    # import the necessary packages
+    from deffcode import FFdecoder
+    from vidgear.gears import WriteGear
+    import json
+
+    # initialize and formulate the decoder for YUV420 output
+    decoder = FFdecoder("foo.mp4", frame_format="yuv420p", verbose=True).formulate()
+
+    # retrieve framerate from source JSON Metadata and pass it as `-input_framerate` parameter
+    # for controlled output framerate
+    output_params = {
+        "-input_framerate": json.loads(decoder.metadata)["source_video_framerate"]
+    }
+
+    # Define writer with default parameters and suitable
+    # output filename for e.g. `output_foo_yuv.mp4`
+    writer = WriteGear(output_filename="output_foo_yuv.mp4", **output_params)
+
+    # grab the YUV420 frame from the decoder
+    for frame in decoder.generateFrame():
+
+        # check if frame is None
+        if frame is None:
+            break
+
+        # {do something with the frame here}
+
+        # writing YUV420 frame to writer
+        writer.write(frame)
+
+    # terminate the decoder
+    decoder.terminate()
+
+    # safely close writer
+    writer.close()
+    ```
+
+&nbsp;
diff --git a/docs/reference/ffdecoder/index.md b/docs/reference/ffdecoder/index.md
index 77f632a..ca3d958 100644
--- a/docs/reference/ffdecoder/index.md
+++ b/docs/reference/ffdecoder/index.md
@@ -20,19 +20,7 @@ limitations under the License.
 
 # FFdecoder API
 
-DeFFcode's FFdecoder API is a powerful real-time **Video-frames [Generator](https://wiki.python.org/moin/Generators)** build on [FFmpeg](https://ffmpeg.org/), that keeps on generating 3D [24-bit RGB](https://en.wikipedia.org/wiki/List_of_monochrome_and_RGB_color_formats#24-bit_RGB)(default) NumPy's [`ndarray`](https://numpy.org/doc/stable/reference/arrays.ndarray.html#the-n-dimensional-array-ndarray) frames from its pipeline with low-memory overhead continuously.
-
-FFdecoder supports a **wide range of media stream** such as any Video Input devices like USB Cameras, Multimedia video file format, Screen Captures, Image Sequences, plus any network stream URL _(such as http(s), rtp, rstp, rtmp, mms, etc.)_.
-
-FFdecoder API **wraps FFmpeg pipeline inside a [`subprocess`](https://docs.python.org/3/library/subprocess.html)** that run as completely independent entities and executes the pipeline concurrently with original process, extracting dataframes(in bytes) into NumPy's buffer(as a 1D array) from its `stdout` output. These dataframes are then converted into 3D NumPy's `ndarray` frames that are supported by almost all prominent Computer Vision libraries like OpenCV, Pytorch, dlib ,etc. and can be easily employed to perform various digital processing functions _(like translation, rotation, resizing, cropping, fading, scaling)_ on-the-go.
-
-FFdecoder API can **extract frames in real-time with any custom specification imaginable** such as Framerate, Resolution, Hardware decoding, Complex Filters into any pixel format that FFmpeg supports along with desired parameters. Furthermore, This API also supports **extraction of  Source Metadata** of all specified valid streams as Pretty JSON as well as its updation with user-defined dictionary.
-
-&thinsp;
-
-!!! example "For usage, kindly refer our **[Basic Recipes :pie:](../../examples/basic)** and **[Advanced Recipes :microscope:](../../examples/advanced)**"
-
-!!! info "FFdecoder API parameters are explained [here ➶](params/)"
+<img src="../../assets/images/ffdecoder.png" alt="FFdecoder API Functional Diagram" title="FFdecoder API Functional Diagram" loading="lazy" width="90%" class="shadow2" />
 
 ::: deffcode.FFdecoder
 
diff --git a/docs/reference/ffdecoder/params.md b/docs/reference/ffdecoder/params.md
index 4d408da..58b9429 100644
--- a/docs/reference/ffdecoder/params.md
+++ b/docs/reference/ffdecoder/params.md
@@ -23,11 +23,13 @@ limitations under the License.
 
 ## **`source`**
 
-!!! warning "FFdecoder API will throw `RuntimeError` if `source` provided is invalid or missing."
+This parameter defines the input source (`-i`) for decoding real-time frames.
 
+!!! warning "FFdecoder API will throw `Assertion` if `source` provided is invalid or missing."
 
-This parameter defines the default input source.
+!!! danger "FFdecoder API checks for _`video bitrate`_ or _`frame-size` and `framerate`_ in video's metadata to ensure given input `source` has usable video stream available. Thereby, it will throw `ValueError` if it fails to find those parameters."
 
+!!! info "Multiple video inputs are not yet supported!"
 
 **Data-Type:** String.
 
@@ -35,94 +37,401 @@ Its valid input can be one of the following:
 
 - [x] **Filepath:** _Valid path of the video file, for e.g `"/home/foo.mp4"` as follows:_
 
-    !!! alert "Multiple video file paths are not yet support!"
-
     ```python
+    # initialize and formulate the decoder with `foo.mp4` source
     decoder = FFdecoder('/home/foo.mp4').formulate()
     ```
 
-- [x] **Image Sequence:** _Valid image sequence such as sequential `'img%03d.png'` or `'*.png'` glob pattern or even single(loop) image as input:_
+    !!! example "Related usage recipes :material-pot-steam: can found [here ➶](../../../recipes/basic/decode-video-files/#decoding-video-files)"
+
+- [x] **Image Sequence:** _Valid image sequence such as sequential(`'img%03d.png'`) or glob pattern(`'*.png'`) or single (looping) image as input:_
 
     
     === "Sequential"
 
-        ```python
-        # initialize and formulate the decoder
-        decoder = FFdecoder('img%03d.png').formulate()
-        ```
+        ??? question "How to start with specific number image?"
+        
+            You can use `-start_number` FFmpeg parameter if you want to start with specific number image:
 
-        You can use `-start_number` FFmpeg parameter if you want to start with specific number:
+            ```python
+            # define `-start_number` such as `5`
+            ffparams = {"-ffprefixes":["-start_number", "5"]}
 
-        ```python
-        # define `-start_number` such as `5`
-        extraparams = {"-ffpostfixes":["-start_number", "5"]}
+            # initialize and formulate the decoder with define parameters
+            decoder = FFdecoder('img%03d.png', verbose=True, **ffparams).formulate()
+            ```
 
-        # initialize and formulate the decoder with define parameters
-        decoder = FFdecoder('img%03d.png', verbose=True, **extraparams).formulate()
+        ```python
+        # initialize and formulate the decoder
+        decoder = FFdecoder('img%03d.png').formulate()
         ```
 
     === "Glob pattern"
 
-        Bash-style globbing _(`*` represents any number of any characters)_ is useful if your images are sequential but not necessarily in a numerically sequential order. You can do it as follows:
+        !!! abstract "Bash-style globbing _(`*` represents any number of any characters)_ is useful if your images are sequential but not necessarily in a numerically sequential order."
 
         !!! warning "The glob pattern is not available on Windows builds."
 
         ```python
         # define `-pattern_type glob` for accepting glob pattern
-        extraparams = {"-ffprefixes":["-pattern_type", "glob"]}
+        sourcer_params = {"-ffprefixes":["-pattern_type", "glob"]}
 
         # initialize and formulate the decoder with define parameters
-        decoder = FFdecoder('img*.png', verbose=True, **extraparams).formulate()
+        decoder = FFdecoder('img*.png', verbose=True, **sourcer_params).formulate()
         ```
 
-    === "Single image"
-
-        You can use a single looping image as follows:
+    === "Single (loop) image"
 
         ```python
         # define `-loop 1` for looping
-        extraparams = {"-ffprefixes":["-loop", "1"]}
+        ffparams = {"-ffprefixes":["-loop", "1"]}
 
         # initialize and formulate the decoder with define parameters
-        decoder = FFdecoder('img.jpg', verbose=True, **extraparams).formulate()
+        decoder = FFdecoder('img.jpg', verbose=True, **ffparams).formulate()
         ```
 
+    !!! example "Related usage recipes :material-pot-steam: can found [here ➶](../../../recipes/basic/decode-image-sequences/#decoding-image-sequences)"
+
 - [x] **Network Address:** _Valid (`http(s)`, `rtp`, `rstp`, `rtmp`, `mms`, etc.) incoming network stream address such as `'rtsp://xx:yy@192.168.1.ee:fd/av0_0'` as input:_
 
     ```python
     # define `rtsp_transport` or necessary parameters 
-    extraparams = {"-ffpostfixes":["-rtsp_transport", "tcp"]}
+    ffparams = {"-ffprefixes":["-rtsp_transport", "tcp"]}
 
     # initialize and formulate the decoder with define parameters
-    decoder = FFdecoder('rtsp://xx:yy@192.168.1.ee:fd/av0_0', verbose=True, **extraparams).formulate()
+    decoder = FFdecoder('rtsp://xx:yy@192.168.1.ee:fd/av0_0', verbose=True, **ffparams).formulate()
+    ```
+
+    !!! example "Related usage recipes :material-pot-steam: can found [here ➶](../../../recipes/basic/decode-network-streams/#decoding-network-streams)"
+
+- [x] **Video Capture Devices (Webcams):** Valid video capture device's name _(e.g. `"USB2.0 Camera"`)_ or its path _(e.g. `"/dev/video0"` on linux)_ or its index _(e.g. `"0"`)_ as input  w.r.t [`source_demuxer`](#source_demuxer) parameter value in use. For example, for capturing `"USB2.0 Camera"` named device with `dshow` source demuxer on :fontawesome-brands-windows: Windows, we can do as follows in FFdecoder API: 
+
+    ??? tip "Identifying and Specifying Device name/path/index and suitable Demuxer on different OSes"
+
+        === ":fontawesome-brands-windows: Windows"
+
+            Windows OS users can use the [dshow](https://trac.ffmpeg.org/wiki/DirectShow) (DirectShow) to list video input device which is the preferred option for Windows users. You can refer following steps to identify and specify your input video device's name:
+
+            - [x] **Identify Video Devices:** You can locate your video device's name _(already connected to your system)_ using `dshow` as follows:
+
+                ```sh
+                c:\> ffmpeg.exe -list_devices true -f dshow -i dummy
+                
+                ffmpeg version N-45279-g6b86dd5... --enable-runtime-cpudetect
+                  libavutil      51. 74.100 / 51. 74.100
+                  libavcodec     54. 65.100 / 54. 65.100
+                  libavformat    54. 31.100 / 54. 31.100
+                  libavdevice    54.  3.100 / 54.  3.100
+                  libavfilter     3. 19.102 /  3. 19.102
+                  libswscale      2.  1.101 /  2.  1.101
+                  libswresample   0. 16.100 /  0. 16.100
+                [dshow @ 03ACF580] DirectShow video devices
+                [dshow @ 03ACF580]  "Integrated Camera"
+                [dshow @ 03ACF580]  "USB2.0 Camera"
+                [dshow @ 03ACF580] DirectShow audio devices
+                [dshow @ 03ACF580]  "Microphone (Realtek High Definition Audio)"
+                [dshow @ 03ACF580]  "Microphone (USB2.0 Camera)"
+                dummy: Immediate exit requested
+                ```
+
+            - [x] **Specify Video Device's name:** Then, you can specify and initialize your located Video device's name in FFdecoder API as follows:
+
+                ```python
+                # initialize and formulate the decoder with "USB2.0 Camera" source for BGR24 output
+                decoder = FFdecoder("USB2.0 Camera", source_demuxer="dshow", frame_format="bgr24", verbose=True).formulate()
+                ```
+
+            - [x] **[OPTIONAL] Specify Video Device's index along with name:** If there are multiple Video devices with similar name, then you can use `-video_device_number` parameter to specify the arbitrary index of the particular device. For instance, to open second video device with name `"Camera"` you can do as follows:
+
+                ```python
+                # define video_device_number as 1 (numbering start from 0)
+                ffparams = {"-ffprefixes":["-video_device_number", "1"]}
+
+                # initialize and formulate the decoder with "Camera" source for BGR24 output
+                decoder = FFdecoder("Camera", source_demuxer="dshow", frame_format="bgr24", verbose=True, **ffparams).formulate()
+                ```
+
+        === ":material-linux: Linux"
+
+            Linux OS users can use the [`video4linux2`](https://trac.ffmpeg.org/wiki/Capture/Webcam#Linux) _(or its alias `v4l2`)_ to list to all capture video devices such as from an USB webcam. You can refer following steps to identify and specify your capture video device's path:
+
+            - [x] **Identify Video Devices:** Linux systems tend to automatically create file device node/path when the device _(e.g. an USB webcam)_ is plugged into the system, and has a name of the kind `'/dev/videoN'`, where `N` is a index associated to the device. To get the list of all available file device node/path on your Linux machine, you can use the `v4l-ctl` command.
+
+                !!! tip "You can use `#!sh sudo apt install v4l-utils` APT command to install `v4l-ctl` tool on Debian-based Linux distros."
+
+                ```sh
+                $ v4l2-ctl --list-devices
+
+                USB2.0 PC CAMERA (usb-0000:00:1d.7-1):
+                        /dev/video1
+
+                UVC Camera (046d:0819) (usb-0000:00:1d.7-2):
+                        /dev/video0
+                ```
+
+            - [x] **Specify Video Device's path:** Then, you can specify and initialize your located Video device's path in FFdecoder API as follows:
+
+                ```python
+                # initialize and formulate the decoder with "/dev/video0" source for BGR24 output
+                decoder = FFdecoder("/dev/video0", source_demuxer="v4l2", frame_format="bgr24", verbose=True).formulate()
+                ```
+
+            - [x] **[OPTIONAL] Specify Video Device's additional specifications:** You can also specify additional specifications _(such as pixel format(s), video format(s), framerate, and frame dimensions)_ supported by your Video Device as follows:
+
+                !!! tip "You can use `#!sh ffmpeg -f v4l2 -list_formats all -i /dev/video0` terminal command to list available specifications."
+
+                ```python
+                # define video device specifications
+                ffparams = {"-ffprefixes":["-framerate", "25", "-video_size", "640x480"]}
+
+                # initialize and formulate the decoder with "/dev/video0" source for BGR24 output
+                decoder = FFdecoder("/dev/video0", source_demuxer="v4l2", frame_format="bgr24", verbose=True, **ffparams).formulate()
+                ```
+
+        === ":material-apple: MacOS"
+
+            MacOS users can use the [AVFoundation](https://ffmpeg.org/ffmpeg-devices.html#avfoundation) to list input devices and is the currently recommended framework by Apple for streamgrabbing on Mac OSX-10.7 (Lion) and later as well as on iOS. You can refer following steps to identify and specify your capture video device's name or index on MacOS/OSX machines:
+
+            !!! note "QTKit is also available for streamgrabbing on Mac OS X 10.4 (Tiger) and later, but has been marked deprecated since OS X 10.7 (Lion) and may not be available on future releases."
+
+
+            - [x] **Identify Video Devices:** Then, You can locate your Video device's name and index using `avfoundation` as follows:
+
+                ```sh
+                $ ffmpeg -f avfoundation -list_devices true -i ""
+
+                ffmpeg version N-45279-g6b86dd5... --enable-runtime-cpudetect
+                  libavutil      51. 74.100 / 51. 74.100
+                  libavcodec     54. 65.100 / 54. 65.100
+                  libavformat    54. 31.100 / 54. 31.100
+                  libavdevice    54.  3.100 / 54.  3.100
+                  libavfilter     3. 19.102 /  3. 19.102
+                  libswscale      2.  1.101 /  2.  1.101
+                  libswresample   0. 16.100 /  0. 16.100
+                [AVFoundation input device @ 0x7f8e2540ef20] AVFoundation video devices:
+                [AVFoundation input device @ 0x7f8e2540ef20] [0] FaceTime HD camera (built-in)
+                [AVFoundation input device @ 0x7f8e2540ef20] [1] Capture screen 0
+                [AVFoundation input device @ 0x7f8e2540ef20] AVFoundation audio devices:
+                [AVFoundation input device @ 0x7f8e2540ef20] [0] Blackmagic Audio
+                [AVFoundation input device @ 0x7f8e2540ef20] [1] Built-in Microphone
+                ```
+
+
+            - [x] **Specify Video Device's name or index:** Then, you can specify and initialize your located Video device in FFdecoder API using its either the name or the index shown in the device listing:
+
+                === "Using device's index"
+
+                    ```python
+                    # initialize and formulate the decoder with `1` index source for BGR24 output
+                    decoder = FFdecoder("1", source_demuxer="avfoundation", frame_format="bgr24", verbose=True).formulate()
+                    ```
+
+                === "Using device's name"
+
+                    When specifying device's name, abbreviations using just the beginning of the device name are possible. Thus, to capture from a device named "Integrated iSight-camera" just "Integrated" is sufficient:
+
+                    ```python
+                    # initialize and formulate the decoder with "Integrated iSight-camera" source for BGR24 output
+                    decoder = FFdecoder("Integrated", source_demuxer="avfoundation", frame_format="bgr24", verbose=True).formulate()
+                    ```
+
+            - [x] **[OPTIONAL] Specify Default Video device:** You can also use the default device which is usually the first device in the listing by using "default" as source:
+
+                ```python
+                # initialize and formulate the decoder with "default" source for BGR24 output
+                decoder = FFdecoder("default", source_demuxer="avfoundation", frame_format="bgr24", verbose=True).formulate()
+                ```
+
+        !!! fail "If these steps doesn't work for you then reach us out on [Gitter ➶][gitter] Community channel"
+
+
+    ```python
+    # initialize and formulate the decoder with "USB2.0 Camera" source for BGR24 output
+    decoder = FFdecoder("USB2.0 Camera", source_demuxer="dshow", frame_format="bgr24", verbose=True).formulate()
+    ```
+
+    !!! example "Related usage recipe :material-pot-mix: can found [here ➶](../../../recipes/basic/decode-live-feed-devices/#capturing-and-previewing-frames-from-a-webcam)"
+
+- [x] **Screen Capturing/Recording:** Valid screen capture device's name _(e.g. `"desktop"`)_ or its index _(e.g. `":0.0"`)_ as input w.r.t [`source_demuxer`](#source_demuxer) parameter value in use. You can also specify additional specifications _(such as limiting capture area to a region, setting capturing coordinates, whether to capture mouse pointer and clicks etc.)_. For example, for capturing `"0:"` indexed device with `avfoundation` source demuxer on :material-apple: MacOS along with mouse pointer and clicks, we can do as follows in FFdecoder API: 
+
+    ??? tip "Specifying suitable Parameter(s) and Demuxer for Capturing your Desktop on different OSes"
+
+        === ":fontawesome-brands-windows: Windows"
+
+            Windows OS users can use the [gdigrab](https://ffmpeg.org/ffmpeg-devices.html#gdigrab) to grab video from the Windows screen. You can refer following steps to specify source for capturing different regions of your display:
+
+            !!! fail "For Windows OS users [`dshow`](https://github.com/rdp/screen-capture-recorder-to-video-windows-free) is also available for grabbing frames from your desktop. But it is highly unreliable and don't works most of the times."
+
+            - [x] **Capturing entire desktop:** For capturing all your displays as one big contiguous display, you can specify source, suitable parameters and demuxers in FFdecoder API as follows:
+
+                ```python
+                # define framerate
+                ffparams = {"-framerate": "30"}
+
+                # initialize and formulate the decoder with "desktop" source for BGR24 output
+                decoder = FFdecoder("desktop", source_demuxer="gdigrab", frame_format="bgr24", verbose=True, **ffparams).formulate()
+                ```
+
+            - [x] **Capturing a region:** If you want to limit capturing to a region, and show the area being grabbed, you can specify source and suitable parameters in FFdecoder API as follows:
+
+                !!! info "`x_offset` and `y_offset` specify the offsets of the grabbed area with respect to the top-left border of the desktop screen. They default to `0`. "
+
+                ```python
+                # define suitable parameters
+                ffparams = {
+                    "-framerate": "30", # input framerate
+                    "-ffprefixes": [
+                        "-offset_x", "10", "-offset_y", "20", # grab at position 10,20
+                        "-video_size", "640x480", # frame size
+                        "-show_region", "1", # show only region
+                    ],
+                }
+
+                # initialize and formulate the decoder with "desktop" source for BGR24 output
+                decoder = FFdecoder("desktop", source_demuxer="gdigrab", frame_format="bgr24", verbose=True, **ffparams).formulate()
+                ```
+
+        === ":material-linux: Linux"
+
+            Linux OS users can use the [x11grab](https://ffmpeg.org/ffmpeg-devices.html#x11grab) to capture an X11 display. You can refer following steps to specify source for capturing different regions of your display:
+
+            !!! note "For X11 display, the source input has the syntax: `"display_number.screen_number[+x_offset,y_offset]"`."
+
+            - [x] **Capturing entire desktop:** For capturing all your displays as one big contiguous display, you can specify source, suitable parameters and demuxers in FFdecoder API as follows:
+
+                ```python
+                # define framerate
+                ffparams = {"-framerate": "30"}
+
+                # initialize and formulate the decoder with ":0.0" desktop source for BGR24 output
+                decoder = FFdecoder(":0.0", source_demuxer="x11grab", frame_format="bgr24", verbose=True, **ffparams).formulate()
+                ```
+
+            - [x] **Capturing a region:** If you want to limit capturing to a region, and show the area being grabbed, you can specify source and suitable parameters in FFdecoder API as follows:
+
+                !!! info "`x_offset` and `y_offset` specify the offsets of the grabbed area with respect to the top-left border of the X11 screen. They default to `0`. "
+
+                ```python
+                # define suitable parameters
+                ffparams = {
+                    "-framerate": "30", # input framerate
+                    "-ffprefixes": [
+                        "-video_size", "1024x768", # frame size
+                    ],
+                }
+
+                # initialize and formulate the decoder with ":0.0" desktop source(starting with the upper-left corner at x=10, y=20) 
+                # for BGR24 output
+                decoder = FFdecoder(":0.0+10,20", source_demuxer="x11grab", frame_format="bgr24", verbose=True, **ffparams).formulate()
+                ```
+
+        === ":material-apple: MacOS"
+
+            MacOS users can use the [AVFoundation](https://ffmpeg.org/ffmpeg-devices.html#avfoundation) to list input devices and is the currently recommended framework by Apple for streamgrabbing on Mac OSX-10.7 (Lion) and later as well as on iOS. You can refer following steps to identify and specify your capture video device's name or index on MacOS/OSX machines:
+
+            !!! note "QTKit is also available for streamgrabbing on Mac OS X 10.4 (Tiger) and later, but has been marked deprecated since OS X 10.7 (Lion) and may not be available on future releases."
+
+
+            - [x] **Identify Video Devices:**  You can enumerate all the available input devices including screens ready to be captured using `avfoundation` as follows:
+
+                ```sh
+                $ ffmpeg -f avfoundation -list_devices true -i ""
+
+                ffmpeg version N-45279-g6b86dd5... --enable-runtime-cpudetect
+                  libavutil      51. 74.100 / 51. 74.100
+                  libavcodec     54. 65.100 / 54. 65.100
+                  libavformat    54. 31.100 / 54. 31.100
+                  libavdevice    54.  3.100 / 54.  3.100
+                  libavfilter     3. 19.102 /  3. 19.102
+                  libswscale      2.  1.101 /  2.  1.101
+                  libswresample   0. 16.100 /  0. 16.100
+                [AVFoundation input device @ 0x7f8e2540ef20] AVFoundation video devices:
+                [AVFoundation input device @ 0x7f8e2540ef20] [0] FaceTime HD camera (built-in)
+                [AVFoundation input device @ 0x7f8e2540ef20] [1] Capture screen 0
+                [AVFoundation input device @ 0x7f8e2540ef20] AVFoundation audio devices:
+                [AVFoundation input device @ 0x7f8e2540ef20] [0] Blackmagic Audio
+                [AVFoundation input device @ 0x7f8e2540ef20] [1] Built-in Microphone
+                ```
+
+
+            - [x] **Capturing entire desktop:** Then, you can specify and initialize your located screens in FFdecoder API using its index shown:
+
+                ```python
+                # initialize and formulate the decoder with `0:` index desktop screen for BGR24 output
+                decoder = FFdecoder("0:", source_demuxer="avfoundation", frame_format="bgr24", verbose=True).formulate()
+                ```
+
+            - [x] **[OPTIONAL] Capturing mouse:** You can also specify additional specifications to capture the mouse pointer and screen mouse clicks as follows:
+
+                ```python
+                # define specifications
+                ffparams = {"-ffprefixes":["-capture_cursor", "1", "-capture_mouse_clicks", "0"]}
+
+                # initialize and formulate the decoder with "0:" source for BGR24 output
+                decoder = FFdecoder("0:", source_demuxer="avfoundation", frame_format="bgr24", verbose=True, **ffparams).formulate()
+                ```
+
+        !!! fail "If these steps doesn't work for you then reach us out on [Gitter ➶][gitter] Community channel"
+
+    ```python
+    # define specifications
+    ffparams = {"-ffprefixes":["-capture_cursor", "1", "-capture_mouse_clicks", "0"]}
+
+    # initialize and formulate the decoder with "0:" source for BGR24 output
+    decoder = FFdecoder("0:", source_demuxer="avfoundation", frame_format="bgr24", verbose=True, **ffparams).formulate()
     ```
 
-- [ ] **Video Input devices:** _(Yet to be supported)_
+    !!! example "Related usage recipe :material-pot-mix: can found [here ➶](../../../recipes/basic/decode-live-feed-devices/#capturing-and-previewing-frames-from-your-desktop)"
 
-- [ ] **Screen Capture:** _(Yet to be supported)_
 
+- [x] **Virtual Sources:** Valid filtergraph to use as input with [`lavfi`](http://underpop.online.fr/f/ffmpeg/help/lavfi.htm.gz) _(**Libavfilter** input virtual device)_ source that reads data from the open output pads of a libavfilter filtergraph. For example, for generating and decoding [Mandelbrot](https://en.wikipedia.org/wiki/Mandelbrot_set) graph of `1280x720` frame size and `30` framerate using `lavfi` input virtual device, we can do as follows in FFdecoder API: 
 
+    ```python
+    # initialize and formulate the decoder with "mandelbrot" source of
+    # `1280x720` frame size and `30` framerate for BGR24 output
+    decoder = FFdecoder(
+        "mandelbrot=size=1280x720:rate=30",
+        source_demuxer="lavfi",
+        frame_format="bgr24",
+    ).formulate()
+    ```
 
+    !!! example "Related usage recipes :material-pot-steam: can found [here ➶](../../../recipes/advanced/decode-live-virtual-sources/#decoding-live-virtual-sources)"
 
 
 &nbsp;
 
 
-## **`frame_format`** 
+## **`source_demuxer`** 
 
+This parameter specifies the demuxer(`-f`) for the input source _(such as `dshow`, `v4l2`, `gdigrab` etc.)_ to support Live Feed Devices, as well as `lavfi` _(Libavfilter input virtual device)_ that reads data from the open output pads of a libavfilter filtergraph. 
 
-This parameter select pixel format of the output frames, such as `gray` for grayscale output. If not specified, its value is defaults to `rgb24` _(24-bit RGB)_.
+!!! warning "Any invalid or unsupported value to `source_demuxer` parameter value will raise `Assertion` error!"
 
-!!! warning "Any invalid or unsupported value to `frame_format` parameter will discarded!"
+!!! tip "Use `#!sh ffmpeg -demuxers` terminal command to lists all FFmpeg supported demuxers."
+
+**Data-Type:** String
+
+**Default Value:** Its default value is `None`.
+
+**Usage:**
+
+```python
+# initialize and formulate the decoder with `dshow` demuxer
+decoder = FFdecoder("foo.mp4", source_demuxer="dshow").formulate()
+```
+
+
+&nbsp; 
+
+
+## **`frame_format`** 
 
-!!! tip "Supported Decoders"
+This parameter select the pixel format for output video frames _(such as `gray` for grayscale output)_. If not specified, its value defaults to `rgb24` _(24-bit RGB)_.
 
-    All the pixel formats that are compiled with FFmpeg in use, are supported by FFdecoder API. You can easily check the compiled pixel formats by running following command in your terminal:
+!!! warning "Any invalid or unsupported value to `frame_format` parameter will discarded!"
 
-    ```sh
-    # for checking pixel formats
-    ffmpeg -pix_fmts           # use `ffmpeg.exe -pix_fmts` on windows
-    ``` 
+!!! tip "Use `#!sh ffmpeg -pix_fmts` terminal command to lists all FFmpeg supported pixel formats."
 
 **Data-Type:** String
 
@@ -135,18 +444,31 @@ This parameter select pixel format of the output frames, such as `gray` for gray
 decoder = FFdecoder("foo.mp4", frame_format="gray").formulate()
 ```
 
-
+!!! example "Various Pixel formats related usage recipes :material-pot-steam: can found [here ➶](../../../recipes/basic/decode-video-files/#capturing-and-previewing-bgr-frames-from-a-video-file)"
 
 &nbsp; 
 
-
 ## **`custom_ffmpeg`**
 
-This parameter assigns the custom _path/directory_ where the custom/downloaded FFmpeg executables are located.
+This parameter can be used to manually assigns the system _file-path/directory_ where the custom or downloaded FFmpeg executable is located.
 
-!!! info "Behavior on Windows"
+??? info "Behavior on Windows :fontawesome-brands-windows:"
     
-    If a custom FFmpeg executable's path | directory is not provided through `custom_ffmpeg` parameter on Windows machine, then FFdecoder API will ==automatically attempt to download and extract suitable Static FFmpeg binaries at suitable location on your windows machine==. More information can be found [here ➶](../ffmpeg_install/#a-auto-installation).
+    If custom FFmpeg executable binary _file-path/directory_ is not assigned through `custom_ffmpeg` parameter on Windows machine, then FFdecoder API will ==automatically attempt to download and extract suitable Static FFmpeg binaries at suitable location on your windows machine==. More information can be found [here ➶](../ffmpeg_install/#a-auto-installation).
+
+    ??? question "How to change FFmpeg Static Binaries download directory?"
+
+        You can use `-ffmpeg_download_path` _(via. [`-custom_sourcer_params`](#exclusive-parameters))_ exclusive parameter in FFdecoder API to set the custom directory for downloading FFmpeg Static Binaries during the [Auto-Installation](../../../installation/ffmpeg_install/#a-auto-installation) step on Windows Machines. If this parameter is not altered, then these binaries will auto-save to the default temporary directory (for e.g. `C:/User/temp`) on your windows machine. It can be used as follows in FFdecoder API:
+
+        ```python
+        # # define suitable parameter to download at "C:/User/foo/foo1"
+        ffparams = {"-custom_sourcer_params": {"-ffmpeg_download_path": "C:/User/foo/foo1"}}
+
+        # initialize and formulate the decoder
+        FFdecoder("foo.mp4", verbose=True, **ffparams).formulate()
+        ```
+
+!!! warning "If binaries were not found at the manually specified path, DeFFcode APIs will throw **RuntimeError**!"
 
 **Data-Type:** String
 
@@ -179,140 +501,122 @@ FFdecoder("foo.mp4", verbose=True).formulate()
 &nbsp; 
 
 
-## **`extraparams`**
-
-This parameter accepts to all [supported parameters](#supported-parameters) formatted as as its attributes:
-
-!!! danger "Kindly read [**FFmpeg Docs**](https://ffmpeg.org/documentation.html) carefully before passing any additional values to `extraparams` parameter. Wrong invalid values may result in undesired errors or no output at all."
+## **`ffparams`**
 
+This dictionary parameter accepts all [supported parameters](#supported-parameters) formatted as its attributes:
 
 **Data-Type:** Dictionary
 
 **Default Value:** Its default value is `{}`.
 
-
 ### Supported Parameters
 
 #### A. FFmpeg Parameters 
 
-Almost any FFmpeg parameter _(supported by installed FFmpeg)_  can be passed as dictionary attributes in `extraparams`. But make sure to read [**FFmpeg Docs**](https://ffmpeg.org/documentation.html) carefully first.
-
-Let's assume we're using `h264_nvenc` NVDEC/CUVID decoder to produce faster frames with low memory footprints, then we can pass required FFmpeg parameters as dictionary attributes as follows:
+> Almost any FFmpeg parameter _(supported by installed FFmpeg)_  can be passed as dictionary attributes in `ffparams` parameter.
 
-!!! tip "Kindly check [NVDEC/CUVID doc ➶](https://trac.ffmpeg.org/wiki/HWAccelIntro) and other [FFmpeg Docs ➶](https://ffmpeg.org/documentation.html) for more information on these parameters"
+Let's assume we want to `00:00:01.45`_(or 1045msec)_ in time and decode one single frame from given source _(say `foo.mp4`)_ in FFdecoder API, then we can assign required FFmpeg parameters as dictionary attributes as follows:
 
+!!! danger "Kindly read [**FFmpeg Docs**](https://ffmpeg.org/documentation.html) carefully before passing any additional values to `ffparams` parameter. Wrong invalid values may result in undesired errors or no output at all."
 
-!!! error "All ffmpeg parameters are case-sensitive. Remember to double check every parameter if any error occurs."
+!!! alert "All FFmpeg parameters are case-sensitive. Remember to double check every parameter if any error(s) occurred."
 
 ```python
-extraparams = {"-vcodec":"h264_nvenc", "-ffpostfixes":["-hwaccel", "cuda", "-hwaccel_output_format", "cuda"]} 
+# define the FFmpeg parameter to seek to 00:00:01.45(or 1s and 45msec)
+# in time and get one single frame
+ffparams = {"-ss": "00:00:01.45", "-frames:v": 1}
+
+# initialize and formulate decoder with suitable source and FFmpeg params
+decoder = FFdecoder("foo.mp4", verbose=True, **ffparams).formulate()
 ```
 
 &thinsp;
 
 #### B. Exclusive Parameters
 
-In addition to FFmpeg parameters, FFdecoder API also supports few Exclusive Parameters to flexibly alter its internal properties as well as handle some special FFmpeg parameters. These parameters are discussed below:
+> In addition to FFmpeg parameters, FFdecoder API also supports few Exclusive Parameters, to allow users to flexibly change its internal pipeline, properties, and handle some special FFmpeg parameters _(such as repeated `map`)_ that cannot be assigned via. python dictionary. 
+
+These parameters are discussed below:
+
 
+* **`-vcodec`** _(str)_ : This attribute works similar to `-vcodec` FFmpeg parameter for specifying supported decoders that are compiled with FFmpeg in use. If not specified, it's value is derived from source video metadata. Its usage is as follows: 
 
-* **`-vcodec`** _(str)_ : works similiar to `-vcodec` FFmpeg parameter for specifying [supported decoders](#supported-decoders). If not specified, it derived from source video. Its usage is as follows: 
+    !!! tip "Use `#!sh ffmpeg -decoders` terminal command to lists all FFmpeg supported decoders."
 
-    !!! info "To remove `-vcodec` forcefully from FFmpeg Pipeline, assign its value Nonetype as `#!py3 {"-vcodec":None}` in extraparams"
+    !!! info "To remove `-vcodec` forcefully from FFmpeg Pipeline, assign its value Nonetype as `#!py3 {"-vcodec":None}` in ffparams"
 
     ```python
-    extraparams = {"-vcodec": "h264"} # set decoder to `h264`
+    # define suitable parameter
+    ffparams = {"-vcodec": "h264"} # set decoder to `h264`
     ```
 
 &ensp;
 
 
-* **`-framerate`** _(float/int)_ : works similiar to `-framerate` FFmpeg parameter for generating video-frames at specified framerate. If not specified, it calculated from source video framerate. Its usage is as follows: 
+* **`-framerate`** _(float/int)_ : This attribute works similar to `-framerate` FFmpeg parameter for generating video-frames at specified framerate. If not specified, it calculated from source video metadata. Its usage is as follows: 
 
     ```python
-    extraparams = {"-framerate": 60.0} # set input video source framerate to 60fps
+    # define suitable parameter
+    ffparams = {"-framerate": 60.0} # set input video source framerate to 60fps
     ```
 
 &ensp;
 
-* **`-custom_resolution`** _(tuple/list)_ : sets the custom resolution/size/dimensions of the output frames. Its value can either be a **tuple** => `(width,height)` or a **list** => `[width, height]`. If not specified, it calculated from source video resolution. Its usage is as follows: 
+* **`-custom_resolution`** _(tuple/list)_ : This attribute sets the custom resolution/size/dimensions of the output frames. Its value can either be a **tuple** => `(width,height)` or a **list** => `[width, height]`. If not specified, it calculated from source video metadata. Its usage is as follows: 
     
     ```python
-    extraparams = {"-output_dimensions": (1280,720)} # to produce a 1280x720 resolution/scale output video
+    # define suitable parameter
+    ffparams = {"-output_dimensions": (1280,720)} # to produce a 1280x720 resolution/scale output video
     ```
 
 &ensp;
 
-* **`-ffprefixes`** _(list)_: sets the special FFmpeg parameters(at the beginning) that are repeated more than once or occurs in a specific order in the FFmpeg command. Its value can be of datatype **`list`** only and its usage is as follows: 
-
-    ??? alert "This parameter is different from `-ffpostfixes` and `-clones`"
-        All three `-clones`, `-ffpostfixes`, and `-ffprefixes` parameters even tho fundamentally work the same, they're meant to serve at different places in the FFmpeg command. Normally, FFdecoder API pipeline looks something like following with all three parameters in place:
-        ```sh
-        ffmpeg {{-ffprefixes FFmpeg params}} -vcodec h264 {{-ffpostfixes FFmpeg params}} -i foo.mp4 -pix_fmt rgb24 -s 1280x720 -framerate 25.0 {{-clones FFmpeg params}} -f rawvideo -
-        ```
-
-    !!! tip "Turn on verbose([`verbose = True`](#verbose)) to see the FFmpeg command that is being executed in FFdecoder's pipeline. This helps you debug/address any issues and make adjustments accordingly."
-        
-    ```python
-    extraparams = {"-ffprefixes": ['-re']} # executes as `ffmpeg -re <rest of command>`
-    ```
-
-&ensp;
+* **`-ffprefixes`** _(list)_: This attribute sets the special FFmpeg parameters that generally occurs at the very beginning _(such as `-re`)_ before input (`-i`) source. The FFmpeg parameters defined with this attribute can repeated more than once and maintains its original order in the FFmpeg command. Its value can be of datatype **`list`** only and its usage is as follows: 
 
+    ??? info "Difference from  `-clones` parameter"
 
-* **`-ffpostfixes`** _(list)_: sets the special FFmpeg parameters(in the middle) that are repeated more than once or occurs in a specific order in the FFmpeg command. Its value can be of datatype **`list`** only and its usage is as follows: 
+        The `-clones` and `-ffprefixes` parameters even tho fundamentally work the same, they're meant to serve at different positions in the FFmpeg command. Normally, FFdecoder API pipeline looks something like following with these parameters in place:
 
-    ??? alert "This parameter is different from `-clones` and `-ffprefixes`"
-        All three `-clones`, `-ffpostfixes`, and `-ffprefixes` parameters even tho fundamentally work the same, they're meant to serve at different places in the FFmpeg command. Normally, FFdecoder API pipeline looks something like following with all three parameters in place:
         ```sh
-        ffmpeg {{-ffprefixes FFmpeg params}} -vcodec h264 {{-ffpostfixes FFmpeg params}} -i foo.mp4 -pix_fmt rgb24 -s 1280x720 -framerate 25.0 {{-clones FFmpeg params}} -f rawvideo -
+        ffmpeg {{-ffprefixes FFmpeg params}} -vcodec h264 -i foo.mp4 -pix_fmt rgb24 -s 1280x720 -framerate 25.0 {{-clones FFmpeg params}} -f rawvideo -
         ```
 
-    !!! tip "Turn on verbose([`verbose = True`](#verbose)) to see the FFmpeg command that is being executed in FFdecoder's pipeline. This helps you debug/address any issues and make adjustments accordingly."
+    !!! tip "Turn on [`verbose`](#verbose) parameter _(`verbose = True`)_ to see the FFmpeg command that is being executed in FFdecoder's pipeline. This helps you debug/address any issues and make adjustments accordingly."
         
     ```python
-    extraparams = {"-ffpostfixes": ['-preset', 'fast']} # executes as `ffmpeg -vcodec h264 -preset fast <rest of command>`
+    # define suitable parameter
+    ffparams = {"-ffprefixes": ['-re']} # executes as `ffmpeg -re <rest of command>`
     ```
 
 &ensp;
 
-* **`-clones`** _(list)_: sets the special FFmpeg parameters(at the end) that are repeated more than once or occurs in a specific order in the FFmpeg command. Its value can be of datatype **`list`** only and its usage is as follows: 
-
-    ??? alert "This parameter is different from `-ffpostfixes` and `-ffprefixes`"
-        All three `-clones`, `-ffpostfixes`, and `-ffprefixes` parameters even tho fundamentally work the same, they're meant to serve at different places in the FFmpeg command. Normally, FFdecoder API pipeline looks something like following with all three parameters in place:
-        ```sh
-        ffmpeg {{-ffprefixes FFmpeg params}} -vcodec h264 {{-ffpostfixes FFmpeg params}} -i foo.mp4 -pix_fmt rgb24 -s 1280x720 -framerate 25.0 {{-clones FFmpeg params}} -f rawvideo -
-        ```
+* **`-clones`** _(list)_:  This attribute sets the special FFmpeg parameters after that are repeated more than once or occurs in a specific order _(that cannot be altered)_ in the FFmpeg command. Its value can be of datatype **`list`** only and its usage is as follows: 
 
-    !!! tip "Turn on verbose([`verbose = True`](#verbose)) to see the FFmpeg command that is being executed in FFdecoder's pipeline. This helps you debug/address any issues and make adjustments accordingly."
+    !!! tip "Turn on [`verbose`](#verbose) parameter _(`verbose = True`)_ to see the FFmpeg command that is being executed in FFdecoder's pipeline. This helps you debug/address any issues and make adjustments accordingly."
 
     ```python
-    extraparams = {"-clones": ['-map', '0:v:0', '-map', '1:a?']} 
-    # executes as `ffmpeg -vcodec -i foo.mp4 -pix_fmt rgb24 -s 1280x720 -framerate 25.0 -map 0:v:0 -map 1:a -f rawvideo -
+    # define suitable parameter
+    ffparams = {"-clones": ['-map', '0:v:0', '-map', '1:a?']} 
+    
+    # NOTE: Will be format as `ffmpeg -vcodec -i foo.mp4 -pix_fmt rgb24 -s 1280x720 -framerate 25.0 -map 0:v:0 -map 1:a -f rawvideo -`
     ```
 
 &ensp;
 
-* **`-custom_sourcer_params`** _(dict)_ : assigns values to Sourcer API's [`source_params`](../../sourcer/params/#sourcer_params) dictionary parameter directly through FFdecoder API. Its usage is as follows: 
+* **`-custom_sourcer_params`** _(dict)_ :  This attribute assigns parameter meant for Sourcer API's [`sourcer_params`](../../sourcer/params/#sourcer_params) dictionary parameter, directly through FFdecoder API. Its usage is as follows: 
     
     ```python
-    extraparams = {"-custom_sourcer_params": {"-ffmpeg_download_path": "C:/User/foo/foo1"}}
-    # will be assigned to Sourcer API's `source_params` directly
+    # define suitable parameter meant for `sourcer_params`
+    ffparams = {"-custom_sourcer_params": {"-ffmpeg_download_path": "C:/User/foo/foo1"}}
     ```
 
 &ensp;
 
 * **`-passthrough_audio`** _(bool/list)_ : _(Yet to be supported)_
 
-&ensp;
-
-
-### Supported Decoders
-
-All the decoders that are compiled with FFmpeg in use, are supported by FFdecoder API. You can easily check the compiled decoders by running following command in your terminal:
-
-```sh
-# for checking decoders
-ffmpeg -decoders           # use `ffmpeg.exe -decoders` on windows
-``` 
-
 &nbsp; 
+
+<!--
+External URLs
+-->
+[gitter]: https://gitter.im/deffcode-python/community
\ No newline at end of file
diff --git a/docs/reference/ffhelper.md b/docs/reference/ffhelper.md
index 1d49b35..07e2ecc 100644
--- a/docs/reference/ffhelper.md
+++ b/docs/reference/ffhelper.md
@@ -18,6 +18,16 @@ limitations under the License.
 ===============================================
 -->
 
+!!! abstract "Following methods are exclusively design to handle FFmpeg related tasks. These tasks includes validation of installed FFmpeg binaries, downloading of FFmpeg binaries(on Windows), and parsing of FFmpeg metadata into useful information using various pattern matching methods."
+
+!!! example "For usage examples, kindly refer our **[Basic Recipes :cake:](../../recipes/basic)** and **[Advanced Recipes :croissant:](../../recipes/advanced)**"
+
+&nbsp;
+
+::: deffcode.ffhelper.get_valid_ffmpeg_path
+
+&nbsp;
+
 ::: deffcode.ffhelper.get_valid_ffmpeg_path
 
 &nbsp;
diff --git a/docs/reference/sourcer/index.md b/docs/reference/sourcer/index.md
index 7ab8ad3..75b1ecd 100644
--- a/docs/reference/sourcer/index.md
+++ b/docs/reference/sourcer/index.md
@@ -20,40 +20,9 @@ limitations under the License.
 
 # Sourcer API
 
-DeFFcode's Sourcer API acts as **Source Validator and Classifier** _(just like ==_talent sourcer_==)_ for its [FFdecoder API](../../reference/ffdecoder). This API parses FFmpeg's [`subprocess`](https://docs.python.org/3/library/subprocess.html) output for a given source and uses it to validate and identify all valid streams available in it.
-
-Sourcer API also acts as a **Metadata Extraction Tool** that extracts metadata of all specified valid streams that FFdecoder API uses for formatting its default FFmpeg pipeline for frames generation. Furthermore, Sourcer is responsible for **validating FFmpeg executable path** for DeFFcode. 
-
-???+ info "Extracting Source Video Metadata in DeFFcode"
-      Metadata can be easily extracted as a dictionary in Sourcer API using its [`retrieve_metadata()`](#deffcode.sourcer.Sourcer.retrieve_metadata) method. However, you can also use [`metadata`](../../reference/ffdecoder/#deffcode.ffdecoder.FFdecoder.metadata) property object in FFdecoder API to extract metadata as Pretty JSON, and update it directly as desired. **More information can be found in [this usage example ➶](../../examples/basic/#generate-source-video-metadata)**.
-
-All parameter available with Sourcer API extracted as python dictionary(On :fontawesome-brands-windows:Windows), are as follows:  
-
-```py
-{
-    "ffmpeg_binary_path": "C:\\Users\\foo\\AppData\\Local\\Temp\\ffmpeg-static-win64-gpl/bin/ffmpeg.exe",
-    "source": "foo.mp4",
-    "source_extension": ".mp4",
-    "source_video_resolution": [1280, 720],
-    "source_video_framerate": 25.0,
-    "source_video_pixfmt": "yuv420p",
-    "source_video_decoder": "h264",
-    "source_duration_sec": 5.31,
-    "approx_video_nframes": 133,
-    "source_video_bitrate": "1205k",
-    "source_audio_bitrate": "384k",
-    "source_audio_samplerate": "48000 Hz",
-    "source_has_video": True,
-    "source_has_audio": True,
-    "source_has_image_sequence": False,
-}
-```
-
-&thinsp;
-
-!!! example "For usage, kindly refer our **[Basic Recipes :pie:](../../examples/basic)** and **[Advanced Recipes :microscope:](../../examples/advanced)**"
-
-!!! info "Sourcer API parameters are explained [here ➶](params/)"
+<img src="../../assets/images/sourcer.png" alt="Sourcer API Functional Diagram" title="Sourcer API Functional Diagram" loading="lazy" width="90%" class="shadow2" />
+
+&emsp;
 
 ::: deffcode.Sourcer
 
diff --git a/docs/reference/sourcer/params.md b/docs/reference/sourcer/params.md
index bc73df8..5761fea 100644
--- a/docs/reference/sourcer/params.md
+++ b/docs/reference/sourcer/params.md
@@ -22,11 +22,13 @@ limitations under the License.
 
 ## **`source`**
 
-!!! warning "Sourcer API will throw `RuntimeError` if `source` provided is invalid or missing."
+This parameter defines the input source (`-i`) for probing.
 
+!!! warning "Sourcer API will throw `AssertionError` if `source` provided is invalid or missing."
 
-This parameter defines the default input source.
+!!! danger "Sourcer API checks for _`video bitrate`_ or _`frame-size` and `framerate`_ in video's metadata to ensure given input `source` has usable video stream available. Thereby, it will throw `ValueError` if it fails to find those parameters."
 
+!!! info "Multiple video inputs are not yet supported!"
 
 **Data-Type:** String.
 
@@ -34,35 +36,36 @@ Its valid input can be one of the following:
 
 - [x] **Filepath:** _Valid path of the video file, for e.g `"/home/foo.mp4"` as follows:_
 
-    !!! alert "Multiple video file paths are not yet support!"
-
     ```python
-    decoder = Sourcer('/home/foo.mp4').formulate()
+    # initialize the sourcer and probe it
+    sourcer = Sourcer('/home/foo.mp4').probe_stream()
     ```
 
-- [x] **Image Sequence:** _Valid image sequence such as sequential `'img%03d.png'` or `'*.png'` glob pattern or even single(loop) image as input:_
+- [x] **Image Sequence:** _Valid image sequence such as sequential(`'img%03d.png'`) or glob pattern(`'*.png'`) or single (looping) image as input:_
 
     
     === "Sequential"
 
-        ```python
-        # initialize and formulate the decoder
-        decoder = Sourcer('img%03d.png').formulate()
-        ```
+        ??? question "How to start with specific number image?"
+        
+            You can use `-start_number` FFmpeg parameter if you want to start with specific number image:
 
-        You can use `-start_number` FFmpeg parameter if you want to start with specific number:
+            ```python
+            # define `-start_number` such as `5`
+            sourcer_params = {"-ffprefixes":["-start_number", "5"]}
 
-        ```python
-        # define `-start_number` such as `5`
-        sourcer_params = {"-ffpostfixes":["-start_number", "5"]}
+            # initialize the sourcer with define parameters
+            sourcer = Sourcer('img%03d.png', verbose=True, **sourcer_params).probe_stream()
+            ```
 
-        # initialize and formulate the decoder with define parameters
-        decoder = Sourcer('img%03d.png', verbose=True, **sourcer_params).formulate()
+        ```python
+        # initialize the sourcer and probe it
+        sourcer = Sourcer('img%03d.png', verbose=True).probe_stream()
         ```
 
     === "Glob pattern"
 
-        Bash-style globbing _(`*` represents any number of any characters)_ is useful if your images are sequential but not necessarily in a numerically sequential order. You can do it as follows:
+        !!! abstract "Bash-style globbing _(`*` represents any number of any characters)_ is useful if your images are sequential but not necessarily in a numerically sequential order."
 
         !!! warning "The glob pattern is not available on Windows builds."
 
@@ -70,47 +73,291 @@ Its valid input can be one of the following:
         # define `-pattern_type glob` for accepting glob pattern
         sourcer_params = {"-ffprefixes":["-pattern_type", "glob"]}
 
-        # initialize and formulate the decoder with define parameters
-        decoder = Sourcer('img*.png', verbose=True, **sourcer_params).formulate()
+        # initialize the sourcer with define parameters and probe it
+        sourcer = Sourcer('img*.png', verbose=True, **sourcer_params).probe_stream()
         ```
 
-    === "Single image"
-
-        You can use a single looping image as follows:
+    === "Single (loop) image"
 
         ```python
         # define `-loop 1` for looping
         sourcer_params = {"-ffprefixes":["-loop", "1"]}
 
-        # initialize and formulate the decoder with define parameters
-        decoder = Sourcer('img.jpg', verbose=True, **sourcer_params).formulate()
+        # initialize the sourcer with define parameters and probe it
+        sourcer = Sourcer('img.jpg', verbose=True, **sourcer_params).probe_stream()
         ```
 
+
 - [x] **Network Address:** _Valid (`http(s)`, `rtp`, `rstp`, `rtmp`, `mms`, etc.) incoming network stream address such as `'rtsp://xx:yy@192.168.1.ee:fd/av0_0'` as input:_
 
     ```python
     # define `rtsp_transport` or necessary parameters 
-    sourcer_params = {"-ffpostfixes":["-rtsp_transport", "tcp"]}
+    sourcer_params = {"-ffprefixes":["-rtsp_transport", "tcp"]}
+
+    # initialize the sourcer with define parameters and probe it
+    sourcer = Sourcer('rtsp://xx:yy@192.168.1.ee:fd/av0_0', verbose=True, **sourcer_params).probe_stream()
+    ```
+
+
+- [x] **Video Capture Devices (Webcams):** Valid video probe device's name _(e.g. `"USB2.0 Camera"`)_ or its path _(e.g. `"/dev/video0"` on linux)_ or its index _(e.g. `"0"`)_ as input  w.r.t [`source_demuxer`](#source_demuxer) parameter value in use. For example, for probing `"USB2.0 Camera"` named device with `dshow` source demuxer on :fontawesome-brands-windows: Windows, we can do as follows in Sourcer API: 
+
+    ??? tip "Identifying and Specifying Device name/path/index and suitable Demuxer on different OSes"
+
+        === ":fontawesome-brands-windows: Windows"
+
+            Windows OS users can use the [dshow](https://trac.ffmpeg.org/wiki/DirectShow) (DirectShow) to list video input device which is the preferred option for Windows users. You can refer following steps to identify and specify your input video device's name:
+
+            - [x] **Identify Video Devices:** You can locate your video device's name _(already connected to your system)_ using `dshow` as follows:
+
+                ```sh
+                c:\> ffmpeg.exe -list_devices true -f dshow -i dummy
+                
+                ffmpeg version N-45279-g6b86dd5... --enable-runtime-cpudetect
+                  libavutil      51. 74.100 / 51. 74.100
+                  libavcodec     54. 65.100 / 54. 65.100
+                  libavformat    54. 31.100 / 54. 31.100
+                  libavdevice    54.  3.100 / 54.  3.100
+                  libavfilter     3. 19.102 /  3. 19.102
+                  libswscale      2.  1.101 /  2.  1.101
+                  libswresample   0. 16.100 /  0. 16.100
+                [dshow @ 03ACF580] DirectShow video devices
+                [dshow @ 03ACF580]  "Integrated Camera"
+                [dshow @ 03ACF580]  "USB2.0 Camera"
+                [dshow @ 03ACF580] DirectShow audio devices
+                [dshow @ 03ACF580]  "Microphone (Realtek High Definition Audio)"
+                [dshow @ 03ACF580]  "Microphone (USB2.0 Camera)"
+                dummy: Immediate exit requested
+                ```
+
+            - [x] **Specify Video Device's name:** Then, you can specify and initialize your located Video device's name in Sourcer API as follows:
+
+                ```python
+                # initialize the sourcer with "USB2.0 Camera" source and probe it
+                sourcer = Sourcer("USB2.0 Camera", source_demuxer="dshow", verbose=True).probe_stream()
+                ```
+
+            - [x] **[OPTIONAL] Specify Video Device's index along with name:** If there are multiple Video devices with similar name, then you can use `-video_device_number` parameter to specify the arbitrary index of the particular device. For instance, to open second video device with name `"Camera"` you can do as follows:
+
+                ```python
+                # define video_device_number as 1 (numbering start from 0)
+                sourcer_params = {"-ffprefixes":["-video_device_number", "1"]}
+
+                # initialize the sourcer with "Camera" source and probe it
+                sourcer = Sourcer("Camera", source_demuxer="dshow", verbose=True, **sourcer_params).probe_stream()
+                ```
+
+        === ":material-linux: Linux"
+
+            Linux OS users can use the [`video4linux2`](https://trac.ffmpeg.org/wiki/Capture/Webcam#Linux) _(or its alias `v4l2`)_ to list to all video capture devices such as from an USB webcam. You can refer following steps to identify and specify your probe video device's path:
+
+            - [x] **Identify Video Devices:** Linux systems tend to automatically create file device node/path when the device _(e.g. an USB webcam)_ is plugged into the system, and has a name of the kind `'/dev/videoN'`, where `N` is a index associated to the device. To get the list of all available file device node/path on your Linux machine, you can use the `v4l-ctl` command.
+
+                !!! tip "You can use `#!sh sudo apt install v4l-utils` APT command to install `v4l-ctl` tool on Debian-based Linux distros."
+
+                ```sh
+                $ v4l2-ctl --list-devices
+
+                USB2.0 PC CAMERA (usb-0000:00:1d.7-1):
+                        /dev/video1
+
+                UVC Camera (046d:0819) (usb-0000:00:1d.7-2):
+                        /dev/video0
+                ```
+
+            - [x] **Specify Video Device's path:** Then, you can specify and initialize your located Video device's path in Sourcer API as follows:
+
+                ```python
+                # initialize the sourcer with "/dev/video0" source and probe it
+                sourcer = Sourcer("/dev/video0", source_demuxer="v4l2", verbose=True).probe_stream()
+                ```
+
+        === ":material-apple: MacOS"
+
+            MacOS users can use the [AVFoundation](https://ffmpeg.org/ffmpeg-devices.html#avfoundation) to list input devices and is the currently recommended framework by Apple for streamgrabbing on Mac OSX-10.7 (Lion) and later as well as on iOS. You can refer following steps to identify and specify your probe video device's name or index on MacOS/OSX machines:
+
+            !!! note "QTKit is also available for streamgrabbing on Mac OS X 10.4 (Tiger) and later, but has been marked deprecated since OS X 10.7 (Lion) and may not be available on future releases."
 
-    # initialize and formulate the decoder with define parameters
-    decoder = Sourcer('rtsp://xx:yy@192.168.1.ee:fd/av0_0', verbose=True, **sourcer_params).formulate()
+
+            - [x] **Identify Video Devices:** Then, You can locate your Video device's name and index using `avfoundation` as follows:
+
+                ```sh
+                $ ffmpeg -f avfoundation -list_devices true -i ""
+
+                ffmpeg version N-45279-g6b86dd5... --enable-runtime-cpudetect
+                  libavutil      51. 74.100 / 51. 74.100
+                  libavcodec     54. 65.100 / 54. 65.100
+                  libavformat    54. 31.100 / 54. 31.100
+                  libavdevice    54.  3.100 / 54.  3.100
+                  libavfilter     3. 19.102 /  3. 19.102
+                  libswscale      2.  1.101 /  2.  1.101
+                  libswresample   0. 16.100 /  0. 16.100
+                [AVFoundation input device @ 0x7f8e2540ef20] AVFoundation video devices:
+                [AVFoundation input device @ 0x7f8e2540ef20] [0] FaceTime HD camera (built-in)
+                [AVFoundation input device @ 0x7f8e2540ef20] [1] Capture screen 0
+                [AVFoundation input device @ 0x7f8e2540ef20] AVFoundation audio devices:
+                [AVFoundation input device @ 0x7f8e2540ef20] [0] Blackmagic Audio
+                [AVFoundation input device @ 0x7f8e2540ef20] [1] Built-in Microphone
+                ```
+
+
+            - [x] **Specify Video Device's name or index:** Then, you can specify and initialize your located Video device in Sourcer API using its either the name or the index shown in the device listing:
+
+                === "Using device's index"
+
+                    ```python
+                    # initialize the sourcer with `1` index source and probe it
+                    sourcer = Sourcer("1", source_demuxer="avfoundation", verbose=True).probe_stream()
+                    ```
+
+                === "Using device's name"
+
+                    When specifying device's name, abbreviations using just the beginning of the device name are possible. Thus, to probe from a device named "Integrated iSight-camera" just "Integrated" is sufficient:
+
+                    ```python
+                    # initialize the sourcer with "Integrated iSight-camera" source 
+                    sourcer = Sourcer("Integrated", source_demuxer="avfoundation", verbose=True).probe_stream()
+                    ```
+
+        !!! fail "If these steps doesn't work for you then reach us out on [Gitter ➶][gitter] Community channel"
+
+
+    ```python
+    # initialize the sourcer with "USB2.0 Camera" source 
+    sourcer = Sourcer("USB2.0 Camera", source_demuxer="dshow", verbose=True).probe_stream()
     ```
 
-- [ ] **Video Input devices:** _(Yet to be supported)_
 
-- [ ] **Screen Capture:** _(Yet to be supported)_
+- [x] **Screen Capturing/Recording:** Valid screen probe device's name _(e.g. `"desktop"`)_ or its index _(e.g. `":0.0"`)_ as input w.r.t [`source_demuxer`](#source_demuxer) parameter value in use. For example, for probing `"0:"` indexed device with `avfoundation` source demuxer on :material-apple: MacOS, we can do as follows in Sourcer API: 
+
+    ??? tip "Specifying suitable Parameter(s) and Demuxer for Capturing your Desktop on different OSes"
+
+        === ":fontawesome-brands-windows: Windows"
+
+            Windows OS users can use the [gdigrab](https://ffmpeg.org/ffmpeg-devices.html#gdigrab) to grab video from the Windows screen. You can refer following steps to specify source for probing:
+
+            !!! fail "For Windows OS users [`dshow`](https://github.com/rdp/screen-probe-recorder-to-video-windows-free) is also available for grabbing frames from your desktop. But it is highly unreliable and don't works most of the times."
+
+            ```python
+            # define framerate
+            sourcer_params = {"-framerate": "30"}
+
+            # initialize the sourcer with "desktop" source and probe it
+            sourcer = Sourcer("desktop", source_demuxer="gdigrab", verbose=True, **sourcer_params).probe_stream()
+            ```
+
+        === ":material-linux: Linux"
+
+            Linux OS users can use the [x11grab](https://ffmpeg.org/ffmpeg-devices.html#x11grab) to probe an X11 display. You can refer following steps to specify source for probing:
+
+            ```python
+            # initialize the sourcer with ":0.0" desktop source and probe it
+            sourcer = Sourcer(":0.0", source_demuxer="x11grab", verbose=True).probe_stream()
+            ```
+
+        === ":material-apple: MacOS"
+
+            MacOS users can use the [AVFoundation](https://ffmpeg.org/ffmpeg-devices.html#avfoundation) to list input devices and is the currently recommended framework by Apple for streamgrabbing on Mac OSX-10.7 (Lion) and later as well as on iOS. You can refer following steps to identify and specify your probe video device's name or index in Sourcer API:
+
+            !!! note "QTKit is also available for streamgrabbing on Mac OS X 10.4 (Tiger) and later, but has been marked deprecated since OS X 10.7 (Lion) and may not be available on future releases."
+
+
+            You can enumerate all the available input devices including screens ready to be probed using `avfoundation` as follows:
+
+            ```sh
+            $ ffmpeg -f avfoundation -list_devices true -i ""
+
+            ffmpeg version N-45279-g6b86dd5... --enable-runtime-cpudetect
+              libavutil      51. 74.100 / 51. 74.100
+              libavcodec     54. 65.100 / 54. 65.100
+              libavformat    54. 31.100 / 54. 31.100
+              libavdevice    54.  3.100 / 54.  3.100
+              libavfilter     3. 19.102 /  3. 19.102
+              libswscale      2.  1.101 /  2.  1.101
+              libswresample   0. 16.100 /  0. 16.100
+            [AVFoundation input device @ 0x7f8e2540ef20] AVFoundation video devices:
+            [AVFoundation input device @ 0x7f8e2540ef20] [0] FaceTime HD camera (built-in)
+            [AVFoundation input device @ 0x7f8e2540ef20] [1] Capture screen 0
+            [AVFoundation input device @ 0x7f8e2540ef20] AVFoundation audio devices:
+            [AVFoundation input device @ 0x7f8e2540ef20] [0] Blackmagic Audio
+            [AVFoundation input device @ 0x7f8e2540ef20] [1] Built-in Microphone
+            ```
+
+            Then, you can specify and initialize your located screens in Sourcer API using its index shown:
+
+            ```python
+            # initialize the sourcer with `0:` index desktop screen and probe it
+            sourcer = Sourcer("0:", source_demuxer="avfoundation", verbose=True).probe_stream()
+            ```
+
+        !!! fail "If these steps doesn't work for you then reach us out on [Gitter ➶][gitter] Community channel"
+
+    ```python
+    # initialize the sourcer with "0:" source and probe it
+    sourcer = Sourcer("0:", source_demuxer="avfoundation", verbose=True).probe_stream()
+    ```
+
+
+- [x] **Virtual Sources:** Valid filtergraph to use as input with [`lavfi`](http://underpop.online.fr/f/ffmpeg/help/lavfi.htm.gz) _(**Libavfilter** input virtual device)_ source that reads data from the open output pads of a libavfilter filtergraph. For example, for generating and probing [Mandelbrot](https://en.wikipedia.org/wiki/Mandelbrot_set) graph of `1280x720` frame size and `30` framerate using `lavfi` input virtual device, we can do as follows in Sourcer API: 
+
+    ```python
+    # initialize the sourcer with "mandelbrot" source of
+    # `1280x720` frame size and `30` framerate and probe it
+    sourcer = Sourcer(
+        "mandelbrot=size=1280x720:rate=30",
+        source_demuxer="lavfi",
+        frame_format="bgr24",
+    ).probe_stream()
+    ```
+
+    
 
 
 &nbsp;
 
 
+## **`source_demuxer`** 
+
+This parameter specifies the demuxer(`-f`) for the input source _(such as `dshow`, `v4l2`, `gdigrab` etc.)_ to support Live Feed Devices, as well as `lavfi` _(Libavfilter input virtual device)_ that reads data from the open output pads of a libavfilter filtergraph. 
+
+!!! warning "Any invalid or unsupported value to `source_demuxer` parameter value will raise `Assertion` error!"
+
+!!! tip "Use `#!sh ffmpeg -demuxers` terminal command to lists all FFmpeg supported demuxers."
+
+**Data-Type:** String
+
+**Default Value:** Its default value is `None`.
+
+**Usage:**
+
+```python
+# initialize the sourcer with `dshow` demuxer and probe it
+sourcer = Sourcer("foo.mp4", source_demuxer="dshow").probe_stream()
+```
+
+
+&nbsp; 
+
 ## **`custom_ffmpeg`**
 
-This parameter assigns the custom _path/directory_ where the custom/downloaded FFmpeg executables are located.
+This parameter can be used to manually assigns the system _file-path/directory_ where the custom or downloaded FFmpeg executable is located.
 
-!!! info "Behavior on Windows"
+??? info "Behavior on Windows :fontawesome-brands-windows:"
     
-    If a custom FFmpeg executable's path | directory is not provided through `custom_ffmpeg` parameter on Windows machine, then Sourcer API will ==automatically attempt to download and extract suitable Static FFmpeg binaries at suitable location on your windows machine==. More information can be found [here ➶](../ffmpeg_install/#a-auto-installation).
+    If custom FFmpeg executable binary _file-path/directory_ is not assigned through `custom_ffmpeg` parameter on Windows machine, then Sourcer API will ==automatically attempt to download and extract suitable Static FFmpeg binaries at suitable location on your windows machine==. More information can be found [here ➶](../ffmpeg_install/#a-auto-installation).
+
+    ??? question "How to change FFmpeg Static Binaries download directory?"
+
+        You can use [`-ffmpeg_download_path`](#exclusive-parameters) exclusive parameter in Sourcer API to set the custom directory for downloading FFmpeg Static Binaries during the [Auto-Installation](../../../installation/ffmpeg_install/#a-auto-installation) step on Windows Machines. If this parameter is not altered, then these binaries will auto-save to the default temporary directory (for e.g. `C:/User/temp`) on your windows machine. It can be used as follows in Sourcer API:
+
+        ```python
+        # # define suitable parameter to download at "C:/User/foo/foo1"
+        sourcer_params = {"-ffmpeg_download_path": "C:/User/foo/foo1"}
+
+        # initialize the sourcer
+        Sourcer("foo.mp4", verbose=True, **sourcer_params).probe_stream()
+        ```
+
+!!! warning "If binaries were not found at the manually specified path, DeFFcode APIs will throw **RuntimeError**!"
 
 **Data-Type:** String
 
@@ -120,7 +367,7 @@ This parameter assigns the custom _path/directory_ where the custom/downloaded F
 
 ```python
 # If ffmpeg executables are located at "/foo/foo1/ffmpeg"
-Sourcer("foo.mp4", custom_ffmpeg="/foo/foo1/ffmpeg").formulate()
+Sourcer("foo.mp4", custom_ffmpeg="/foo/foo1/ffmpeg").probe_stream()
 ```
 
 &nbsp;
@@ -137,7 +384,7 @@ This parameter enables verbose _(if `True`)_, essential for debugging.
 **Usage:**
 
 ```python
-Sourcer("foo.mp4", verbose=True).formulate()
+Sourcer("foo.mp4", verbose=True).probe_stream()
 ```
 
 &nbsp; 
@@ -145,19 +392,61 @@ Sourcer("foo.mp4", verbose=True).formulate()
 
 ## **`sourcer_params`**
 
-This parameter accepts few [Exclusive Parameters](#exclusive-parameters) formatted as as its attributes:
-
-!!! danger "Kindly read docs carefully before passing any additional values to `sourcer_params` parameter. Wrong invalid values may result in undesired errors or no output at all."
-
+This dictionary parameter accepts all [Exclusive Parameters](#exclusive-parameters) formatted as its attributes:
 
 **Data-Type:** Dictionary
 
 **Default Value:** Its default value is `{}`.
 
-
 ### Exclusive Parameters
 
-Sourcer API supports only few Exclusive Parameters to flexibly alter its internal properties. These parameters are discussed below:
+> In addition to FFmpeg parameters, Sourcer API also supports few Exclusive Parameters, to allow users to flexibly change its probing properties, and handle some special FFmpeg parameters.
+
+These parameters are discussed below:
+
+
+* **`-vcodec`** _(str)_ : This attribute works similar to `-vcodec` FFmpeg parameter for specifying supported decoders that are compiled with FFmpeg in use. If not specified, it's value is derived from source video metadata. Its usage is as follows: 
+
+    !!! tip "Use `#!sh ffmpeg -decoders` terminal command to lists all FFmpeg supported decoders."
+
+    !!! info "To remove `-vcodec` forcefully from FFmpeg Pipeline, assign its value Nonetype as `#!py3 {"-vcodec":None}` in sourcer_params"
+
+    ```python
+    # define suitable parameter
+    sourcer_params = {"-vcodec": "h264"} # set decoder to `h264`
+    ```
+
+&ensp;
+
+
+* **`-framerate`** _(float/int)_ : This attribute works similar to `-framerate` FFmpeg parameter for generating video-frames at specified framerate. If not specified, it calculated from source video metadata. Its usage is as follows: 
+
+    ```python
+    # define suitable parameter
+    sourcer_params = {"-framerate": 60.0} # set input video source framerate to 60fps
+    ```
+
+&ensp;
+
+* **`-custom_resolution`** _(tuple/list)_ : This attribute sets the custom resolution/size/dimensions of the output frames. Its value can either be a **tuple** => `(width,height)` or a **list** => `[width, height]`. If not specified, it calculated from source video metadata. Its usage is as follows: 
+    
+    ```python
+    # define suitable parameter
+    sourcer_params = {"-output_dimensions": (1280,720)} # to produce a 1280x720 resolution/scale output video
+    ```
+
+&ensp;
+
+* **`-ffprefixes`** _(list)_: This attribute sets the special FFmpeg parameters that generally occurs at the very beginning _(such as `-re`)_ before input (`-i`) source. The FFmpeg parameters defined with this attribute can repeated more than once and maintains its original order in the FFmpeg command. Its value can be of datatype **`list`** only and its usage is as follows: 
+
+    !!! tip "Turn on [`verbose`](#verbose) parameter _(`verbose = True`)_ to see the FFmpeg command that is being executed in Sourcer's pipeline. This helps you debug/address any issues and make adjustments accordingly."
+        
+    ```python
+    # define suitable parameter
+    sourcer_params = {"-ffprefixes": ['-re']} # executes as `ffmpeg -re <rest of command>`
+    ```
+
+&ensp;
 
 * **`-ffmpeg_download_path`** _(string)_: sets the custom directory for downloading FFmpeg Static Binaries in Compression Mode, during the [Auto-Installation](../ffmpeg_install/#a-auto-installation) on Windows Machines Only. If this parameter is not altered, then these binaries will auto-save to the default temporary directory (for e.g. `C:/User/temp`) on your windows machine. It can be used as follows: 
 
@@ -165,8 +454,16 @@ Sourcer API supports only few Exclusive Parameters to flexibly alter its interna
     sourcer_params = {"-ffmpeg_download_path": "C:/User/foo/foo1"} # will be saved to "C:/User/foo/foo1"
     ```
 
+&ensp;
+
 * **`-force_validate_source`** _(bool)_: forcefully passes validation test for given `source` which is required for some special cases with unusual input. It can be used as follows: 
 
     ```python
     sourcer_params = {"-force_validate_source": True} # will pass validation test forcefully
     ```
+&ensp;
+
+<!--
+External URLs
+-->
+[gitter]: https://gitter.im/deffcode-python/community
\ No newline at end of file
diff --git a/docs/reference/utils.md b/docs/reference/utils.md
index cd56ba8..25d4670 100644
--- a/docs/reference/utils.md
+++ b/docs/reference/utils.md
@@ -18,6 +18,13 @@ limitations under the License.
 ===============================================
 -->
 
+!!! abstract "Following are the helper methods required by the DeFFcode APIs."
+
+!!! example "For usage examples, kindly refer our **[Basic Recipes :cake:](../../recipes/basic)** and **[Advanced Recipes :croissant:](../../recipes/advanced)**"
+
+&nbsp;
+
+
 ::: deffcode.utils.logger_handler
 
 &nbsp;
diff --git a/mkdocs.yml b/mkdocs.yml
index fec9e4e..105dc7c 100644
--- a/mkdocs.yml
+++ b/mkdocs.yml
@@ -36,6 +36,7 @@ theme:
   language: en
   features:
     - navigation.tracking
+    - navigation.tabs
     - navigation.indexes
     - navigation.top
     - search.suggest
@@ -46,26 +47,29 @@ theme:
     # Light mode
     - media: "(prefers-color-scheme: light)"
       scheme: default
-      primary: green
-      accent: dark green
+      primary: light green
+      accent: green
       toggle:
-        icon: material/home-lightning-bolt-outline
+        icon: fontawesome/regular/lightbulb
         name: Switch to dark mode
     # Dark mode
     - media: "(prefers-color-scheme: dark)"
       scheme: slate
-      primary: teal
-      accent: light green
+      primary: amber
+      accent: lime
       toggle:
-        icon: material/home-lightning-bolt
+        icon: fontawesome/solid/lightbulb
         name: Switch to light mode
   font: # font
-    text: Quicksand
-    code: Fira Code
+    text: Heebo
+    code: JetBrains Mono
   icon: # icon
     logo: logo
   logo: assets/images/android-chrome-192x192.png
   favicon: assets/images/favicon-32x32.png
+  # 404 page
+  static_templates:
+    - 404.html
 
 # Plugins
 plugins:
@@ -74,11 +78,9 @@ plugins:
   - minify:
       minify_html: true
   - mkdocstrings:
-      custom_templates: ""
-      default_handler: python
       handlers:
         python:
-          rendering:
+          options:
             show_root_heading: false
             show_root_toc_entry: false
             show_source: true
@@ -155,13 +157,37 @@ markdown_extensions:
 
 # Page tree
 nav:
-  - Getting Started: 
-    - Introduction: index.md
+  - Home: 
+    - Introduction: 
+      - Introduction: index.md
     - Installation Notes: 
-      - Introduction: installation/index.md
+      - Overview: installation/index.md
       - FFmpeg Installation: installation/ffmpeg_install.md
-    - Basic Recipies: examples/basic.md
-  - Advanced Recipies: examples/advanced.md
+    - Contribution Guidelines:
+      - Overview: contribution/index.md
+      - Issue Guidelines: contribution/issue.md
+      - Pull Request(PR) Guidelines: contribution/PR.md 
+    - Changelog: changelog.md
+    - License: license.md
+  - Recipies:
+    - Basic Recipes: 
+      - Overview: recipes/basic/index.md
+      - Decoding Video Files: recipes/basic/decode-video-files.md
+      - Decoding Live Feed Devices: recipes/basic/decode-live-feed-devices.md
+      - Decoding Network Streams: recipes/basic/decode-network-streams.md
+      - Decoding Image sequences: recipes/basic/decode-image-sequences.md
+      - Transcoding Live frames: recipes/basic/transcode-live-frames.md 
+      - Transcoding Live Simple Filtergraphs: recipes/basic/transcode-live-frames-simplegraphs.md
+      - Saving Key-frames as Image: recipes/basic/save-keyframe-image.md
+      - Extracting video metadata: recipes/basic/extract-video-metadata.md
+    - Advanced Recipies: 
+      - Overview: recipes/advanced/index.md
+      - Decoding Live Virtual Sources: recipes/advanced/decode-live-virtual-sources.md
+      - Hardware-Accelerated Video Decoding: recipes/advanced/decode-hw-acceleration.md
+      - Transcoding Live Complex Filtergraphs: recipes/advanced/transcode-live-frames-complexgraphs.md
+      - Transcoding Video Art with Filtergraphs: recipes/advanced/transcode-art-filtergraphs.md
+      - Hardware-Accelerated Video Transcoding: recipes/advanced/transcode-hw-acceleration.md 
+      - Updating Video Metadata: recipes/advanced/update-metadata.md 
   - API References:
     - deffcode.FFdecoder: 
       - API: reference/ffdecoder/index.md
@@ -171,15 +197,8 @@ nav:
       - API Parameters: reference/sourcer/params.md
     - deffcode.ffhelper: reference/ffhelper.md
     - deffcode.utils: reference/utils.md
-  - Help:
-    - Help Section: 
-      - Helping Us: help/index.md
-      - Getting Help: help/get_help.md 
-    - Contribution:
-      - Overview: contribution/index.md
-      - Issue Guidelines: contribution/issue.md
-      - Pull Request(PR) Guidelines: contribution/PR.md
-  - Extras:
-    - Changelog: changelog.md
-    - License: license.md
+  - Help Section:
+    - Help Us: help.md
+    - Get Help: help/get_help.md
+    
 
diff --git a/setup.py b/setup.py
index 13ca9bd..07fb6e6 100644
--- a/setup.py
+++ b/setup.py
@@ -33,6 +33,9 @@
     long_description = long_description.replace(
         "(#", "(https://github.com/abhiTronix/deffcode#"
     )
+    long_description = long_description.replace(
+        "docs/overrides/", "(https://abhitronix.github.io/deffcode/latest/"
+    )
     # patch for unicodes
     long_description = long_description.replace("➶", ">>")
     long_description = long_description.replace("©", "(c)")
@@ -41,7 +44,7 @@
     name="deffcode",
     packages=["deffcode"],
     version=pkg_version["__version__"],
-    description="High-performance Real-time FFmpeg based Video-Decoder in python.",
+    description="A Cross-platform High-performance & Flexible Video Frames Decoder in python.",
     license="Apache License 2.0",
     author="Abhishek Thakur",
     install_requires=[
@@ -58,6 +61,9 @@
     keywords=[
         "FFmpeg",
         "Decoder",
+        "Realtime",
+        "Framework",
+        "Cross-platform"
         "Video Processing",
         "Computer Vision",
         "Video Decoding",


Test patch:
diff --git a/docs/overrides/assets/gifs/testsrc.gif b/docs/overrides/assets/gifs/testsrc.gif
new file mode 100644
index 0000000..a8faf20
Binary files /dev/null and b/docs/overrides/assets/gifs/testsrc.gif differ
diff --git a/tests/test_ffdecoder.py b/tests/test_ffdecoder.py
index 9ca19eb..d1b6ed3 100644
--- a/tests/test_ffdecoder.py
+++ b/tests/test_ffdecoder.py
@@ -116,7 +116,7 @@ def test_source_playback(source, custom_ffmpeg, output):
 
 
 @pytest.mark.parametrize(
-    "pixfmts", ["bgr24", "gray", "rgba", "invalid", "yuvj422p", "yuv444p", "bgr48be"]
+    "pixfmts", ["bgr24", "gray", "rgba", "invalid", "invalid2", "yuv444p", "bgr48be"]
 )
 def test_frame_format(pixfmts):
     """
@@ -126,15 +126,26 @@ def test_frame_format(pixfmts):
     frame_num = 0
     source = return_testvideo_path(fmt="vo")
     actual_frame_num, actual_frame_shape = actual_frame_count_n_frame_size(source)
-    extraparams = {"-pix_fmt": "bgr24"}
+    ffparams = {"-pix_fmt": "bgr24"}
     try:
         # formulate the decoder with suitable source(for e.g. foo.mp4)
-        decoder = FFdecoder(
-            source,
-            frame_format=pixfmts,
-            custom_ffmpeg=return_static_ffmpeg(),
-            **extraparams,
-        ).formulate()
+        if pixfmts != "invalid2":
+            decoder = FFdecoder(
+                source,
+                frame_format=pixfmts,
+                custom_ffmpeg=return_static_ffmpeg(),
+                **ffparams,
+            ).formulate()
+        else:
+            decoder = FFdecoder(
+                source,
+                custom_ffmpeg=return_static_ffmpeg(),
+                **ffparams,
+            )
+            # assign manually pix-format via `metadata` property object {special case}
+            decoder.metadata = dict(output_frames_pixfmt="yuvj422p")
+            # formulate decoder
+            decoder.formulate()
 
         # grab RGB24(default) 3D frames from decoder
         for frame in decoder.generateFrame():
@@ -150,20 +161,53 @@ def test_frame_format(pixfmts):
 
 
 @pytest.mark.parametrize(
-    "custom_params", [{"source_has_video": "Custom_Value"}, ["invalid"], {"foo": 1234}]
+    "custom_params, checks",
+    [
+        (
+            {
+                "source": "Custom_Value",  # source cannot be altered
+                "mytuple": (  # Python's `json` module converts Python tuples to JSON lists
+                    1,
+                    "John",
+                    ("inner_tuple"),
+                ),
+                "output_frames_pixfmt": 1234, # invalid pixformat
+                "source_video_resolution": [640], # invalid resolution
+            },
+            False,
+        ),
+        (
+            {"output_frames_pixfmt": "invalid"},
+            False,
+        ),
+        (["invalid"], False),
+        (
+            dict(
+                mystring="abcd",  # string data
+                myint=1234,  # integers data
+                mylist=[1, "Rohan", ["inner_list"]],  # list data
+                mydict={"anotherstring": "hello"},  # dictionary data
+                myjson=json.loads(
+                    '{"name": "John", "age": 30, "city": "New York"}'
+                ),  # json data
+                source_video_resolution=[640, 480],
+            ),
+            True,
+        ),
+    ],
 )
-def test_metadata(custom_params):
+def test_metadata(custom_params, checks):
     """
     Testing `metadata` print and updation
     """
     decoder = None
     source = return_testvideo_path(fmt="vo")
     try:
+        # custom vars
+        ffparams = {"-framerate": None} if not checks else {}
         # formulate the decoder with suitable source(for e.g. foo.mp4)
         decoder = FFdecoder(
-            source,
-            custom_ffmpeg=return_static_ffmpeg(),
-            verbose=True,
+            source, custom_ffmpeg=return_static_ffmpeg(), verbose=True, **ffparams
         ).formulate()
         # re-test
         decoder.formulate()
@@ -177,11 +221,13 @@ def test_metadata(custom_params):
         # print metadata as `json.dump`
         logger.debug(decoder.metadata)
 
-        assert all(
-            json.loads(decoder.metadata)[x] == custom_params[x] for x in custom_params
-        ), "Test failed"
+        if checks:
+            assert all(
+                json.loads(decoder.metadata)[x] == custom_params[x]
+                for x in custom_params
+            ), "Test failed"
     except Exception as e:
-        if custom_params == ["invalid"]:
+        if not checks:
             pytest.xfail(str(e))
         else:
             pytest.fail(str(e))
@@ -191,13 +237,33 @@ def test_metadata(custom_params):
 
 
 @pytest.mark.parametrize(
-    "extraparams, pixfmts",
+    "ffparams, pixfmts",
     [
-        ({"-ss": "00:00:01.45", "-frames:v": 1}, "rgba"),
-        ({"-ss": "00:02.45", "-vframes": 1}, "gray"),
+        (
+            {
+                "-ss": "00:00:01.45",
+                "-frames:v": 1,
+                "-custom_resolution": [640, 480],
+                "-passthrough_audio": "invalid",  # just for test
+                "-vcodec": "unknown",
+            },
+            "rgba",
+        ),
+        (
+            {
+                "-ss": "00:02.45",
+                "-vframes": 1,
+                "-custom_resolution": "invalid",
+                "-ffprefixes": "invalid",
+                "-clones": "invalid",
+                "-framerate": "invalid",
+                "-vcodec": None,
+            },
+            "gray",
+        ),
     ],
 )
-def test_seek_n_save(extraparams, pixfmts):
+def test_seek_n_save(ffparams, pixfmts):
     """
     Testing `frame_format` with different colorspaces.
     """
@@ -210,7 +276,7 @@ def test_seek_n_save(extraparams, pixfmts):
             frame_format=pixfmts,
             custom_ffmpeg=return_static_ffmpeg(),
             verbose=True,
-            **extraparams,
+            **ffparams,
         ).formulate()
 
         # grab the RGB24(default) frame from the decoder
@@ -273,8 +339,8 @@ def test_seek_n_save(extraparams, pixfmts):
 ]
 
 
-@pytest.mark.parametrize("source, extraparams, result", test_data_class)
-def test_FFdecoder_params(source, extraparams, result):
+@pytest.mark.parametrize("source, ffparams, result", test_data_class)
+def test_FFdecoder_params(source, ffparams, result):
     """
     Testing FFdecoder API with different parameters and save output
     """
@@ -283,7 +349,7 @@ def test_FFdecoder_params(source, extraparams, result):
     f_name = os.path.join(*[tempfile.gettempdir(), "temp_write", "output_foo.avi"])
     try:
         # initialize and formulate the decode with suitable source
-        decoder = FFdecoder(source, frame_format="bgr24", **extraparams).formulate()
+        decoder = FFdecoder(source, frame_format="bgr24", **ffparams).formulate()
 
         # retrieve JSON Metadata and convert it to dict
         metadata_dict = json.loads(decoder.metadata)
diff --git a/tests/test_sourcer.py b/tests/test_sourcer.py
index f87ed1a..b1b7a5b 100644
--- a/tests/test_sourcer.py
+++ b/tests/test_sourcer.py
@@ -38,33 +38,46 @@
 
 
 @pytest.mark.parametrize(
-    "source, sourcer_params",
+    "source, sourcer_params, custom_ffmpeg",
     [
-        (return_testvideo_path(), {}),
+        (
+            return_generated_frames_path(return_static_ffmpeg()),
+            {"-ffprefixes": "invalid"},  # invalid ffprefixes
+            return_static_ffmpeg(),
+        ),
         (
             "rtmp://live.twitch.tv/",
-            {"-ffmpeg_download_path": ["invalid"]},
+            {"-ffmpeg_download_path": ["invalid"]},  # invalid FFmpeg download path
+            return_static_ffmpeg(),
         ),
-        ("unknown://invalid.com/", {}),
-        ("unknown://invalid.com/", {"-force_validate_source": True}),
-        (return_testvideo_path(fmt="ao"), {"-force_validate_source": ["invalid"]}),
         (
-            return_generated_frames_path(return_static_ffmpeg()),
-            {"-force_validate_source": "invalid"},
+            "unknown://invalid.com/",  # invalid source-1
+            {"-force_validate_source": True},  # force_validate_source
+            return_static_ffmpeg(),
+        ),
+        (
+            return_testvideo_path(fmt="ao"),
+            {"-force_validate_source": ["invalid"]},  # invalid force_validate_source
+            return_static_ffmpeg(),
+        ),
+        (
+            return_testvideo_path(),
+            {},
+            "invalid_ffmpeg",  # invalid FFmpeg
         ),
     ],
 )
-def test_source(source, sourcer_params):
+def test_source(source, sourcer_params, custom_ffmpeg):
     """
     Paths Source - Test various source paths/urls supported by Sourcer.
     """
     try:
         sourcer = Sourcer(
-            source, custom_ffmpeg=return_static_ffmpeg(), verbose=True, **sourcer_params
+            source, custom_ffmpeg=custom_ffmpeg, verbose=True, **sourcer_params
         ).probe_stream()
         logger.debug("Found Metadata: `{}`".format(sourcer.retrieve_metadata()))
     except Exception as e:
-        if isinstance(e, (ValueError, IOError)):
+        if isinstance(e, ValueError) or custom_ffmpeg == "invalid_ffmpeg":
             pytest.xfail("Test Passed!")
         else:
             pytest.fail(str(e))
@@ -74,6 +87,7 @@ def test_source(source, sourcer_params):
     "source, default_stream_indexes, params",
     [
         (return_testvideo_path(), [0, 0], ["source_has_video", "source_has_audio"]),
+        ("mandelbrot=size=1280x720:rate=30", [0, 0], ["source_has_video"]),
         (return_testvideo_path(fmt="ao"), [3, 2], ["source_has_audio"]),
         (
             "http://devimages.apple.com/iphone/samples/bipbop/bipbopall.m3u8",
@@ -113,7 +127,7 @@ def test_probe_stream_n_retrieve_metadata(source, default_stream_indexes, params
                 >= actual_frame_count_n_frame_size(source)[0]
             ), "Test Failed for frames count!"
     except Exception as e:
-        if isinstance(e, (ValueError, IOError)) or (
+        if isinstance(e, (ValueError, ValueError)) or (
             source in ["invalid", "unknown://invalid.com/"]
             and isinstance(e, AssertionError)
         ):