# MJPEG video decode and encode in CPU and GPU

Source: [https://docs.qualcomm.com/doc/80-70015-50/topic/mjpeg-video-decode-and-encode-in-cpu-and-gpu.html](https://docs.qualcomm.com/doc/80-70015-50/topic/mjpeg-video-decode-and-encode-in-cpu-and-gpu.html)

## camerasrc → jpegenc → file

    gst-launch-1.0 -e --gst-debug=2 qtiqmmfsrc name=camsrc ! video/x-raw,format=NV12,width=1920,height=1080,framerate=120/1 ! jpegenc ! avimux ! filesink location=/opt/mjpeg.aviCopy to clipboard

    gst-launch-1.0 -e --gst-debug=fpsdisplaysink:6 qtiqmmfsrc name=camsrc ! video/x-raw,format=NV12,width=1920,height=1080,framerate=30/1 ! jpegenc ! avimux ! queue ! fpsdisplaysink name=disp1 fps-update-interval=1000 signal-fps-measurements=true text-overlay=false video-sink="filesink location=/opt/mjpeg1080p30.avi"Copy to clipboard

## AVI file → jpegdec → Waylandsink

    gst-launch-1.0 -v filesrc location=/opt/mjpeg.avi ! avidemux !  queue ! jpegdec ! waylandsinkCopy to clipboard

## YUV file 1920x1080@30 → 16 x jpegenc → AVI file

    gst-launch-1.0 -e filesrc location=/opt/1920_1080.yuv ! videoparse width=1920 height=1080 format=nv12 framerate=2/1 ! jpegenc ! avimux ! filesink location=/opt/mjpeg1.avi &
    gst-launch-1.0 -e filesrc location=/opt/1920_1080.yuv ! videoparse width=1920 height=1080 format=nv12 framerate=2/1 ! jpegenc ! avimux ! filesink location=/opt/mjpeg2.avi &
    gst-launch-1.0 -e filesrc location=/opt/1920_1080.yuv ! videoparse width=1920 height=1080 format=nv12 framerate=2/1 ! jpegenc ! avimux ! filesink location=/opt/mjpeg3.avi &
    gst-launch-1.0 -e filesrc location=/opt/1920_1080.yuv ! videoparse width=1920 height=1080 format=nv12 framerate=2/1 ! jpegenc ! avimux ! filesink location=/opt/mjpeg4.avi &
    gst-launch-1.0 -e filesrc location=/opt/1920_1080.yuv ! videoparse width=1920 height=1080 format=nv12 framerate=2/1 ! jpegenc ! avimux ! filesink location=/opt/mjpeg5.avi &
    gst-launch-1.0 -e filesrc location=/opt/1920_1080.yuv ! videoparse width=1920 height=1080 format=nv12 framerate=2/1 ! jpegenc ! avimux ! filesink location=/opt/mjpeg6.avi &
    gst-launch-1.0 -e filesrc location=/opt/1920_1080.yuv ! videoparse width=1920 height=1080 format=nv12 framerate=2/1 ! jpegenc ! avimux ! filesink location=/opt/mjpeg7.avi &
    gst-launch-1.0 -e filesrc location=/opt/1920_1080.yuv ! videoparse width=1920 height=1080 format=nv12 framerate=2/1 ! jpegenc ! avimux ! filesink location=/opt/mjpeg8.avi &
    gst-launch-1.0 -e filesrc location=/opt/1920_1080.yuv ! videoparse width=1920 height=1080 format=nv12 framerate=2/1 ! jpegenc ! avimux ! filesink location=/opt/mjpeg9.avi &
    gst-launch-1.0 -e filesrc location=/opt/1920_1080.yuv ! videoparse width=1920 height=1080 format=nv12 framerate=2/1 ! jpegenc ! avimux ! filesink location=/opt/mjpeg10.avi &
    gst-launch-1.0 -e filesrc location=/opt/1920_1080.yuv ! videoparse width=1920 height=1080 format=nv12 framerate=2/1 ! jpegenc ! avimux ! filesink location=/opt/mjpeg11.avi &
    gst-launch-1.0 -e filesrc location=/opt/1920_1080.yuv ! videoparse width=1920 height=1080 format=nv12 framerate=2/1 ! jpegenc ! avimux ! filesink location=/opt/mjpeg12.avi &
    gst-launch-1.0 -e filesrc location=/opt/1920_1080.yuv ! videoparse width=1920 height=1080 format=nv12 framerate=2/1 ! jpegenc ! avimux ! filesink location=/opt/mjpeg13.avi &
    gst-launch-1.0 -e filesrc location=/opt/1920_1080.yuv ! videoparse width=1920 height=1080 format=nv12 framerate=2/1 ! jpegenc ! avimux ! filesink location=/opt/mjpeg14.avi &
    gst-launch-1.0 -e filesrc location=/opt/1920_1080.yuv ! videoparse width=1920 height=1080 format=nv12 framerate=2/1 ! jpegenc ! avimux ! filesink location=/opt/mjpeg15.avi &
    gst-launch-1.0 -e filesrc location=/opt/1920_1080.yuv ! videoparse width=1920 height=1080 format=nv12 framerate=2/1 ! jpegenc ! avimux ! filesink location=/opt/mjpeg16.aviCopy to clipboard

## YUV file 1920x1080@30 → 12 x jpegenc → AVI file and 1920x1080@30 AVI → 12 x
                jpegdec &gt; JPEG

    gst-launch-1.0 -v filesrc location=/opt/mjpeg.avi ! avidemux !  queue ! jpegdec ! multifilesink location=/opt/mjpeg1_%d.jpeg max-files=1 &
    gst-launch-1.0 -v filesrc location=/opt/mjpeg.avi ! avidemux !  queue ! jpegdec ! multifilesink location=/opt/mjpeg2_%d.jpeg max-files=1 &
    gst-launch-1.0 -v filesrc location=/opt/mjpeg.avi ! avidemux !  queue ! jpegdec ! multifilesink location=/opt/mjpeg3_%d.jpeg max-files=1 &
    gst-launch-1.0 -v filesrc location=/opt/mjpeg.avi ! avidemux !  queue ! jpegdec ! multifilesink location=/opt/mjpeg4_%d.jpeg max-files=1 &
    gst-launch-1.0 -v filesrc location=/opt/mjpeg.avi ! avidemux !  queue ! jpegdec ! multifilesink location=/opt/mjpeg5_%d.jpeg max-files=1 &
    gst-launch-1.0 -v filesrc location=/opt/mjpeg.avi ! avidemux !  queue ! jpegdec ! multifilesink location=/opt/mjpeg6_%d.jpeg max-files=1 &
    gst-launch-1.0 -v filesrc location=/opt/mjpeg.avi ! avidemux !  queue ! jpegdec ! multifilesink location=/opt/mjpeg7_%d.jpeg max-files=1 &
    gst-launch-1.0 -v filesrc location=/opt/mjpeg.avi ! avidemux !  queue ! jpegdec ! multifilesink location=/opt/mjpeg8_%d.jpeg max-files=1 &
    gst-launch-1.0 -v filesrc location=/opt/mjpeg.avi ! avidemux !  queue ! jpegdec ! multifilesink location=/opt/mjpeg9_%d.jpeg max-files=1 &
    gst-launch-1.0 -v filesrc location=/opt/mjpeg.avi ! avidemux !  queue ! jpegdec ! multifilesink location=/opt/mjpeg10_%d.jpeg max-files=1 &
    gst-launch-1.0 -v filesrc location=/opt/mjpeg.avi ! avidemux !  queue ! jpegdec ! multifilesink location=/opt/mjpeg11_%d.jpeg max-files=1 &
    gst-launch-1.0 -v filesrc location=/opt/mjpeg.avi ! avidemux !  queue ! jpegdec ! multifilesink location=/opt/mjpeg12_%d.jpeg max-files=1 &
    gst-launch-1.0 -e filesrc location=/opt/1920_1080.yuv ! videoparse width=1920 height=1080 format=nv12 framerate=2/1 ! jpegenc ! avimux ! filesink location=/opt/mjpeg1.avi &
    gst-launch-1.0 -e filesrc location=/opt/1920_1080.yuv ! videoparse width=1920 height=1080 format=nv12 framerate=2/1 ! jpegenc ! avimux ! filesink location=/opt/mjpeg2.avi &
    gst-launch-1.0 -e filesrc location=/opt/1920_1080.yuv ! videoparse width=1920 height=1080 format=nv12 framerate=2/1 ! jpegenc ! avimux ! filesink location=/opt/mjpeg3.avi &
    gst-launch-1.0 -e filesrc location=/opt/1920_1080.yuv ! videoparse width=1920 height=1080 format=nv12 framerate=2/1 ! jpegenc ! avimux ! filesink location=/opt/mjpeg4.avi &
    gst-launch-1.0 -e filesrc location=/opt/1920_1080.yuv ! videoparse width=1920 height=1080 format=nv12 framerate=2/1 ! jpegenc ! avimux ! filesink location=/opt/mjpeg5.avi &
    gst-launch-1.0 -e filesrc location=/opt/1920_1080.yuv ! videoparse width=1920 height=1080 format=nv12 framerate=2/1 ! jpegenc ! avimux ! filesink location=/opt/mjpeg6.avi &
    gst-launch-1.0 -e filesrc location=/opt/1920_1080.yuv ! videoparse width=1920 height=1080 format=nv12 framerate=2/1 ! jpegenc ! avimux ! filesink location=/opt/mjpeg7.avi &
    gst-launch-1.0 -e filesrc location=/opt/1920_1080.yuv ! videoparse width=1920 height=1080 format=nv12 framerate=2/1 ! jpegenc ! avimux ! filesink location=/opt/mjpeg8.avi &
    gst-launch-1.0 -e filesrc location=/opt/1920_1080.yuv ! videoparse width=1920 height=1080 format=nv12 framerate=2/1 ! jpegenc ! avimux ! filesink location=/opt/mjpeg9.avi &
    gst-launch-1.0 -e filesrc location=/opt/1920_1080.yuv ! videoparse width=1920 height=1080 format=nv12 framerate=2/1 ! jpegenc ! avimux ! filesink location=/opt/mjpeg10.avi &
    gst-launch-1.0 -e filesrc location=/opt/1920_1080.yuv ! videoparse width=1920 height=1080 format=nv12 framerate=2/1 ! jpegenc ! avimux ! filesink location=/opt/mjpeg11.avi &
    gst-launch-1.0 -e filesrc location=/opt/1920_1080.yuv ! videoparse width=1920 height=1080 format=nv12 framerate=2/1 ! jpegenc ! avimux ! filesink location=/opt/mjpeg12.aviCopy to clipboard

## camerasrc 1920x1080@30 → 8x jpegenc → file

    gst-launch-1.0 -e --gst-debug=2 qtiqmmfsrc name=camsrc ! video/x-raw,format=NV12,width=1920,height=1080,framerate=30/1 ! tee name=t1 ! queue ! jpegenc ! avimux ! filesink location=/opt/mjpeg1.avi \
    t1. ! queue ! jpegenc ! avimux ! filesink location=/opt/mjpeg2.avi \
    t1. ! queue ! jpegenc ! avimux ! filesink location=/opt/mjpeg3.avi \
    t1. ! queue ! jpegenc ! avimux ! filesink location=/opt/mjpeg4.avi \
    t1. ! queue ! jpegenc ! avimux ! filesink location=/opt/mjpeg5.avi \
    t1. ! queue ! jpegenc ! avimux ! filesink location=/opt/mjpeg6.avi \
    t1. ! queue ! jpegenc ! avimux ! filesink location=/opt/mjpeg7.avi \
    t1. ! queue ! jpegenc ! avimux ! filesink location=/opt/mjpeg8.aviCopy to clipboard

## camerasrc 1920x1080@30 → 4x jpegenc → file and 1920x1080@30 AVI file → 4xjpegdec
                → JPEG

    gst-launch-1.0 -e -v filesrc location=/opt/mjpeg.avi ! avidemux ! tee name=t2 ! queue ! jpegdec ! multifilesink location=/opt/mjpeg1_%d.jpeg max-files=1 \
    t2. !  queue ! jpegdec ! multifilesink location=/opt/mjpeg2_%d.jpeg max-files=1 \
    t2. !  queue ! jpegdec ! multifilesink location=/opt/mjpeg3_%d.jpeg max-files=1 \
    t2. !  queue ! jpegdec ! multifilesink location=/opt/mjpeg4_%d.jpeg max-files=1 \
    qtiqmmfsrc name=camsrc ! video/x-raw,format=NV12,width=1920,height=1080,framerate=30/1 ! tee name=t1 ! queue ! jpegenc ! avimux ! filesink location=/opt/mjpeg1.avi \
    t1. ! queue ! jpegenc ! avimux ! filesink location=/opt/mjpeg2.avi \
    t1. ! queue ! jpegenc ! avimux ! filesink location=/opt/mjpeg3.avi \
    t1. ! queue ! jpegenc ! avimux ! filesink location=/opt/mjpeg4.aviCopy to clipboard

## camerasrc 1920x1080@60 → 2x jpegenc → file and 1920x1080@60 AVI file → 2xjpegdec
                → JPEG

    gst-launch-1.0 -e -v filesrc location=/opt/mjpeg.avi ! avidemux ! tee name=t2 ! queue ! jpegdec ! multifilesink location=/opt/mjpeg1_%d.jpeg max-files=1 \
    t2. !  queue ! jpegdec ! multifilesink location=/opt/mjpeg2_%d.jpeg max-files=1 \
    qtiqmmfsrc name=camsrc ! video/x-raw,format=NV12,width=1920,height=1080,framerate=60/1 ! tee name=t1 ! queue ! jpegenc ! avimux ! filesink location=/opt/mjpeg1.avi \
    t1. ! queue ! jpegenc ! avimux ! filesink location=/opt/mjpeg2.aviCopy to clipboard

## camerasrc 1920x1080@60 → 4x jpegenc → file

    gst-launch-1.0 -e --gst-debug=2 qtiqmmfsrc name=camsrc ! video/x-raw,format=NV12,width=1920,height=1080,framerate=60/1 ! tee name=t1 ! queue ! jpegenc ! avimux ! filesink location=/opt/mjpeg1.avi \
    t1. ! queue ! jpegenc ! avimux ! filesink location=/opt/mjpeg2.avi \
    t1. ! queue ! jpegenc ! avimux ! filesink location=/opt/mjpeg3.avi \
    t1. ! queue ! jpegenc ! avimux ! filesink location=/opt/mjpeg4.aviCopy to clipboard

**Parent Topic:** [Camera and video encode](https://docs.qualcomm.com/doc/80-70015-50/topic/camera-and-video-encode.html)

Last Published: Oct 27, 2025

[Previous Topic
Intra-frame smart codec (H.264 and H.265)](https://docs.qualcomm.com/bundle/publicresource/80-70015-50/topics/intra-frame-smart-codec.md) [Next Topic
Enable 24 end-to-end concurrent video sessions](https://docs.qualcomm.com/bundle/publicresource/80-70015-50/topics/enable-end-to-end-24-concurrent-video-sessions-decode-encode.md)