Software decoding — سافٹ ویئر لائبریریوں کے ذریعے سنٹرل پروسیسر (CPU) کے ذریعے میڈیا ڈیٹا کو ڈی کمپریس کرنے کا عمل، بغیر SoC کے ہارڈویئر بلاکس استعمال کیے۔ سافٹ ویئر ڈی کوڈرز کراس پلیٹ فارم لائبریریوں کے طور پر لاگو کیے جاتے ہیں: FFmpeg libavcodec کے ساتھ اور AV1 کے لیے dav1d۔ FFmpeg دستاویزات (2026) کے مطابق، libavcodec 200 سے زیادہ کوڈیکس کو سپورٹ کرتا ہے، جو software decoding کو نایاب فارمیٹس چلانے کا واحد طریقہ بناتا ہے۔
اہم نکات
Software decoding میڈیا ڈیٹا کو ڈی کمپریس کرنے کا ایک طریقہ ہے جس میں تمام حسابی کارروائیاں عام مقصد کے CPU کور پر انجام دی جاتی ہیں۔ ہارڈویئر ڈی کوڈنگ کے برعکس، جہاں ہر کوڈیک کے لیے ایک مخصوص فزیکل بلاک ہوتا ہے، سافٹ ویئر ڈی کوڈر عام کوڈ ہے جو پروسیسر ہدایات کا استعمال کرتے ہوئے وہی الگورتھم انجام دیتا ہے۔
سافٹ ویئر ڈی کوڈرز مخصوص CPU آرکیٹیکچر کے لیے اصلاح کے ساتھ C/C++ میں لکھے جاتے ہیں: موبائل آلات کے لیے ARM NEON SIMD ہدایات، ڈیسک ٹاپ کے لیے Intel SSE/AVX۔ FFmpeg کی libavcodec لائبریری میں مختلف پلیٹ فارمز کے لیے بہتر کردہ اسمبلی کوڈ کی دسیوں ہزار لائنیں ہیں، جو سافٹ ویئر ڈی کوڈنگ کو طاقتور CPU پر AV1 جیسے بھاری فارمیٹس کے لیے بھی اچھی کارکردگی حاصل کرنے کی اجازت دیتی ہیں۔
سافٹ ویئر ڈی کوڈنگ کا بنیادی فائدہ استعداد ہے۔ اگر ہارڈویئر ڈی کوڈر صرف 4–5 اہم فارمیٹس (H.264, H.265, VP9, AV1) کو سپورٹ کرتا ہے، تو FFmpeg 200 سے زیادہ کوڈیکس ڈی کوڈ کر سکتا ہے: جدید AV1 اور H.265 سے لے کر قدیم Sorenson Spark، RealVideo اور Motion JPEG تک۔ یہ سافٹ ویئر ڈی کوڈنگ کو غیر معیاری میڈیا ڈیٹا کے ساتھ کام کرنے والی ایپلیکیشنز کے لیے ایک ناگزیر ٹول بناتا ہے — جیسے پیشہ ور ویڈیو ایڈیٹرز، ویڈیو نگرانی کے نظام اور خصوصی پلیئرز۔
سافٹ ویئر ڈی کوڈنگ ہارڈویئر ڈی کوڈنگ کے same مراحل پر عمل کرتی ہے، لیکن عام مقصد کے CPU پر۔ ہر مرحلہ فنکشنز کے طور پر لاگو کیا جاتا ہے جو ہر میکرو بلاک یا فریم کے لیے ترتیب وار بلائے جاتے ہیں۔ اہم فرق لچک ہے: ڈویلپر پائپ لائن کو تبدیل کر سکتا ہے، ڈی کوڈنگ کے مراحل کے درمیان فلٹرز اور پوسٹ پروسیسنگ شامل کر سکتا ہے۔
ایک عام سافٹ ویئر ڈی کوڈر ماڈیولز پر مشتمل ہوتا ہے جو الگ الگ الگورتھم مراحل کو لاگو کرتے ہیں۔ اینٹروپی ڈی کوڈنگ ماڈیول بٹ اسٹریم پڑھتا ہے اور کوانٹائزڈ DCT کوفیشینٹس کو بحال کرتا ہے۔ H.264 کے لیے، یہ ماڈیول CABAC (متناسب موافق بائنری ریاضی کوڈنگ) لاگو کرتا ہے — مشروط شاخوں کے ساتھ ایک پیچیدہ الگورتھم جسے ہارڈویئر میں تیز کرنا مشکل ہے لیکن اچھے برانچ پریڈیکٹر والے CPU پر مؤثر طریقے سے چلتا ہے۔
ریورس کوانٹائزیشن ماڈیول کوفیشینٹس کو کوانٹائزیشن مرحلے سے ضرب دیتا ہے، اور ریورس DCT ماڈیول مجرد کوزائن ٹرانسفارم کا اطلاق کرتا ہے۔ ریورس DCT کا سافٹ ویئر نفاذ تیز چن الگورتھم یا لوفلر الگورتھم استعمال کرتا ہے، جو 8x8 بلاک کے لیے ضرب جمع آپریشنز کی تعداد کو 4096 سے کم کر کے 256 کر دیتے ہیں۔ NEON SIMD ہدایات (ARM) یا SSE (x86) فی ہدایت 4–8 کوفیشینٹس پر کارروائی کرنے کی اجازت دیتی ہیں، جو اسکیلر کوڈ کے مقابلے میں 4–8 گنا تیزی فراہم کرتی ہیں۔
موشن کمپنسیشن ماڈیول سب سے زیادہ میموری استعمال کرنے والا ہے۔ یہ حرکت ویکٹر کے مطابق ریفرنس فریموں سے علاقے نکالتا ہے اور سب پکسل انٹرپولیشن کا اطلاق کرتا ہے۔ H.265 کے لیے، انٹرپولیشن کی درستگی 1/8 پکسل تک پہنچتی ہے، جس کے لیے لومینا کے لیے 8 ٹیپ FIR فلٹر اور کرومیما کے لیے 4 ٹیپ کی ضرورت ہوتی ہے۔ سافٹ ویئر نفاذ کو کیشے سے بڑی مقدار میں ریفرنس فریم ڈیٹا لوڈ کرنا پڑتا ہے، جو CPU پر ہائی ریزولوشن ڈی کوڈ کرتے وقت موشن کمپنسیشن کو ایک رکاوٹ بناتا ہے۔
جدید موبائل پروسیسرز، جیسے Apple A17 یا Qualcomm Snapdragon 8 Gen 2، میں 6–8 کور ہوتے ہیں جو بغیر فریم ڈراپ کے 1080p H.264 کی سافٹ ویئر ڈی کوڈنگ کے لیے کافی کارکردگی رکھتے ہیں۔ تاہم، 4K مواد کے لیے، خاص طور پر H.265 اور AV1 فارمیٹس میں، CPU پر سافٹ ویئر ڈی کوڈنگ مشکلات کا شکار ہو سکتی ہے: تمام کور پر عام لوڈ 70–90% تک پہنچ جاتا ہے، جو ملٹی ٹاسکنگ کے لیے اہم ہے۔ بڑے کور (Apple Performance, Qualcomm Kryo Prime) چھوٹے توانائی بچانے والے کور کے مقابلے میں ~4–5 گنا کارکردگی فراہم کرتے ہیں، لیکن متناسب طور پر زیادہ توانائی خرچ کرتے ہیں۔
سافٹ ویئر ڈی کوڈر مارکیٹ میں کئی اہم لائبریریاں ہیں، ہر ایک اپنی جگہ کے لیے بہتر کردہ ہے۔ ڈی کوڈر کا انتخاب مطلوبہ فارمیٹس، پلیٹ فارم اور لائسنسنگ پابندیوں پر منحصر ہے۔
FFmpeg صنعت میں سافٹ ویئر ڈی کوڈنگ کا ڈی فیکٹو معیار ہے۔ libavcodec لائبریری میں تمام اہم اور زیادہ تر نایاب کوڈیکس کے لیے ڈی کوڈرز شامل ہیں، تمام کنٹینرز (MP4, MKV, AVI, MOV, WebM) کو سپورٹ کرتی ہے اور تمام پلیٹ فارمز پر چلتی ہے۔ FFmpeg LGPL/GPL کے تحت لائسنس یافتہ ہے، جس کے لیے تجارتی استعمال کے لیے لائسنس کی شرائط کی تعمیل ضروری ہے۔ موبائل آلات پر، FFmpeg ریپرز کے ذریعے استعمال ہوتا ہے: iOS اور Android کے لیے ffmpeg-kit، React Native کے لیے mobile-ffmpeg۔
Dav1d VideoLAN (VLC کے ڈویلپرز) سے ایک سافٹ ویئر AV1 ڈی کوڈر ہے، جو SIMD اصلاح کے ساتھ C میں لکھا گیا ہے۔ اس کا بنیادی مقصد ہارڈویئر سپورٹ کے بغیر CPU پر AV1 کی تیز ترین ممکنہ سافٹ ویئر ڈی کوڈنگ ہے۔ Dav1d Alliance for Open Media کے ریفرنس libaom ڈی کوڈر سے 30–50% تیز ہے، جارحانہ اصلاحات کی بدولت: دستی کیشے مینجمنٹ، پوسٹ پروسیسنگ فلٹرز کے لیے JIT کمپائلیشن اور اہم فنکشنز کی ویکٹرائزیشن۔
موبائل آلات پر، dav1d فلیگ شپ SoCs (Apple A16+, Snapdragon 8 Gen 2+) پر 1080p AV1 کو ریئل ٹائم میں ڈی کوڈ کر سکتا ہے، لیکن 4K کے لیے ایک طاقتور CPU کی ضرورت ہے۔ مثال کے طور پر، Apple M1 پر سافٹ ویئر dav1d 4K AV1 کے لیے ~60 FPS حاصل کرتا ہے، جبکہ Snapdragon 8 Gen 2 پر ~35 FPS تک پہنچتا ہے۔ موبائل آلات پر مستحکم 4K AV1 پلے بیک کے لیے، ہارڈویئر سپورٹ اب بھی تجویز کی جاتی ہے۔
| ڈی کوڈر | فارمیٹس | پلیٹ فارمز | لائسنس |
|---|---|---|---|
| libavcodec | 200+ کوڈیکس | تمام | LGPL/GPL |
| dav1d | AV1 | تمام | BSD 2-Clause |
| libaom | AV1 | تمام | BSD 2-Clause |
| MediaFoundation | H.264, H.265 | Windows | ملکیتی |
سافٹ ویئر اور ہارڈویئر ڈی کوڈنگ کے درمیان انتخاب مطابقت اور کارکردگی کے درمیان ایک سمجھوتہ ہے۔ نیچے دی گئی جدول اہم خصوصیات کا تفصیلی موازنہ پیش کرتی ہے۔
| پیرامیٹر | Software Decoding | Hardware Decoding |
|---|---|---|
| سپورٹ شدہ فارمیٹس | 200+ کوڈیکس | 4–6 کوڈیکس |
| بجلی کی کھپت | 1.5–5 W | 0.2–0.8 W |
| کسٹمائزیشن | پائپ لائن پر مکمل کنٹرول | صرف API کے ذریعے |
| تاخیر | 30–80 ms | 5–15 ms |
| حرارت کا اخراج | زیادہ (45–50 C) | کم (35–40 C) |
| کوڈیک اپ ڈیٹس | لائبریری اپ ڈیٹ کے ذریعے | صرف نئے SoC کے ساتھ |
سافٹ ویئر ڈی کوڈنگ زیادہ سے زیادہ لچک فراہم کرتی ہے: ڈویلپر الگورتھم کو تبدیل کر سکتا ہے، کسٹم فلٹرز شامل کر سکتا ہے اور اپنی پروسیسنگ پائپ لائنز لاگو کر سکتا ہے۔ مثال کے طور پر، ویڈیو ایڈیٹنگ ایپلیکیشنز میں، ڈی کوڈنگ کے ہر مرحلے کو رنگ درستی یا اثرات کے لیے GPU پر ری ڈائریکٹ کیا جا سکتا ہے — یہ صرف ڈی کوڈنگ پر سافٹ ویئر کنٹرول کے ساتھ ممکن ہے۔
تاہم، لچک کی قیمت بجلی کی کھپت ہے۔ 3000–5000 mAh بیٹری والے موبائل آلات کے لیے، مسلسل سافٹ ویئر ڈی کوڈنگ دیکھنے کے وقت کو 10–15 گھنٹے (ہارڈویئر) سے کم کر کے 2–4 گھنٹے کر دیتی ہے۔ 45–50 ڈگری تک CPU گرم ہونا تھروٹلنگ کا سبب بھی بن سکتا ہے — زیادہ گرمی سے بچنے کے لیے پروسیسر فریکوئنسی میں کمی، جس کے نتیجے میں فریم ڈراپ اور صارف کے تجربے میں بگاڑ آتا ہے۔
آئیے دونوں موبائل پلیٹ فارمز پر سافٹ ویئر ڈی کوڈنگ کے عملی نفاذ کو دیکھتے ہیں۔ iOS پر، سافٹ ویئر ڈی کوڈنگ FFmpeg کے ذریعے استعمال ہوتی ہے، اور Android پر — Java/Kotlin ریپر کے ساتھ اسی لائبریری کے ذریعے۔
extern "C" {
#include <libavcodec/avcodec.h>
#include <libavformat/avformat.h>
#include <libswscale/swscale.h>
}
class SoftwareDecoder {
AVCodecContext* codecCtx;
public:
bool init(const char* filename) {
AVFormatContext* fmtCtx = nullptr;
avformat_open_input(&fmtCtx, filename, nullptr, nullptr);
avformat_find_stream_info(fmtCtx, nullptr);
int videoStream = av_find_best_stream(
fmtCtx, AVMEDIA_TYPE_VIDEO, -1, -1, nullptr, 0
);
AVCodec* decoder = avcodec_find_decoder(
fmtCtx->streams[videoStream]->codecpar->codec_id
);
codecCtx = avcodec_alloc_context3(decoder);
avcodec_parameters_to_context(codecCtx,
fmtCtx->streams[videoStream]->codecpar);
avcodec_open2(codecCtx, decoder, nullptr);
return true;
}
AVFrame* decodePacket(AVPacket* packet) {
avcodec_send_packet(codecCtx, packet);
AVFrame* frame = av_frame_alloc();
int ret = avcodec_receive_frame(codecCtx, frame);
return (ret >= 0) ? frame : nullptr;
}
};
کوڈ سافٹ ویئر ڈی کوڈنگ کے لیے ایک کم سے کم FFmpeg پائپ لائن دکھاتا ہے۔ avformat_open_input فائل کھولتا ہے اور کنٹینر فارمیٹ کا تعین کرتا ہے، avcodec_find_decoder کسی بھی کوڈیک کے لیے خود بخود موزوں ڈی کوڈر ڈھونڈتا ہے۔ decodePacket طریقہ نیا API (avcodec_send_packet / avcodec_receive_frame) استعمال کرتا ہے، جو ریئل ٹائم ایپلیکیشنز کے لیے AV_CODEC_FLAG_LOW_DELAY پرچم کے ساتھ ملٹی تھریڈڈ ڈی کوڈنگ کو سپورٹ کرتا ہے۔
class SoftwareDecoder(private val context: Context) {
fun decodeVideo(inputPath: String, outputFolder: String) {
val cmd = "-i $inputPath -vf fps=1 $outputFolder/frame_%04d.jpg"
FFmpegExecutor(context).executeCommand(cmd) { rc ->
Log.d("Decoder", "Finished with rc: $rc")
}
}
fun getFrameCount(filePath: String): Int {
val probe = MediaMetadataRetriever()
probe.setDataSource(filePath)
val duration = probe.extractMetadata(
MediaMetadataRetriever.METADATA_KEY_DURATION
)?.toIntOrNull() ?: 0
val fps = probe.extractMetadata(
MediaMetadataRetriever.METADATA_KEY_VIDEO_FRAME_COUNT
)?.toIntOrNull() ?: 0
probe.release()
return fps
}
}
Kotlin مثال ویڈیو سے فی سیکنڈ ایک فریم نکالنے کے لیے FFmpegExecutor استعمال کرتی ہے۔ پیرامیٹر -vf fps=1 ایک فلٹر بناتا ہے جو 60 میں سے 59 فریموں کو چھوڑ دیتا ہے، CPU لوڈ کو کم کرتا ہے۔ یہ طریقہ موبائل ایپلیکیشنز میں پیش نظارہ اور پلیس ہولڈر بنانے کے لیے مفید ہے۔ ریئل ٹائم سافٹ ویئر ڈی کوڈنگ کے لیے، JNI کے ذریعے براہ راست لو لیول libavcodec API استعمال کرنے کی سفارش کی جاتی ہے۔
#include <dav1d/dav1d.h>
int decode_av1_frame(const uint8_t* data, size_t size) {
Dav1dContext* ctx = nullptr;
Dav1dSettings settings = { 0 };
dav1d_default_settings(&settings);
settings.n_threads = 4;
dav1d_open(&ctx, &settings);
Dav1dData dav1d_data = { 0 };
dav1d_data_wrap(&dav1d_data, data, size, nullptr, nullptr);
Dav1dPicture pic = { 0 };
if (dav1d_send_data(ctx, &dav1d_data) == 0) {
dav1d_get_picture(ctx, &pic);
}
dav1d_close(&ctx);
return pic.p.w;
}
Dav1d ایک کم سے کم API فراہم کرتا ہے: dav1d_open مخصوص تعداد میں تھریڈز کے ساتھ ڈی کوڈر سیاق و سباق بناتا ہے، dav1d_send_data کمپریسڈ بٹ اسٹریم قبول کرتا ہے، dav1d_get_picture YUV420 فارمیٹ میں ڈی کوڈ شدہ فریم لوٹاتا ہے۔ موبائل آلات کے لیے، بہترین تھریڈ شمار (n_threads) کارکردگی CPU کور کی تعداد مائنس ایک ہے، تاکہ UI تھریڈ کے لیے وسائل بچ سکیں۔ Dav1d میموری مینجمنٹ اور GPU کو فریم منتقل کرتے وقت غیر ضروری کاپیوں سے بچنے کے لیے Dav1dPicAllocator کو بھی سپورٹ کرتا ہے۔
زیادہ بجلی کی کھپت کے باوجود، سافٹ ویئر ڈی کوڈنگ کئی منظرناموں میں ناگزیر ہے جہاں ہارڈویئر ڈی کوڈنگ مطلوبہ فعالیت فراہم نہیں کر سکتی۔ ان منظرناموں کو سمجھنے سے ڈویلپرز کو آرکیٹیکچرل فیصلے لینے میں مدد ملتی ہے۔
ہارڈویئر ڈی کوڈرز صرف جدید فارمیٹس کو سپورٹ کرتے ہیں۔ اگر ایپلیکیشن آرکائیو ریکارڈنگز، ویڈیو نگرانی (MJPEG, H.263)، پیشہ ور کوڈیکس (ProRes, DNxHD, CineForm) یا تیسرے فریق کے ذرائع سے مواد کے ساتھ کام کرتی ہے — FFmpeg کے ذریعے سافٹ ویئر ڈی کوڈنگ ہی واحد آپشن ہوگا۔ ProRes ہارڈویئر سپورٹ والے Apple A13+ چپس کو چھوڑ کر تمام آلات پر صرف سافٹ ویئر کے ذریعے ڈی کوڈ کیا جاتا ہے۔ H.263 کے لیے، کسی بھی جدید SoC پر ہارڈویئر سپورٹ نہیں ہے — صرف سافٹ ویئر ڈی کوڈنگ۔
سافٹ ویئر ڈی کوڈنگ ہر فریم پروسیسنگ مرحلے تک مکمل رسائی فراہم کرتی ہے۔ یہ ان ایپلیکیشنز کے لیے اہم ہے جنہیں آؤٹ پٹ سے پہلے براہ راست ڈی کوڈ شدہ ڈیٹا پر فلٹرز (بلر، شور میں کمی، شارپننگ) لگانے کی ضرورت ہوتی ہے۔ FFmpeg فلٹرز پیچیدہ زنجیریں بنانے کی اجازت دیتے ہیں: ڈی کوڈنگ -> رنگ درستی -> اسکیلنگ -> سب ٹائٹل اوورلے -> انکوڈنگ — سب ایک ہی لائبریری میں مختلف APIs کے درمیان ڈیٹا منتقل کیے بغیر۔
تجویز کردہ میڈیا پلیئر آرکیٹیکچر ہائبرڈ ہے: ہارڈویئر ڈی کوڈنگ بطور بنیادی، سافٹ ویئر ڈی کوڈنگ بطور فال بیک۔ پلے بیک سے پہلے، ایپلیکیشن دیئے گئے کوڈیک کے لیے ہارڈویئر ڈی کوڈر کی دستیابی چیک کرتی ہے۔ اگر کوئی ڈی کوڈر نہیں ملتا تو FFmpeg کے ذریعے سافٹ ویئر ڈی کوڈنگ شروع کی جاتی ہے۔ یہ حکمت عملی اہم فارمیٹس کے لیے کارکردگی کی قربانی دیے بغیر زیادہ سے زیادہ مطابقت کو یقینی بناتی ہے۔ دستیابی کی جانچ ہر لانچ پر کی جانی چاہیے، کیونکہ مختلف SoC ریویژنز کی وجہ سے ایک ہی ماڈل کے آلات پر بھی ہارڈویئر سپورٹ مختلف ہو سکتی ہے۔
اکثر پوچھے گئے سوالات
CPU ایک عام مقصد کا پروسیسر ہے جو بہت سے مختلف کام انجام دیتا ہے۔ ڈی کوڈنگ کے لیے، یہ مشترکہ حسابی اکائیاں اور کیشے میموری استعمال کرتا ہے، جو ایک ہی کام کرتے ہوئے بھی توانائی خرچ کرتی ہیں۔ ہارڈویئر ڈی کوڈر ایک مقررہ پائپ لائن کے ساتھ ایک انتہائی مخصوص سرکٹ ہے، جہاں ہر ٹرانزسٹر صرف ڈی کوڈنگ کے لیے مخصوص ہوتا ہے، جو بجلی کی کھپت کو یکسر کم کرتا ہے۔
H.264/H.265 کے لیے — SIMD اصلاحات کے ساتھ FFmpeg سے libavcodec۔ AV1 کے لیے — dav1d، جو ریفرنس libaom سے 30–50% تیز ہے۔ موبائل آلات پر، dav1d کی کارکردگی فلیگ شپ SoCs (A16+, Dimensity 9200+) پر ریئل ٹائم 1080p AV1 ڈی کوڈنگ کی اجازت دیتی ہے۔
جی ہاں، FFmpeg دونوں پلیٹ فارمز پر پورٹ کیا گیا ہے۔ iOS کے لیے، ffmpeg-kit استعمال کریں — تمام کوڈیکس اور فارمیٹس کی سپورٹ کے ساتھ ایک تیار بلڈ۔ Android کے لیے — mobile-ffmpeg یا NDK کے ذریعے FFmpeg بنائیں۔ تجارتی تقسیم کے لیے GPL/LGPL لائسنسنگ پابندیوں کو ذہن میں رکھیں۔
ریئل ٹائم ڈی کوڈنگ کا مطلب ہے کہ CPU اسکرین پر فریم ڈسپلے ہونے سے تیزی سے فریم ڈی کوڈ کر سکتا ہے (عام طور پر 30 یا 60 FPS)۔ 1080p H.264 کے لیے، ایک جدید موبائل CPU اسے آسانی سے سنبھال لیتا ہے، ایک کارکردگی کور کا تقریباً 30–50% استعمال کرتا ہے۔ 4K H.265 کے لیے، CPU پر ریئل ٹائم صرف فلیگ شپ SoCs پر تمام کور پر 70–90% لوڈ کے ساتھ ممکن ہے۔
thread_count پرچم کے ساتھ FFmpeg کے ذریعے ملٹی تھریڈڈ ڈی کوڈنگ (فریم سطح کی ہم آہنگی) استعمال کریں، skip_frame کو B-frames پر سیٹ کریں (اگر منظرنامے کے لیے قابل قبول ہو)، ڈی کوڈنگ سے پہلے scale فلٹر کے ذریعے ریزولوشن کم کریں۔ dav1d کے ساتھ AV1 کے لیے، n_threads = CPU کور کی تعداد مائنس ایک استعمال کریں۔
خلاصہ
ہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے
IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔
مزید پڑھیں