ffmpeg_vid_codecs.c 65 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066
  1. /*
  2. * Copyright (C) 2010-2011 Teluu Inc. (http://www.teluu.com)
  3. *
  4. * This program is free software; you can redistribute it and/or modify
  5. * it under the terms of the GNU General Public License as published by
  6. * the Free Software Foundation; either version 2 of the License, or
  7. * (at your option) any later version.
  8. *
  9. * This program is distributed in the hope that it will be useful,
  10. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. * GNU General Public License for more details.
  13. *
  14. * You should have received a copy of the GNU General Public License
  15. * along with this program; if not, write to the Free Software
  16. * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  17. */
  18. #include <pjmedia-codec/ffmpeg_vid_codecs.h>
  19. #include <pjmedia-codec/h263_packetizer.h>
  20. #include <pjmedia-codec/h264_packetizer.h>
  21. #include <pjmedia-codec/vpx_packetizer.h>
  22. #include <pjmedia/errno.h>
  23. #include <pjmedia/vid_codec_util.h>
  24. #include <pj/assert.h>
  25. #include <pj/list.h>
  26. #include <pj/log.h>
  27. #include <pj/math.h>
  28. #include <pj/pool.h>
  29. #include <pj/string.h>
  30. #include <pj/os.h>
  31. /*
  32. * Only build this file if PJMEDIA_HAS_FFMPEG_VID_CODEC != 0 and
  33. * PJMEDIA_HAS_VIDEO != 0
  34. */
  35. #if defined(PJMEDIA_HAS_FFMPEG_VID_CODEC) && \
  36. PJMEDIA_HAS_FFMPEG_VID_CODEC != 0 && \
  37. defined(PJMEDIA_HAS_VIDEO) && (PJMEDIA_HAS_VIDEO != 0)
  38. #define THIS_FILE "ffmpeg_vid_codecs.c"
  39. #include "../pjmedia/ffmpeg_util.h"
  40. #include <libavcodec/avcodec.h>
  41. #include <libavformat/avformat.h>
  42. #if LIBAVCODEC_VER_AT_LEAST(53,20)
  43. /* Needed by 264 so far, on libavcodec 53.20 */
  44. # include <libavutil/opt.h>
  45. #endif
  46. /* Various compatibility */
  47. #if LIBAVCODEC_VER_AT_LEAST(53,20)
  48. # define AVCODEC_OPEN(ctx,c) avcodec_open2(ctx,c,NULL)
  49. #else
  50. # define AVCODEC_OPEN(ctx,c) avcodec_open(ctx,c)
  51. #endif
  52. #if LIBAVCODEC_VER_AT_LEAST(53,61)
  53. # if LIBAVCODEC_VER_AT_LEAST(54,59)
  54. /* Not sure when AVCodec::encode is obsoleted/removed. */
  55. # define AVCODEC_HAS_ENCODE(c) (c->encode2 != (void*)0)
  56. # else
  57. /* Not sure when AVCodec::encode2 is introduced. It appears in
  58. * libavcodec 53.61 where some codecs actually still use AVCodec::encode
  59. * (e.g: H263, H264).
  60. */
  61. # define AVCODEC_HAS_ENCODE(c) (c->encode != (void*)0 || \
  62. c->encode2 != (void*)0)
  63. # endif
  64. # define AV_OPT_SET(obj,name,val,opt) (av_opt_set(obj,name,val,opt)==0)
  65. # define AV_OPT_SET_INT(obj,name,val) (av_opt_set_int(obj,name,val,0)==0)
  66. #else
  67. # define AVCODEC_HAS_ENCODE(c) (c->encode != (void*)0)
  68. # define AV_OPT_SET(obj,name,val,opt) (av_set_string3(obj,name,val,opt,NULL)==0)
  69. # define AV_OPT_SET_INT(obj,name,val) (av_set_int(obj,name,val)!=NULL)
  70. #endif
  71. #define AVCODEC_HAS_DECODE(c) (c->decode != (void*)0)
  72. /* AVCodec H264 default PT */
  73. #define AVC_H264_PT PJMEDIA_RTP_PT_H264_RSV3
  74. /* Prototypes for FFMPEG codecs factory */
  75. static pj_status_t ffmpeg_test_alloc( pjmedia_vid_codec_factory *factory,
  76. const pjmedia_vid_codec_info *id );
  77. static pj_status_t ffmpeg_default_attr( pjmedia_vid_codec_factory *factory,
  78. const pjmedia_vid_codec_info *info,
  79. pjmedia_vid_codec_param *attr );
  80. static pj_status_t ffmpeg_enum_codecs( pjmedia_vid_codec_factory *factory,
  81. unsigned *count,
  82. pjmedia_vid_codec_info codecs[]);
  83. static pj_status_t ffmpeg_alloc_codec( pjmedia_vid_codec_factory *factory,
  84. const pjmedia_vid_codec_info *info,
  85. pjmedia_vid_codec **p_codec);
  86. static pj_status_t ffmpeg_dealloc_codec( pjmedia_vid_codec_factory *factory,
  87. pjmedia_vid_codec *codec );
  88. /* Prototypes for FFMPEG codecs implementation. */
  89. static pj_status_t ffmpeg_codec_init( pjmedia_vid_codec *codec,
  90. pj_pool_t *pool );
  91. static pj_status_t ffmpeg_codec_open( pjmedia_vid_codec *codec,
  92. pjmedia_vid_codec_param *attr );
  93. static pj_status_t ffmpeg_codec_close( pjmedia_vid_codec *codec );
  94. static pj_status_t ffmpeg_codec_modify(pjmedia_vid_codec *codec,
  95. const pjmedia_vid_codec_param *attr );
  96. static pj_status_t ffmpeg_codec_get_param(pjmedia_vid_codec *codec,
  97. pjmedia_vid_codec_param *param);
  98. static pj_status_t ffmpeg_codec_encode_begin(pjmedia_vid_codec *codec,
  99. const pjmedia_vid_encode_opt *opt,
  100. const pjmedia_frame *input,
  101. unsigned out_size,
  102. pjmedia_frame *output,
  103. pj_bool_t *has_more);
  104. static pj_status_t ffmpeg_codec_encode_more(pjmedia_vid_codec *codec,
  105. unsigned out_size,
  106. pjmedia_frame *output,
  107. pj_bool_t *has_more);
  108. static pj_status_t ffmpeg_codec_decode( pjmedia_vid_codec *codec,
  109. pj_size_t pkt_count,
  110. pjmedia_frame packets[],
  111. unsigned out_size,
  112. pjmedia_frame *output);
  113. /* Definition for FFMPEG codecs operations. */
  114. static pjmedia_vid_codec_op ffmpeg_op =
  115. {
  116. &ffmpeg_codec_init,
  117. &ffmpeg_codec_open,
  118. &ffmpeg_codec_close,
  119. &ffmpeg_codec_modify,
  120. &ffmpeg_codec_get_param,
  121. &ffmpeg_codec_encode_begin,
  122. &ffmpeg_codec_encode_more,
  123. &ffmpeg_codec_decode,
  124. NULL
  125. };
  126. /* Definition for FFMPEG codecs factory operations. */
  127. static pjmedia_vid_codec_factory_op ffmpeg_factory_op =
  128. {
  129. &ffmpeg_test_alloc,
  130. &ffmpeg_default_attr,
  131. &ffmpeg_enum_codecs,
  132. &ffmpeg_alloc_codec,
  133. &ffmpeg_dealloc_codec
  134. };
  135. /* FFMPEG codecs factory */
  136. static struct ffmpeg_factory {
  137. pjmedia_vid_codec_factory base;
  138. pjmedia_vid_codec_mgr *mgr;
  139. pj_pool_factory *pf;
  140. pj_pool_t *pool;
  141. pj_mutex_t *mutex;
  142. } ffmpeg_factory;
  143. typedef struct ffmpeg_codec_desc ffmpeg_codec_desc;
  144. /* FFMPEG codecs private data. */
  145. typedef struct ffmpeg_private
  146. {
  147. const ffmpeg_codec_desc *desc;
  148. pjmedia_vid_codec_param *param; /**< Codec param */
  149. pj_pool_t *pool; /**< Pool for each instance */
  150. /* Format info and apply format param */
  151. const pjmedia_video_format_info *enc_vfi;
  152. pjmedia_video_apply_fmt_param enc_vafp;
  153. const pjmedia_video_format_info *dec_vfi;
  154. pjmedia_video_apply_fmt_param dec_vafp;
  155. /* Buffers, only needed for multi-packets */
  156. pj_bool_t whole;
  157. void *enc_buf;
  158. unsigned enc_buf_size;
  159. pj_bool_t enc_buf_is_keyframe;
  160. unsigned enc_frame_len;
  161. unsigned enc_processed;
  162. void *dec_buf;
  163. unsigned dec_buf_size;
  164. pj_timestamp last_dec_keyframe_ts;
  165. /* The ffmpeg codec states. */
  166. const AVCodec *enc;
  167. const AVCodec *dec;
  168. AVCodecContext *enc_ctx;
  169. AVCodecContext *dec_ctx;
  170. /* The ffmpeg decoder cannot set the output format, so format conversion
  171. * may be needed for post-decoding.
  172. */
  173. enum AVPixelFormat expected_dec_fmt;
  174. /**< Expected output format of
  175. ffmpeg decoder */
  176. void *data; /**< Codec specific data */
  177. } ffmpeg_private;
  178. /* Shortcuts for packetize & unpacketize function declaration,
  179. * as it has long params and is reused many times!
  180. */
  181. #define FUNC_PACKETIZE(name) \
  182. pj_status_t(name)(ffmpeg_private *ff, pj_uint8_t *bits, \
  183. pj_size_t bits_len, unsigned *bits_pos, \
  184. pj_uint8_t *payload, pj_size_t *payload_len, \
  185. pj_bool_t is_keyframe)
  186. #define FUNC_UNPACKETIZE(name) \
  187. pj_status_t(name)(ffmpeg_private *ff, const pj_uint8_t *payload, \
  188. pj_size_t payload_len, pj_uint8_t *bits, \
  189. pj_size_t bits_len, unsigned *bits_pos)
  190. #define FUNC_FMT_MATCH(name) \
  191. pj_status_t(name)(pj_pool_t *pool, \
  192. pjmedia_sdp_media *offer, unsigned o_fmt_idx, \
  193. pjmedia_sdp_media *answer, unsigned a_fmt_idx, \
  194. unsigned option)
  195. /* Type definition of codec specific functions */
  196. typedef FUNC_PACKETIZE(*func_packetize);
  197. typedef FUNC_UNPACKETIZE(*func_unpacketize);
  198. typedef pj_status_t (*func_preopen) (ffmpeg_private *ff);
  199. typedef pj_status_t (*func_postopen) (ffmpeg_private *ff);
  200. typedef FUNC_FMT_MATCH(*func_sdp_fmt_match);
  201. /* FFMPEG codec info */
  202. struct ffmpeg_codec_desc
  203. {
  204. /* Predefined info */
  205. pjmedia_vid_codec_info info;
  206. pjmedia_format_id base_fmt_id; /**< Some codecs may be exactly
  207. same or compatible with
  208. another codec, base format
  209. will tell the initializer
  210. to copy this codec desc
  211. from its base format */
  212. pjmedia_rect_size size;
  213. pjmedia_ratio fps;
  214. pj_uint32_t avg_bps;
  215. pj_uint32_t max_bps;
  216. func_packetize packetize;
  217. func_unpacketize unpacketize;
  218. func_preopen preopen;
  219. func_preopen postopen;
  220. func_sdp_fmt_match sdp_fmt_match;
  221. pjmedia_codec_fmtp dec_fmtp;
  222. /* Init time defined info */
  223. pj_bool_t enabled;
  224. const AVCodec *enc;
  225. const AVCodec *dec;
  226. };
  227. #if PJMEDIA_HAS_FFMPEG_CODEC_H264 && !LIBAVCODEC_VER_AT_LEAST(53,20)
  228. # error "Must use libavcodec version 53.20 or later to enable FFMPEG H264"
  229. #endif
  230. /* H264 constants */
  231. #define PROFILE_H264_BASELINE 66
  232. #define PROFILE_H264_MAIN 77
  233. /* Codec specific functions */
  234. #if PJMEDIA_HAS_FFMPEG_CODEC_VP8 || PJMEDIA_HAS_FFMPEG_CODEC_VP9
  235. static pj_status_t vpx_preopen(ffmpeg_private *ff);
  236. static pj_status_t vpx_postopen(ffmpeg_private *ff);
  237. static FUNC_PACKETIZE(vpx_packetize);
  238. static FUNC_UNPACKETIZE(vpx_unpacketize);
  239. #endif
  240. #if PJMEDIA_HAS_FFMPEG_CODEC_H264
  241. static pj_status_t h264_preopen(ffmpeg_private *ff);
  242. static pj_status_t h264_postopen(ffmpeg_private *ff);
  243. static FUNC_PACKETIZE(h264_packetize);
  244. static FUNC_UNPACKETIZE(h264_unpacketize);
  245. #endif
  246. static pj_status_t h263_preopen(ffmpeg_private *ff);
  247. static FUNC_PACKETIZE(h263_packetize);
  248. static FUNC_UNPACKETIZE(h263_unpacketize);
  249. /* Internal codec info */
  250. static ffmpeg_codec_desc codec_desc[] =
  251. {
  252. #if PJMEDIA_HAS_FFMPEG_CODEC_H264
  253. {
  254. {PJMEDIA_FORMAT_H264, AVC_H264_PT, {"H264",4},
  255. {"Constrained Baseline (level=30, pack=1)", 39}},
  256. 0,
  257. {720, 480}, {15, 1}, 256000, 256000,
  258. &h264_packetize, &h264_unpacketize, &h264_preopen, &h264_postopen,
  259. &pjmedia_vid_codec_h264_match_sdp,
  260. /* Leading space for better compatibility (strange indeed!) */
  261. {2, { {{"profile-level-id",16}, {"42e01e",6}},
  262. {{" packetization-mode",19}, {"1",1}}, } },
  263. },
  264. #endif
  265. #if PJMEDIA_HAS_FFMPEG_CODEC_VP8
  266. {
  267. {PJMEDIA_FORMAT_VP8, PJMEDIA_RTP_PT_VP8_RSV2, {"VP8",3},
  268. {"FF VP8", 6}},
  269. 0,
  270. {720, 480}, {15, 1}, 256000, 256000,
  271. &vpx_packetize, &vpx_unpacketize, &vpx_preopen, &vpx_postopen, NULL,
  272. {2, { {{"max-fr",6}, {"30",2}},
  273. {{" max-fs",7}, {"580",3}}, } },
  274. },
  275. #endif
  276. #if PJMEDIA_HAS_FFMPEG_CODEC_VP9
  277. {
  278. {PJMEDIA_FORMAT_VP9, PJMEDIA_RTP_PT_VP9_RSV2, {"VP9",3},
  279. {"FF VP9", 6}},
  280. 0,
  281. {720, 480}, {15, 1}, 256000, 256000,
  282. &vpx_packetize, &vpx_unpacketize, &vpx_preopen, &vpx_postopen, NULL,
  283. {2, { {{"max-fr",6}, {"30",2}},
  284. {{" max-fs",7}, {"580",3}}, } },
  285. },
  286. #endif
  287. #if PJMEDIA_HAS_FFMPEG_CODEC_H263P
  288. {
  289. {PJMEDIA_FORMAT_H263P, PJMEDIA_RTP_PT_H263P, {"H263-1998",9}},
  290. PJMEDIA_FORMAT_H263,
  291. {352, 288}, {15, 1}, 256000, 256000,
  292. &h263_packetize, &h263_unpacketize, &h263_preopen, NULL, NULL,
  293. {2, { {{"CIF",3}, {"1",1}},
  294. {{"QCIF",4}, {"1",1}}, } },
  295. },
  296. #endif
  297. {
  298. {PJMEDIA_FORMAT_H263, PJMEDIA_RTP_PT_H263, {"H263",4}},
  299. },
  300. {
  301. {PJMEDIA_FORMAT_H261, PJMEDIA_RTP_PT_H261, {"H261",4}},
  302. },
  303. {
  304. {PJMEDIA_FORMAT_MJPEG, PJMEDIA_RTP_PT_JPEG, {"JPEG",4}},
  305. PJMEDIA_FORMAT_MJPEG, {640, 480}, {25, 1},
  306. },
  307. {
  308. {PJMEDIA_FORMAT_MPEG4, 0, {"MP4V",4}},
  309. PJMEDIA_FORMAT_MPEG4, {640, 480}, {25, 1},
  310. },
  311. };
  312. #if PJMEDIA_HAS_FFMPEG_CODEC_VP8 || PJMEDIA_HAS_FFMPEG_CODEC_VP9
  313. typedef struct vpx_data
  314. {
  315. pjmedia_vpx_packetizer *pktz;
  316. } vpx_data;
  317. static pj_status_t vpx_preopen(ffmpeg_private *ff)
  318. {
  319. vpx_data *data;
  320. pjmedia_vpx_packetizer_cfg pktz_cfg;
  321. pj_status_t status;
  322. data = PJ_POOL_ZALLOC_T(ff->pool, vpx_data);
  323. ff->data = data;
  324. /* Parse local fmtp */
  325. if (!ff->param->ignore_fmtp)
  326. {
  327. pjmedia_vid_codec_vpx_fmtp vpx_fmtp;
  328. const unsigned MAX_RX_RES = 1200;
  329. unsigned max_res = MAX_RX_RES;
  330. status = pjmedia_vid_codec_vpx_parse_fmtp(&ff->param->dec_fmtp, &vpx_fmtp);
  331. if (status != PJ_SUCCESS)
  332. {
  333. PJ_LOG(2, (THIS_FILE, "Parse vpx fmtp fail, status:%d", status));
  334. return status;
  335. }
  336. if (vpx_fmtp.max_fs > 0)
  337. {
  338. max_res = ((int)pj_isqrt(vpx_fmtp.max_fs * 8)) * 16;
  339. }
  340. ff->dec_buf_size = (max_res * max_res * 3 >> 1) + (max_res);
  341. }
  342. /* Create packetizer */
  343. pktz_cfg.fmt_id = ff->desc->info.fmt_id;
  344. pktz_cfg.mtu = ff->param->enc_mtu;
  345. status = pjmedia_vpx_packetizer_create(ff->pool, &pktz_cfg, &data->pktz);
  346. if (status != PJ_SUCCESS)
  347. {
  348. return status;
  349. }
  350. return PJ_SUCCESS;
  351. }
  352. static pj_status_t vpx_postopen(ffmpeg_private *ff)
  353. {
  354. vpx_data *data = (vpx_data *)ff->data;
  355. PJ_UNUSED_ARG(data);
  356. return PJ_SUCCESS;
  357. }
  358. static FUNC_PACKETIZE(vpx_packetize)
  359. {
  360. vpx_data *data = (vpx_data *)ff->data;
  361. pj_status_t status;
  362. unsigned payload_desc_size = 1;
  363. pj_uint8_t *outbuf = payload;
  364. pj_size_t out_size = *payload_len;
  365. out_size -= payload_desc_size;
  366. status = pjmedia_vpx_packetize(data->pktz, bits_len, bits_pos, is_keyframe,
  367. &outbuf, &out_size);
  368. if (status != PJ_SUCCESS)
  369. return status;
  370. pj_memcpy(outbuf + payload_desc_size, bits + *bits_pos, out_size);
  371. *payload_len = out_size + payload_desc_size;
  372. *bits_pos += out_size;
  373. return PJ_SUCCESS;
  374. }
  375. static FUNC_UNPACKETIZE(vpx_unpacketize)
  376. {
  377. vpx_data *data = (vpx_data *)ff->data;
  378. unsigned desc_len = 0;
  379. pj_status_t status;
  380. unsigned pos = *bits_pos;
  381. status = pjmedia_vpx_unpacketize(data->pktz, payload, payload_len, &desc_len);
  382. if (status != PJ_SUCCESS)
  383. return status;
  384. payload_len -= desc_len;
  385. if (pos + payload_len > bits_len)
  386. {
  387. PJ_LOG(2, (THIS_FILE, "Vpx unpacketize buffer overflow"));
  388. return PJMEDIA_CODEC_EFRMTOOSHORT;
  389. }
  390. pj_memcpy(bits + pos, (char *)payload + desc_len, payload_len);
  391. pos += payload_len;
  392. *bits_pos = pos;
  393. return PJ_SUCCESS;
  394. }
  395. #endif // PJMEDIA_HAS_FFMPEG_CODEC_VP8/VP9
  396. #if PJMEDIA_HAS_FFMPEG_CODEC_H264
  397. typedef struct h264_data
  398. {
  399. pjmedia_vid_codec_h264_fmtp fmtp;
  400. pjmedia_h264_packetizer *pktz;
  401. } h264_data;
  402. static pj_status_t h264_preopen(ffmpeg_private *ff)
  403. {
  404. h264_data *data;
  405. pjmedia_h264_packetizer_cfg pktz_cfg;
  406. pj_status_t status;
  407. data = PJ_POOL_ZALLOC_T(ff->pool, h264_data);
  408. ff->data = data;
  409. /* Parse remote fmtp */
  410. status = pjmedia_vid_codec_h264_parse_fmtp(&ff->param->enc_fmtp,
  411. &data->fmtp);
  412. if (status != PJ_SUCCESS)
  413. return status;
  414. /* Create packetizer */
  415. pktz_cfg.mtu = ff->param->enc_mtu;
  416. pktz_cfg.unpack_nal_start = 0;
  417. #if 0
  418. if (data->fmtp.packetization_mode == 0)
  419. pktz_cfg.mode = PJMEDIA_H264_PACKETIZER_MODE_SINGLE_NAL;
  420. else if (data->fmtp.packetization_mode == 1)
  421. pktz_cfg.mode = PJMEDIA_H264_PACKETIZER_MODE_NON_INTERLEAVED;
  422. else
  423. return PJ_ENOTSUP;
  424. #else
  425. if (data->fmtp.packetization_mode!=
  426. PJMEDIA_H264_PACKETIZER_MODE_SINGLE_NAL &&
  427. data->fmtp.packetization_mode!=
  428. PJMEDIA_H264_PACKETIZER_MODE_NON_INTERLEAVED)
  429. {
  430. return PJ_ENOTSUP;
  431. }
  432. /* Better always send in single NAL mode for better compatibility */
  433. pktz_cfg.mode = PJMEDIA_H264_PACKETIZER_MODE_SINGLE_NAL;
  434. #endif
  435. status = pjmedia_h264_packetizer_create(ff->pool, &pktz_cfg, &data->pktz);
  436. if (status != PJ_SUCCESS)
  437. return status;
  438. /* Apply SDP fmtp to format in codec param */
  439. if (!ff->param->ignore_fmtp) {
  440. status = pjmedia_vid_codec_h264_apply_fmtp(ff->param);
  441. if (status != PJ_SUCCESS)
  442. return status;
  443. }
  444. if (ff->param->dir & PJMEDIA_DIR_ENCODING) {
  445. pjmedia_video_format_detail *vfd;
  446. AVCodecContext *ctx = ff->enc_ctx;
  447. const char *profile = NULL;
  448. vfd = pjmedia_format_get_video_format_detail(&ff->param->enc_fmt,
  449. PJ_TRUE);
  450. /* Override generic params after applying SDP fmtp */
  451. ctx->width = vfd->size.w;
  452. ctx->height = vfd->size.h;
  453. ctx->time_base.num = vfd->fps.denum;
  454. ctx->time_base.den = vfd->fps.num;
  455. /* Apply profile. */
  456. ctx->profile = data->fmtp.profile_idc;
  457. switch (ctx->profile) {
  458. case PROFILE_H264_BASELINE:
  459. profile = "baseline";
  460. break;
  461. case PROFILE_H264_MAIN:
  462. profile = "main";
  463. break;
  464. default:
  465. break;
  466. }
  467. if (profile && !AV_OPT_SET(ctx->priv_data, "profile", profile, 0))
  468. {
  469. PJ_LOG(3, (THIS_FILE, "Failed to set H264 profile to '%s'",
  470. profile));
  471. }
  472. /* Apply profile constraint bits. */
  473. //PJ_TODO(set_h264_constraint_bits_properly_in_ffmpeg);
  474. if (data->fmtp.profile_iop) {
  475. #if defined(FF_PROFILE_H264_CONSTRAINED)
  476. ctx->profile |= FF_PROFILE_H264_CONSTRAINED;
  477. #endif
  478. }
  479. /* Apply profile level. */
  480. ctx->level = data->fmtp.level;
  481. /* Limit NAL unit size as we prefer single NAL unit packetization */
  482. if (!AV_OPT_SET_INT(ctx->priv_data, "slice-max-size", ff->param->enc_mtu))
  483. {
  484. PJ_LOG(3, (THIS_FILE, "Failed to set H264 max NAL size to %d",
  485. ff->param->enc_mtu));
  486. }
  487. /* Apply intra-refresh */
  488. if (!AV_OPT_SET_INT(ctx->priv_data, "intra-refresh", 1))
  489. {
  490. PJ_LOG(3, (THIS_FILE, "Failed to set x264 intra-refresh"));
  491. }
  492. /* Misc x264 settings (performance, quality, latency, etc).
  493. * Let's just use the x264 predefined preset & tune.
  494. */
  495. if (!AV_OPT_SET(ctx->priv_data, "preset", "veryfast", 0)) {
  496. PJ_LOG(3, (THIS_FILE, "Failed to set x264 preset 'veryfast'"));
  497. }
  498. if (!AV_OPT_SET(ctx->priv_data, "tune", "animation+zerolatency", 0)) {
  499. PJ_LOG(3, (THIS_FILE, "Failed to set x264 tune 'zerolatency'"));
  500. }
  501. }
  502. if (ff->param->dir & PJMEDIA_DIR_DECODING) {
  503. AVCodecContext *ctx = ff->dec_ctx;
  504. /* Apply the "sprop-parameter-sets" fmtp from remote SDP to
  505. * extradata of ffmpeg codec context.
  506. */
  507. if (data->fmtp.sprop_param_sets_len) {
  508. ctx->extradata_size = (int)data->fmtp.sprop_param_sets_len;
  509. ctx->extradata = data->fmtp.sprop_param_sets;
  510. }
  511. }
  512. return PJ_SUCCESS;
  513. }
  514. static pj_status_t h264_postopen(ffmpeg_private *ff)
  515. {
  516. h264_data *data = (h264_data*)ff->data;
  517. PJ_UNUSED_ARG(data);
  518. return PJ_SUCCESS;
  519. }
  520. static FUNC_PACKETIZE(h264_packetize)
  521. {
  522. PJ_UNUSED_ARG(is_keyframe);
  523. h264_data *data = (h264_data*)ff->data;
  524. pj_status_t status;
  525. pj_uint8_t *outbuf = payload;
  526. pj_size_t out_size = *payload_len;
  527. status = pjmedia_h264_packetize(data->pktz, bits, bits_len, bits_pos,
  528. (const pj_uint8_t **)&payload, payload_len);
  529. if (status != PJ_SUCCESS)
  530. return status;
  531. if (out_size < *payload_len)
  532. return PJMEDIA_CODEC_EFRMTOOSHORT;
  533. pj_memcpy(outbuf, payload, *payload_len);
  534. return PJ_SUCCESS;
  535. }
  536. static FUNC_UNPACKETIZE(h264_unpacketize)
  537. {
  538. h264_data *data = (h264_data*)ff->data;
  539. return pjmedia_h264_unpacketize(data->pktz, payload, payload_len,
  540. bits, bits_len, bits_pos);
  541. }
  542. #endif /* PJMEDIA_HAS_FFMPEG_CODEC_H264 */
  543. #if PJMEDIA_HAS_FFMPEG_CODEC_H263P
  544. typedef struct h263_data
  545. {
  546. pjmedia_h263_packetizer *pktz;
  547. } h263_data;
  548. /* H263 pre-open */
  549. static pj_status_t h263_preopen(ffmpeg_private *ff)
  550. {
  551. h263_data *data;
  552. pjmedia_h263_packetizer_cfg pktz_cfg;
  553. pj_status_t status;
  554. data = PJ_POOL_ZALLOC_T(ff->pool, h263_data);
  555. ff->data = data;
  556. /* Create packetizer */
  557. pktz_cfg.mtu = ff->param->enc_mtu;
  558. pktz_cfg.mode = PJMEDIA_H263_PACKETIZER_MODE_RFC4629;
  559. status = pjmedia_h263_packetizer_create(ff->pool, &pktz_cfg, &data->pktz);
  560. if (status != PJ_SUCCESS)
  561. return status;
  562. /* Apply fmtp settings to codec param */
  563. if (!ff->param->ignore_fmtp) {
  564. status = pjmedia_vid_codec_h263_apply_fmtp(ff->param);
  565. }
  566. /* Override generic params after applying SDP fmtp */
  567. if (ff->param->dir & PJMEDIA_DIR_ENCODING) {
  568. pjmedia_video_format_detail *vfd;
  569. AVCodecContext *ctx = ff->enc_ctx;
  570. vfd = pjmedia_format_get_video_format_detail(&ff->param->enc_fmt,
  571. PJ_TRUE);
  572. /* Override generic params after applying SDP fmtp */
  573. ctx->width = vfd->size.w;
  574. ctx->height = vfd->size.h;
  575. ctx->time_base.num = vfd->fps.denum;
  576. ctx->time_base.den = vfd->fps.num;
  577. }
  578. return status;
  579. }
  580. static FUNC_PACKETIZE(h263_packetize)
  581. {
  582. PJ_UNUSED_ARG(is_keyframe);
  583. h263_data *data = (h263_data*)ff->data;
  584. pj_status_t status;
  585. pj_uint8_t *outbuf = payload;
  586. pj_size_t out_size = *payload_len;
  587. status = pjmedia_h263_packetize(data->pktz, bits, bits_len, bits_pos,
  588. &payload, payload_len);
  589. if (status != PJ_SUCCESS)
  590. return status;
  591. if (out_size < *payload_len)
  592. return PJMEDIA_CODEC_EFRMTOOSHORT;
  593. pj_memcpy(outbuf, payload, *payload_len);
  594. return PJ_SUCCESS;
  595. }
  596. static FUNC_UNPACKETIZE(h263_unpacketize)
  597. {
  598. h263_data *data = (h263_data*)ff->data;
  599. return pjmedia_h263_unpacketize(data->pktz, payload, payload_len,
  600. bits, bits_len, bits_pos);
  601. }
  602. #endif /* PJMEDIA_HAS_FFMPEG_CODEC_H263P */
  603. static const ffmpeg_codec_desc* find_codec_desc_by_info(
  604. const pjmedia_vid_codec_info *info)
  605. {
  606. unsigned i;
  607. for (i=0; i<PJ_ARRAY_SIZE(codec_desc); ++i) {
  608. ffmpeg_codec_desc *desc = &codec_desc[i];
  609. if (desc->enabled &&
  610. (desc->info.fmt_id == info->fmt_id) &&
  611. ((desc->info.dir & info->dir) == info->dir) &&
  612. (desc->info.pt == info->pt) &&
  613. (desc->info.packings & info->packings))
  614. {
  615. return desc;
  616. }
  617. }
  618. return NULL;
  619. }
  620. static int find_codec_idx_by_fmt_id(pjmedia_format_id fmt_id)
  621. {
  622. unsigned i;
  623. for (i=0; i<PJ_ARRAY_SIZE(codec_desc); ++i) {
  624. if (codec_desc[i].info.fmt_id == fmt_id)
  625. return i;
  626. }
  627. return -1;
  628. }
  629. static void init_codec(AVCodec *c, pj_bool_t is_encoder,
  630. pj_bool_t is_decoder)
  631. {
  632. pj_status_t status;
  633. ffmpeg_codec_desc *desc;
  634. pjmedia_format_id fmt_id;
  635. int codec_info_idx;
  636. #if LIBAVCODEC_VERSION_MAJOR <= 52
  637. # define AVMEDIA_TYPE_VIDEO CODEC_TYPE_VIDEO
  638. #endif
  639. if (c->type != AVMEDIA_TYPE_VIDEO)
  640. return;
  641. /* Video encoder and decoder are usually implemented in separate
  642. * AVCodec instances. While the codec attributes (e.g: raw formats,
  643. * supported fps) are in the encoder.
  644. */
  645. status = CodecID_to_pjmedia_format_id(c->id, &fmt_id);
  646. /* Skip if format ID is unknown */
  647. if (status != PJ_SUCCESS)
  648. return;
  649. codec_info_idx = find_codec_idx_by_fmt_id(fmt_id);
  650. /* Skip if codec is unwanted by this wrapper (not listed in
  651. * the codec info array)
  652. */
  653. if (codec_info_idx < 0)
  654. return;
  655. desc = &codec_desc[codec_info_idx];
  656. /* Skip duplicated codec implementation */
  657. if ((is_encoder && (desc->info.dir & PJMEDIA_DIR_ENCODING))
  658. ||
  659. (is_decoder && (desc->info.dir & PJMEDIA_DIR_DECODING)))
  660. {
  661. return;
  662. }
  663. /* Get raw/decoded format ids in the encoder */
  664. if (c->pix_fmts && is_encoder) {
  665. pjmedia_format_id raw_fmt[PJMEDIA_VID_CODEC_MAX_DEC_FMT_CNT];
  666. unsigned raw_fmt_cnt = 0;
  667. unsigned raw_fmt_cnt_should_be = 0;
  668. const enum AVPixelFormat *p = c->pix_fmts;
  669. for(;(p && *p != -1) &&
  670. (raw_fmt_cnt < PJMEDIA_VID_CODEC_MAX_DEC_FMT_CNT);
  671. ++p)
  672. {
  673. pjmedia_format_id fmt_id;
  674. raw_fmt_cnt_should_be++;
  675. status = PixelFormat_to_pjmedia_format_id(*p, &fmt_id);
  676. if (status != PJ_SUCCESS) {
  677. PJ_PERROR(6, (THIS_FILE, status,
  678. "Unrecognized ffmpeg pixel format %d", *p));
  679. continue;
  680. }
  681. //raw_fmt[raw_fmt_cnt++] = fmt_id;
  682. /* Disable some formats due to H.264 error:
  683. * x264 [error]: baseline profile doesn't support 4:4:4
  684. */
  685. if (desc->info.pt != PJMEDIA_RTP_PT_H264 ||
  686. fmt_id != PJMEDIA_FORMAT_RGB24)
  687. {
  688. raw_fmt[raw_fmt_cnt++] = fmt_id;
  689. }
  690. }
  691. if (raw_fmt_cnt == 0) {
  692. PJ_LOG(5, (THIS_FILE, "No recognized raw format "
  693. "for codec [%s/%s], codec ignored",
  694. c->name, c->long_name));
  695. /* Skip this encoder */
  696. return;
  697. }
  698. if (raw_fmt_cnt < raw_fmt_cnt_should_be) {
  699. PJ_LOG(6, (THIS_FILE, "Codec [%s/%s] have %d raw formats, "
  700. "recognized only %d raw formats",
  701. c->name, c->long_name,
  702. raw_fmt_cnt_should_be, raw_fmt_cnt));
  703. }
  704. desc->info.dec_fmt_id_cnt = raw_fmt_cnt;
  705. pj_memcpy(desc->info.dec_fmt_id, raw_fmt,
  706. sizeof(raw_fmt[0])*raw_fmt_cnt);
  707. }
  708. /* Get supported framerates */
  709. if (c->supported_framerates) {
  710. const AVRational *fr = c->supported_framerates;
  711. while ((fr->num != 0 || fr->den != 0) &&
  712. desc->info.fps_cnt < PJMEDIA_VID_CODEC_MAX_FPS_CNT)
  713. {
  714. desc->info.fps[desc->info.fps_cnt].num = fr->num;
  715. desc->info.fps[desc->info.fps_cnt].denum = fr->den;
  716. ++desc->info.fps_cnt;
  717. ++fr;
  718. }
  719. }
  720. /* Get ffmpeg encoder instance */
  721. if (is_encoder && !desc->enc) {
  722. desc->info.dir |= PJMEDIA_DIR_ENCODING;
  723. desc->enc = c;
  724. }
  725. /* Get ffmpeg decoder instance */
  726. if (is_decoder && !desc->dec) {
  727. desc->info.dir |= PJMEDIA_DIR_DECODING;
  728. desc->dec = c;
  729. }
  730. /* Enable this codec when any ffmpeg codec instance are recognized
  731. * and the supported raw formats info has been collected.
  732. */
  733. if ((desc->dec || desc->enc) && desc->info.dec_fmt_id_cnt)
  734. {
  735. desc->enabled = PJ_TRUE;
  736. }
  737. /* Normalize default value of clock rate */
  738. if (desc->info.clock_rate == 0)
  739. desc->info.clock_rate = 90000;
  740. /* Set supported packings */
  741. desc->info.packings |= PJMEDIA_VID_PACKING_WHOLE;
  742. if (desc->packetize && desc->unpacketize)
  743. desc->info.packings |= PJMEDIA_VID_PACKING_PACKETS;
  744. }
  745. /*
  746. * Initialize and register FFMPEG codec factory to pjmedia endpoint.
  747. */
  748. PJ_DEF(pj_status_t) pjmedia_codec_ffmpeg_vid_init(pjmedia_vid_codec_mgr *mgr,
  749. pj_pool_factory *pf)
  750. {
  751. pj_pool_t *pool;
  752. AVCodec *c;
  753. pj_status_t status;
  754. unsigned i;
  755. if (ffmpeg_factory.pool != NULL) {
  756. /* Already initialized. */
  757. return PJ_SUCCESS;
  758. }
  759. if (!mgr) mgr = pjmedia_vid_codec_mgr_instance();
  760. PJ_ASSERT_RETURN(mgr, PJ_EINVAL);
  761. /* Create FFMPEG codec factory. */
  762. ffmpeg_factory.base.op = &ffmpeg_factory_op;
  763. ffmpeg_factory.base.factory_data = NULL;
  764. ffmpeg_factory.mgr = mgr;
  765. ffmpeg_factory.pf = pf;
  766. pool = pj_pool_create(pf, "ffmpeg codec factory", 256, 256, NULL);
  767. if (!pool)
  768. return PJ_ENOMEM;
  769. /* Create mutex. */
  770. status = pj_mutex_create_simple(pool, "ffmpeg codec factory",
  771. &ffmpeg_factory.mutex);
  772. if (status != PJ_SUCCESS)
  773. goto on_error;
  774. pjmedia_ffmpeg_add_ref();
  775. #if !LIBAVCODEC_VER_AT_LEAST(53,20)
  776. /* avcodec_init() dissappeared between version 53.20 and 54.15, not sure
  777. * exactly when
  778. */
  779. avcodec_init();
  780. #endif
  781. #if LIBAVCODEC_VER_AT_LEAST(58,137)
  782. for (i = 0; i < PJ_ARRAY_SIZE(codec_desc); ++i) {
  783. unsigned codec_id;
  784. pjmedia_format_id_to_CodecID(codec_desc[i].info.fmt_id, &codec_id);
  785. c = avcodec_find_encoder(codec_id);
  786. if (c)
  787. init_codec(c, PJ_TRUE, PJ_FALSE);
  788. c = avcodec_find_decoder(codec_id);
  789. if (c)
  790. init_codec(c, PJ_FALSE, PJ_TRUE);
  791. }
  792. #else
  793. avcodec_register_all();
  794. /* Enum FFMPEG codecs */
  795. for (c=av_codec_next(NULL); c; c=av_codec_next(c)) {
  796. init_codec(c, AVCODEC_HAS_ENCODE(c), AVCODEC_HAS_DECODE(c));
  797. }
  798. #endif
  799. /* Review all codecs for applying base format, registering format match for
  800. * SDP negotiation, etc.
  801. */
  802. for (i = 0; i < PJ_ARRAY_SIZE(codec_desc); ++i) {
  803. ffmpeg_codec_desc *desc = &codec_desc[i];
  804. /* Init encoder/decoder description from base format */
  805. if (desc->base_fmt_id && (!desc->dec || !desc->enc)) {
  806. ffmpeg_codec_desc *base_desc = NULL;
  807. int base_desc_idx;
  808. pjmedia_dir copied_dir = PJMEDIA_DIR_NONE;
  809. base_desc_idx = find_codec_idx_by_fmt_id(desc->base_fmt_id);
  810. if (base_desc_idx != -1)
  811. base_desc = &codec_desc[base_desc_idx];
  812. if (!base_desc || !base_desc->enabled)
  813. continue;
  814. /* Copy description from base codec */
  815. if (!desc->info.dec_fmt_id_cnt) {
  816. desc->info.dec_fmt_id_cnt = base_desc->info.dec_fmt_id_cnt;
  817. pj_memcpy(desc->info.dec_fmt_id, base_desc->info.dec_fmt_id,
  818. sizeof(pjmedia_format_id)*desc->info.dec_fmt_id_cnt);
  819. }
  820. if (!desc->info.fps_cnt) {
  821. desc->info.fps_cnt = base_desc->info.fps_cnt;
  822. pj_memcpy(desc->info.fps, base_desc->info.fps,
  823. sizeof(desc->info.fps[0])*desc->info.fps_cnt);
  824. }
  825. if (!desc->info.clock_rate) {
  826. desc->info.clock_rate = base_desc->info.clock_rate;
  827. }
  828. if (!desc->dec && base_desc->dec) {
  829. copied_dir |= PJMEDIA_DIR_DECODING;
  830. desc->dec = base_desc->dec;
  831. }
  832. if (!desc->enc && base_desc->enc) {
  833. copied_dir |= PJMEDIA_DIR_ENCODING;
  834. desc->enc = base_desc->enc;
  835. }
  836. desc->info.dir |= copied_dir;
  837. desc->enabled = (desc->info.dir != PJMEDIA_DIR_NONE);
  838. /* Set supported packings */
  839. desc->info.packings |= PJMEDIA_VID_PACKING_WHOLE;
  840. if (desc->packetize && desc->unpacketize)
  841. desc->info.packings |= PJMEDIA_VID_PACKING_PACKETS;
  842. if (copied_dir != PJMEDIA_DIR_NONE) {
  843. const char *dir_name[] = {NULL, "encoder", "decoder", "codec"};
  844. PJ_LOG(5, (THIS_FILE, "The %.*s %s is using base codec (%.*s)",
  845. (int)desc->info.encoding_name.slen,
  846. desc->info.encoding_name.ptr,
  847. dir_name[copied_dir],
  848. (int)base_desc->info.encoding_name.slen,
  849. base_desc->info.encoding_name.ptr));
  850. }
  851. }
  852. /* Registering format match for SDP negotiation */
  853. if (desc->sdp_fmt_match) {
  854. status = pjmedia_sdp_neg_register_fmt_match_cb(
  855. &desc->info.encoding_name,
  856. desc->sdp_fmt_match);
  857. pj_assert(status == PJ_SUCCESS);
  858. }
  859. /* Print warning about missing encoder/decoder */
  860. if (!desc->enc) {
  861. PJ_LOG(4, (THIS_FILE, "Cannot find %.*s encoder in ffmpeg library",
  862. (int)desc->info.encoding_name.slen,
  863. desc->info.encoding_name.ptr));
  864. }
  865. if (!desc->dec) {
  866. PJ_LOG(4, (THIS_FILE, "Cannot find %.*s decoder in ffmpeg library",
  867. (int)desc->info.encoding_name.slen,
  868. desc->info.encoding_name.ptr));
  869. }
  870. }
  871. /* Register codec factory to codec manager. */
  872. status = pjmedia_vid_codec_mgr_register_factory(mgr,
  873. &ffmpeg_factory.base);
  874. if (status != PJ_SUCCESS)
  875. goto on_error;
  876. ffmpeg_factory.pool = pool;
  877. /* Done. */
  878. return PJ_SUCCESS;
  879. on_error:
  880. pj_pool_release(pool);
  881. return status;
  882. }
  883. /*
  884. * Unregister FFMPEG codecs factory from pjmedia endpoint.
  885. */
  886. PJ_DEF(pj_status_t) pjmedia_codec_ffmpeg_vid_deinit(void)
  887. {
  888. pj_status_t status = PJ_SUCCESS;
  889. if (ffmpeg_factory.pool == NULL) {
  890. /* Already deinitialized */
  891. return PJ_SUCCESS;
  892. }
  893. pj_mutex_lock(ffmpeg_factory.mutex);
  894. /* Unregister FFMPEG codecs factory. */
  895. status = pjmedia_vid_codec_mgr_unregister_factory(ffmpeg_factory.mgr,
  896. &ffmpeg_factory.base);
  897. /* Destroy mutex. */
  898. pj_mutex_unlock(ffmpeg_factory.mutex);
  899. pj_mutex_destroy(ffmpeg_factory.mutex);
  900. ffmpeg_factory.mutex = NULL;
  901. /* Destroy pool. */
  902. pj_pool_release(ffmpeg_factory.pool);
  903. ffmpeg_factory.pool = NULL;
  904. pjmedia_ffmpeg_dec_ref();
  905. return status;
  906. }
  907. /*
  908. * Check if factory can allocate the specified codec.
  909. */
  910. static pj_status_t ffmpeg_test_alloc( pjmedia_vid_codec_factory *factory,
  911. const pjmedia_vid_codec_info *info )
  912. {
  913. const ffmpeg_codec_desc *desc;
  914. PJ_ASSERT_RETURN(factory==&ffmpeg_factory.base, PJ_EINVAL);
  915. PJ_ASSERT_RETURN(info, PJ_EINVAL);
  916. desc = find_codec_desc_by_info(info);
  917. if (!desc) {
  918. return PJMEDIA_CODEC_EUNSUP;
  919. }
  920. return PJ_SUCCESS;
  921. }
  922. /*
  923. * Generate default attribute.
  924. */
  925. static pj_status_t ffmpeg_default_attr( pjmedia_vid_codec_factory *factory,
  926. const pjmedia_vid_codec_info *info,
  927. pjmedia_vid_codec_param *attr )
  928. {
  929. const ffmpeg_codec_desc *desc;
  930. unsigned i;
  931. PJ_ASSERT_RETURN(factory==&ffmpeg_factory.base, PJ_EINVAL);
  932. PJ_ASSERT_RETURN(info && attr, PJ_EINVAL);
  933. desc = find_codec_desc_by_info(info);
  934. if (!desc) {
  935. return PJMEDIA_CODEC_EUNSUP;
  936. }
  937. pj_bzero(attr, sizeof(pjmedia_vid_codec_param));
  938. /* Scan the requested packings and use the lowest number */
  939. attr->packing = 0;
  940. for (i=0; i<15; ++i) {
  941. unsigned packing = (1 << i);
  942. if ((desc->info.packings & info->packings) & packing) {
  943. attr->packing = (pjmedia_vid_packing)packing;
  944. break;
  945. }
  946. }
  947. if (attr->packing == 0) {
  948. /* No supported packing in info */
  949. return PJMEDIA_CODEC_EUNSUP;
  950. }
  951. /* Direction */
  952. attr->dir = desc->info.dir;
  953. /* Encoded format */
  954. pjmedia_format_init_video(&attr->enc_fmt, desc->info.fmt_id,
  955. desc->size.w, desc->size.h,
  956. desc->fps.num, desc->fps.denum);
  957. /* Decoded format */
  958. pjmedia_format_init_video(&attr->dec_fmt, desc->info.dec_fmt_id[0],
  959. desc->size.w, desc->size.h,
  960. desc->fps.num, desc->fps.denum);
  961. /* Decoding fmtp */
  962. attr->dec_fmtp = desc->dec_fmtp;
  963. /* Bitrate */
  964. attr->enc_fmt.det.vid.avg_bps = desc->avg_bps;
  965. attr->enc_fmt.det.vid.max_bps = desc->max_bps;
  966. /* Encoding MTU */
  967. attr->enc_mtu = PJMEDIA_MAX_VID_PAYLOAD_SIZE;
  968. return PJ_SUCCESS;
  969. }
  970. /*
  971. * Enum codecs supported by this factory.
  972. */
  973. static pj_status_t ffmpeg_enum_codecs( pjmedia_vid_codec_factory *factory,
  974. unsigned *count,
  975. pjmedia_vid_codec_info codecs[])
  976. {
  977. unsigned i, max_cnt;
  978. PJ_ASSERT_RETURN(codecs && *count > 0, PJ_EINVAL);
  979. PJ_ASSERT_RETURN(factory == &ffmpeg_factory.base, PJ_EINVAL);
  980. max_cnt = PJ_MIN(*count, PJ_ARRAY_SIZE(codec_desc));
  981. *count = 0;
  982. for (i=0; i<max_cnt; ++i) {
  983. if (codec_desc[i].enabled) {
  984. pj_memcpy(&codecs[*count], &codec_desc[i].info,
  985. sizeof(pjmedia_vid_codec_info));
  986. (*count)++;
  987. }
  988. }
  989. return PJ_SUCCESS;
  990. }
  991. /*
  992. * Allocate a new codec instance.
  993. */
  994. static pj_status_t ffmpeg_alloc_codec( pjmedia_vid_codec_factory *factory,
  995. const pjmedia_vid_codec_info *info,
  996. pjmedia_vid_codec **p_codec)
  997. {
  998. ffmpeg_private *ff;
  999. const ffmpeg_codec_desc *desc;
  1000. pjmedia_vid_codec *codec;
  1001. pj_pool_t *pool = NULL;
  1002. pj_status_t status = PJ_SUCCESS;
  1003. PJ_ASSERT_RETURN(factory && info && p_codec, PJ_EINVAL);
  1004. PJ_ASSERT_RETURN(factory == &ffmpeg_factory.base, PJ_EINVAL);
  1005. desc = find_codec_desc_by_info(info);
  1006. if (!desc) {
  1007. return PJMEDIA_CODEC_EUNSUP;
  1008. }
  1009. /* Create pool for codec instance */
  1010. pool = pj_pool_create(ffmpeg_factory.pf, "ffmpeg codec", 512, 512, NULL);
  1011. if (!pool) {
  1012. status = PJ_ENOMEM;
  1013. goto on_error;
  1014. }
  1015. codec = PJ_POOL_ZALLOC_T(pool, pjmedia_vid_codec);
  1016. if (!codec) {
  1017. status = PJ_ENOMEM;
  1018. goto on_error;
  1019. }
  1020. codec->op = &ffmpeg_op;
  1021. codec->factory = factory;
  1022. ff = PJ_POOL_ZALLOC_T(pool, ffmpeg_private);
  1023. if (!ff) {
  1024. status = PJ_ENOMEM;
  1025. goto on_error;
  1026. }
  1027. codec->codec_data = ff;
  1028. ff->pool = pool;
  1029. ff->enc = desc->enc;
  1030. ff->dec = desc->dec;
  1031. ff->desc = desc;
  1032. *p_codec = codec;
  1033. return PJ_SUCCESS;
  1034. on_error:
  1035. if (pool)
  1036. pj_pool_release(pool);
  1037. return status;
  1038. }
  1039. /*
  1040. * Free codec.
  1041. */
  1042. static pj_status_t ffmpeg_dealloc_codec( pjmedia_vid_codec_factory *factory,
  1043. pjmedia_vid_codec *codec )
  1044. {
  1045. ffmpeg_private *ff;
  1046. pj_pool_t *pool;
  1047. PJ_ASSERT_RETURN(factory && codec, PJ_EINVAL);
  1048. PJ_ASSERT_RETURN(factory == &ffmpeg_factory.base, PJ_EINVAL);
  1049. /* Close codec, if it's not closed. */
  1050. ff = (ffmpeg_private*) codec->codec_data;
  1051. pool = ff->pool;
  1052. codec->codec_data = NULL;
  1053. pj_pool_release(pool);
  1054. return PJ_SUCCESS;
  1055. }
  1056. /*
  1057. * Init codec.
  1058. */
  1059. static pj_status_t ffmpeg_codec_init( pjmedia_vid_codec *codec,
  1060. pj_pool_t *pool )
  1061. {
  1062. PJ_UNUSED_ARG(codec);
  1063. PJ_UNUSED_ARG(pool);
  1064. return PJ_SUCCESS;
  1065. }
  1066. static void print_ffmpeg_err(int err)
  1067. {
  1068. #if LIBAVCODEC_VER_AT_LEAST(52,72)
  1069. char errbuf[512];
  1070. if (av_strerror(err, errbuf, sizeof(errbuf)) >= 0)
  1071. PJ_LOG(5, (THIS_FILE, "ffmpeg err %d: %s", err, errbuf));
  1072. #else
  1073. PJ_LOG(5, (THIS_FILE, "ffmpeg err %d", err));
  1074. #endif
  1075. }
  1076. static pj_status_t open_ffmpeg_codec(ffmpeg_private *ff,
  1077. pj_mutex_t *ff_mutex)
  1078. {
  1079. enum AVPixelFormat pix_fmt;
  1080. pjmedia_video_format_detail *vfd;
  1081. pj_bool_t enc_opened = PJ_FALSE, dec_opened = PJ_FALSE;
  1082. pj_status_t status;
  1083. /* Get decoded pixel format */
  1084. status = pjmedia_format_id_to_PixelFormat(ff->param->dec_fmt.id,
  1085. &pix_fmt);
  1086. if (status != PJ_SUCCESS)
  1087. return status;
  1088. ff->expected_dec_fmt = pix_fmt;
  1089. /* Get video format detail for shortcut access to encoded format */
  1090. vfd = pjmedia_format_get_video_format_detail(&ff->param->enc_fmt,
  1091. PJ_TRUE);
  1092. /* Allocate ffmpeg codec context */
  1093. if (ff->param->dir & PJMEDIA_DIR_ENCODING) {
  1094. #if LIBAVCODEC_VER_AT_LEAST(53,20)
  1095. ff->enc_ctx = avcodec_alloc_context3(ff->enc);
  1096. #else
  1097. ff->enc_ctx = avcodec_alloc_context();
  1098. #endif
  1099. if (ff->enc_ctx == NULL)
  1100. goto on_error;
  1101. }
  1102. if (ff->param->dir & PJMEDIA_DIR_DECODING) {
  1103. #if LIBAVCODEC_VER_AT_LEAST(53,20)
  1104. ff->dec_ctx = avcodec_alloc_context3(ff->dec);
  1105. #else
  1106. ff->dec_ctx = avcodec_alloc_context();
  1107. #endif
  1108. if (ff->dec_ctx == NULL)
  1109. goto on_error;
  1110. }
  1111. /* Init generic encoder params */
  1112. if (ff->param->dir & PJMEDIA_DIR_ENCODING) {
  1113. AVCodecContext *ctx = ff->enc_ctx;
  1114. ctx->pix_fmt = pix_fmt;
  1115. ctx->width = vfd->size.w;
  1116. ctx->height = vfd->size.h;
  1117. ctx->time_base.num = vfd->fps.denum;
  1118. ctx->time_base.den = vfd->fps.num;
  1119. if (vfd->avg_bps) {
  1120. ctx->bit_rate = vfd->avg_bps;
  1121. if (vfd->max_bps > vfd->avg_bps)
  1122. ctx->bit_rate_tolerance = vfd->max_bps - vfd->avg_bps;
  1123. }
  1124. ctx->strict_std_compliance = FF_COMPLIANCE_STRICT;
  1125. ctx->workaround_bugs = FF_BUG_AUTODETECT;
  1126. ctx->opaque = ff;
  1127. /* Set no delay, note that this may cause some codec functionals
  1128. * not working (e.g: rate control).
  1129. */
  1130. #if LIBAVCODEC_VER_AT_LEAST(52,113) && !LIBAVCODEC_VER_AT_LEAST(53,20)
  1131. ctx->rc_lookahead = 0;
  1132. #endif
  1133. }
  1134. /* Init generic decoder params */
  1135. if (ff->param->dir & PJMEDIA_DIR_DECODING) {
  1136. AVCodecContext *ctx = ff->dec_ctx;
  1137. /* Width/height may be overriden by ffmpeg after first decoding. */
  1138. ctx->width = ctx->coded_width = ff->param->dec_fmt.det.vid.size.w;
  1139. ctx->height = ctx->coded_height = ff->param->dec_fmt.det.vid.size.h;
  1140. ctx->strict_std_compliance = FF_COMPLIANCE_EXPERIMENTAL;
  1141. ctx->workaround_bugs = FF_BUG_AUTODETECT;
  1142. ctx->opaque = ff;
  1143. }
  1144. /* Override generic params or apply specific params before opening
  1145. * the codec.
  1146. */
  1147. if (ff->desc->preopen) {
  1148. status = (*ff->desc->preopen)(ff);
  1149. if (status != PJ_SUCCESS)
  1150. goto on_error;
  1151. }
  1152. /* Open encoder */
  1153. if (ff->param->dir & PJMEDIA_DIR_ENCODING) {
  1154. int err;
  1155. pj_mutex_lock(ff_mutex);
  1156. err = AVCODEC_OPEN(ff->enc_ctx, ff->enc);
  1157. pj_mutex_unlock(ff_mutex);
  1158. if (err < 0) {
  1159. print_ffmpeg_err(err);
  1160. status = PJMEDIA_CODEC_EFAILED;
  1161. goto on_error;
  1162. }
  1163. enc_opened = PJ_TRUE;
  1164. }
  1165. /* Open decoder */
  1166. if (ff->param->dir & PJMEDIA_DIR_DECODING) {
  1167. int err;
  1168. pj_mutex_lock(ff_mutex);
  1169. err = AVCODEC_OPEN(ff->dec_ctx, ff->dec);
  1170. pj_mutex_unlock(ff_mutex);
  1171. if (err < 0) {
  1172. print_ffmpeg_err(err);
  1173. status = PJMEDIA_CODEC_EFAILED;
  1174. goto on_error;
  1175. }
  1176. dec_opened = PJ_TRUE;
  1177. }
  1178. /* Let the codec apply specific params after the codec opened */
  1179. if (ff->desc->postopen) {
  1180. status = (*ff->desc->postopen)(ff);
  1181. if (status != PJ_SUCCESS)
  1182. goto on_error;
  1183. }
  1184. return PJ_SUCCESS;
  1185. on_error:
  1186. if (ff->enc_ctx) {
  1187. if (enc_opened)
  1188. avcodec_close(ff->enc_ctx);
  1189. av_free(ff->enc_ctx);
  1190. ff->enc_ctx = NULL;
  1191. }
  1192. if (ff->dec_ctx) {
  1193. if (dec_opened)
  1194. avcodec_close(ff->dec_ctx);
  1195. av_free(ff->dec_ctx);
  1196. ff->dec_ctx = NULL;
  1197. }
  1198. return status;
  1199. }
  1200. /*
  1201. * Open codec.
  1202. */
  1203. static pj_status_t ffmpeg_codec_open( pjmedia_vid_codec *codec,
  1204. pjmedia_vid_codec_param *attr )
  1205. {
  1206. ffmpeg_private *ff;
  1207. pj_status_t status;
  1208. pj_mutex_t *ff_mutex;
  1209. PJ_ASSERT_RETURN(codec && attr, PJ_EINVAL);
  1210. ff = (ffmpeg_private*)codec->codec_data;
  1211. ff->param = pjmedia_vid_codec_param_clone(ff->pool, attr);
  1212. /* Normalize encoding MTU in codec param */
  1213. if (ff->param->enc_mtu > PJMEDIA_MAX_VID_PAYLOAD_SIZE)
  1214. ff->param->enc_mtu = PJMEDIA_MAX_VID_PAYLOAD_SIZE;
  1215. /* Open the codec */
  1216. ff_mutex = ((struct ffmpeg_factory*)codec->factory)->mutex;
  1217. status = open_ffmpeg_codec(ff, ff_mutex);
  1218. if (status != PJ_SUCCESS)
  1219. goto on_error;
  1220. /* Init format info and apply-param of decoder */
  1221. ff->dec_vfi = pjmedia_get_video_format_info(NULL, ff->param->dec_fmt.id);
  1222. if (!ff->dec_vfi) {
  1223. status = PJ_EINVAL;
  1224. goto on_error;
  1225. }
  1226. pj_bzero(&ff->dec_vafp, sizeof(ff->dec_vafp));
  1227. ff->dec_vafp.size = ff->param->dec_fmt.det.vid.size;
  1228. ff->dec_vafp.buffer = NULL;
  1229. status = (*ff->dec_vfi->apply_fmt)(ff->dec_vfi, &ff->dec_vafp);
  1230. if (status != PJ_SUCCESS) {
  1231. goto on_error;
  1232. }
  1233. /* Init format info and apply-param of encoder */
  1234. ff->enc_vfi = pjmedia_get_video_format_info(NULL, ff->param->dec_fmt.id);
  1235. if (!ff->enc_vfi) {
  1236. status = PJ_EINVAL;
  1237. goto on_error;
  1238. }
  1239. pj_bzero(&ff->enc_vafp, sizeof(ff->enc_vafp));
  1240. ff->enc_vafp.size = ff->param->enc_fmt.det.vid.size;
  1241. ff->enc_vafp.buffer = NULL;
  1242. status = (*ff->enc_vfi->apply_fmt)(ff->enc_vfi, &ff->enc_vafp);
  1243. if (status != PJ_SUCCESS) {
  1244. goto on_error;
  1245. }
  1246. /* Alloc buffers if needed */
  1247. ff->whole = (ff->param->packing == PJMEDIA_VID_PACKING_WHOLE);
  1248. if (!ff->whole) {
  1249. ff->enc_buf_size = (unsigned)ff->enc_vafp.framebytes;
  1250. ff->enc_buf = pj_pool_alloc(ff->pool, ff->enc_buf_size);
  1251. ff->dec_buf_size = PJ_MAX((unsigned)ff->dec_vafp.framebytes, ff->dec_buf_size);
  1252. ff->dec_buf = pj_pool_alloc(ff->pool, ff->dec_buf_size);
  1253. }
  1254. /* Update codec attributes, e.g: encoding format may be changed by
  1255. * SDP fmtp negotiation.
  1256. */
  1257. pj_memcpy(attr, ff->param, sizeof(*attr));
  1258. return PJ_SUCCESS;
  1259. on_error:
  1260. ffmpeg_codec_close(codec);
  1261. return status;
  1262. }
  1263. /*
  1264. * Close codec.
  1265. */
  1266. static pj_status_t ffmpeg_codec_close( pjmedia_vid_codec *codec )
  1267. {
  1268. ffmpeg_private *ff;
  1269. pj_mutex_t *ff_mutex;
  1270. PJ_ASSERT_RETURN(codec, PJ_EINVAL);
  1271. ff = (ffmpeg_private*)codec->codec_data;
  1272. ff_mutex = ((struct ffmpeg_factory*)codec->factory)->mutex;
  1273. pj_mutex_lock(ff_mutex);
  1274. if (ff->enc_ctx) {
  1275. avcodec_close(ff->enc_ctx);
  1276. av_free(ff->enc_ctx);
  1277. }
  1278. if (ff->dec_ctx && ff->dec_ctx!=ff->enc_ctx) {
  1279. avcodec_close(ff->dec_ctx);
  1280. av_free(ff->dec_ctx);
  1281. }
  1282. ff->enc_ctx = NULL;
  1283. ff->dec_ctx = NULL;
  1284. pj_mutex_unlock(ff_mutex);
  1285. return PJ_SUCCESS;
  1286. }
  1287. /*
  1288. * Modify codec settings.
  1289. */
  1290. static pj_status_t ffmpeg_codec_modify( pjmedia_vid_codec *codec,
  1291. const pjmedia_vid_codec_param *attr)
  1292. {
  1293. ffmpeg_private *ff = (ffmpeg_private*)codec->codec_data;
  1294. PJ_UNUSED_ARG(attr);
  1295. PJ_UNUSED_ARG(ff);
  1296. return PJ_ENOTSUP;
  1297. }
  1298. static pj_status_t ffmpeg_codec_get_param(pjmedia_vid_codec *codec,
  1299. pjmedia_vid_codec_param *param)
  1300. {
  1301. ffmpeg_private *ff;
  1302. PJ_ASSERT_RETURN(codec && param, PJ_EINVAL);
  1303. ff = (ffmpeg_private*)codec->codec_data;
  1304. pj_memcpy(param, ff->param, sizeof(*param));
  1305. return PJ_SUCCESS;
  1306. }
  1307. static pj_status_t ffmpeg_packetize ( pjmedia_vid_codec *codec,
  1308. pj_uint8_t *bits,
  1309. pj_size_t bits_len,
  1310. unsigned *bits_pos,
  1311. pj_uint8_t *payload,
  1312. pj_size_t *payload_len,
  1313. pj_bool_t is_keyframe)
  1314. {
  1315. ffmpeg_private *ff = (ffmpeg_private*)codec->codec_data;
  1316. if (ff->desc->packetize) {
  1317. return (*ff->desc->packetize)(ff, bits, bits_len, bits_pos,
  1318. payload, payload_len, is_keyframe);
  1319. }
  1320. return PJ_ENOTSUP;
  1321. }
  1322. static pj_status_t ffmpeg_unpacketize(pjmedia_vid_codec *codec,
  1323. const pj_uint8_t *payload,
  1324. pj_size_t payload_len,
  1325. pj_uint8_t *bits,
  1326. pj_size_t bits_len,
  1327. unsigned *bits_pos)
  1328. {
  1329. ffmpeg_private *ff = (ffmpeg_private*)codec->codec_data;
  1330. if (ff->desc->unpacketize) {
  1331. return (*ff->desc->unpacketize)(ff, payload, payload_len,
  1332. bits, bits_len, bits_pos);
  1333. }
  1334. return PJ_ENOTSUP;
  1335. }
  1336. /*
  1337. * Encode frames.
  1338. */
  1339. static pj_status_t ffmpeg_codec_encode_whole(pjmedia_vid_codec *codec,
  1340. const pjmedia_vid_encode_opt *opt,
  1341. const pjmedia_frame *input,
  1342. unsigned output_buf_len,
  1343. pjmedia_frame *output)
  1344. {
  1345. ffmpeg_private *ff = (ffmpeg_private*)codec->codec_data;
  1346. pj_uint8_t *p = (pj_uint8_t*)input->buf;
  1347. AVFrame avframe;
  1348. AVPacket avpacket;
  1349. int err, got_packet;
  1350. //AVRational src_timebase;
  1351. /* For some reasons (e.g: SSE/MMX usage), the avcodec_encode_video() must
  1352. * have stack aligned to 16 bytes. Let's try to be safe by preparing the
  1353. * 16-bytes aligned stack here, in case it's not managed by the ffmpeg.
  1354. */
  1355. PJ_ALIGN_DATA(pj_uint32_t i[4], 16);
  1356. if ((long)(pj_ssize_t)i & 0xF) {
  1357. PJ_LOG(2,(THIS_FILE, "Stack alignment fails"));
  1358. }
  1359. /* Check if encoder has been opened */
  1360. PJ_ASSERT_RETURN(ff->enc_ctx, PJ_EINVALIDOP);
  1361. #ifdef PJMEDIA_USE_OLD_FFMPEG
  1362. avcodec_get_frame_defaults(&avframe);
  1363. #else
  1364. pj_bzero(&avframe, sizeof(avframe));
  1365. av_frame_unref(&avframe);
  1366. #endif
  1367. // Let ffmpeg manage the timestamps
  1368. /*
  1369. src_timebase.num = 1;
  1370. src_timebase.den = ff->desc->info.clock_rate;
  1371. avframe.pts = av_rescale_q(input->timestamp.u64, src_timebase,
  1372. ff->enc_ctx->time_base);
  1373. */
  1374. for (i[0] = 0; i[0] < ff->enc_vfi->plane_cnt; ++i[0]) {
  1375. avframe.data[i[0]] = p;
  1376. avframe.linesize[i[0]] = ff->enc_vafp.strides[i[0]];
  1377. p += ff->enc_vafp.plane_bytes[i[0]];
  1378. }
  1379. #if LIBAVCODEC_VER_AT_LEAST(58,134)
  1380. avframe.height = ff->enc_ctx->height;
  1381. avframe.width = ff->enc_ctx->width;
  1382. avframe.format = ff->enc_ctx->pix_fmt;
  1383. #endif
  1384. /* Force keyframe */
  1385. if (opt && opt->force_keyframe) {
  1386. #if LIBAVCODEC_VER_AT_LEAST(53,20)
  1387. avframe.pict_type = AV_PICTURE_TYPE_I;
  1388. #else
  1389. avframe.pict_type = FF_I_TYPE;
  1390. #endif
  1391. }
  1392. av_init_packet(&avpacket);
  1393. avpacket.data = (pj_uint8_t*)output->buf;
  1394. avpacket.size = output_buf_len;
  1395. #if LIBAVCODEC_VER_AT_LEAST(58,137)
  1396. PJ_UNUSED_ARG(got_packet);
  1397. err = avcodec_send_frame(ff->enc_ctx, &avframe);
  1398. if (err >= 0) {
  1399. AVPacket *pkt = NULL;
  1400. pj_uint8_t *bits_out = (pj_uint8_t*) output->buf;
  1401. unsigned out_size = 0;
  1402. pkt = av_packet_alloc();
  1403. if (pkt) {
  1404. while (err >= 0) {
  1405. err = avcodec_receive_packet(ff->enc_ctx, pkt);
  1406. if (err == AVERROR(EAGAIN) || err == AVERROR_EOF) {
  1407. err = out_size;
  1408. break;
  1409. }
  1410. if (err >= 0) {
  1411. pj_memcpy(bits_out, pkt->data, pkt->size);
  1412. bits_out += pkt->size;
  1413. out_size += pkt->size;
  1414. av_packet_unref(&avpacket);
  1415. }
  1416. }
  1417. av_packet_free(&pkt);
  1418. }
  1419. }
  1420. #elif LIBAVCODEC_VER_AT_LEAST(54,15)
  1421. err = avcodec_encode_video2(ff->enc_ctx, &avpacket, &avframe, &got_packet);
  1422. if (!err && got_packet)
  1423. err = avpacket.size;
  1424. #else
  1425. PJ_UNUSED_ARG(got_packet);
  1426. err = avcodec_encode_video(ff->enc_ctx, avpacket.data, avpacket.size, &avframe);
  1427. #endif
  1428. if (err < 0) {
  1429. print_ffmpeg_err(err);
  1430. return PJMEDIA_CODEC_EFAILED;
  1431. } else {
  1432. pj_bool_t has_key_frame = PJ_FALSE;
  1433. output->size = err;
  1434. output->bit_info = 0;
  1435. #if LIBAVCODEC_VER_AT_LEAST(54,15)
  1436. has_key_frame = (avpacket.flags & AV_PKT_FLAG_KEY);
  1437. #else
  1438. has_key_frame = ff->enc_ctx->coded_frame->key_frame;
  1439. #endif
  1440. if (has_key_frame)
  1441. output->bit_info |= PJMEDIA_VID_FRM_KEYFRAME;
  1442. }
  1443. return PJ_SUCCESS;
  1444. }
  1445. static pj_status_t ffmpeg_codec_encode_begin(pjmedia_vid_codec *codec,
  1446. const pjmedia_vid_encode_opt *opt,
  1447. const pjmedia_frame *input,
  1448. unsigned out_size,
  1449. pjmedia_frame *output,
  1450. pj_bool_t *has_more)
  1451. {
  1452. ffmpeg_private *ff = (ffmpeg_private*)codec->codec_data;
  1453. pj_status_t status;
  1454. *has_more = PJ_FALSE;
  1455. if (ff->whole) {
  1456. status = ffmpeg_codec_encode_whole(codec, opt, input, out_size, output);
  1457. } else {
  1458. pjmedia_frame whole_frm;
  1459. pj_bzero(&whole_frm, sizeof(whole_frm));
  1460. whole_frm.buf = ff->enc_buf;
  1461. whole_frm.size = ff->enc_buf_size;
  1462. status = ffmpeg_codec_encode_whole(codec, opt, input,
  1463. (unsigned)whole_frm.size,
  1464. &whole_frm);
  1465. if (status != PJ_SUCCESS)
  1466. return status;
  1467. ff->enc_buf_is_keyframe = (whole_frm.bit_info &
  1468. PJMEDIA_VID_FRM_KEYFRAME);
  1469. ff->enc_frame_len = (unsigned)whole_frm.size;
  1470. ff->enc_processed = 0;
  1471. status = ffmpeg_codec_encode_more(codec, out_size, output, has_more);
  1472. }
  1473. return status;
  1474. }
  1475. static pj_status_t ffmpeg_codec_encode_more(pjmedia_vid_codec *codec,
  1476. unsigned out_size,
  1477. pjmedia_frame *output,
  1478. pj_bool_t *has_more)
  1479. {
  1480. ffmpeg_private *ff = (ffmpeg_private*)codec->codec_data;
  1481. pj_uint8_t *payload = (pj_uint8_t *)output->buf;
  1482. pj_size_t payload_len = (pj_size_t) out_size;
  1483. pj_status_t status;
  1484. *has_more = PJ_FALSE;
  1485. if (ff->enc_processed >= ff->enc_frame_len) {
  1486. /* No more frame */
  1487. return PJ_EEOF;
  1488. }
  1489. status = ffmpeg_packetize(codec, (pj_uint8_t*)ff->enc_buf,
  1490. ff->enc_frame_len, &ff->enc_processed,
  1491. payload, &payload_len, ff->enc_buf_is_keyframe);
  1492. if (status != PJ_SUCCESS)
  1493. return status;
  1494. output->type = PJMEDIA_FRAME_TYPE_VIDEO;
  1495. output->size = payload_len;
  1496. if (ff->enc_buf_is_keyframe)
  1497. output->bit_info |= PJMEDIA_VID_FRM_KEYFRAME;
  1498. *has_more = (ff->enc_processed < ff->enc_frame_len);
  1499. return PJ_SUCCESS;
  1500. }
  1501. static pj_status_t check_decode_result(pjmedia_vid_codec *codec,
  1502. const pj_timestamp *ts,
  1503. pj_bool_t got_keyframe)
  1504. {
  1505. ffmpeg_private *ff = (ffmpeg_private*)codec->codec_data;
  1506. pjmedia_video_apply_fmt_param *vafp = &ff->dec_vafp;
  1507. pjmedia_event event;
  1508. /* Check for format change.
  1509. * Decoder output format is set by libavcodec, in case it is different
  1510. * to the configured param.
  1511. */
  1512. if (ff->dec_ctx->pix_fmt != ff->expected_dec_fmt ||
  1513. ff->dec_ctx->width != (int)vafp->size.w ||
  1514. ff->dec_ctx->height != (int)vafp->size.h)
  1515. {
  1516. pjmedia_format_id new_fmt_id;
  1517. pj_status_t status;
  1518. /* Get current raw format id from ffmpeg decoder context */
  1519. status = PixelFormat_to_pjmedia_format_id(ff->dec_ctx->pix_fmt,
  1520. &new_fmt_id);
  1521. if (status != PJ_SUCCESS)
  1522. return status;
  1523. /* Update decoder format in param */
  1524. ff->param->dec_fmt.id = new_fmt_id;
  1525. ff->param->dec_fmt.det.vid.size.w = ff->dec_ctx->width;
  1526. ff->param->dec_fmt.det.vid.size.h = ff->dec_ctx->height;
  1527. ff->expected_dec_fmt = ff->dec_ctx->pix_fmt;
  1528. /* Re-init format info and apply-param of decoder */
  1529. ff->dec_vfi = pjmedia_get_video_format_info(NULL, ff->param->dec_fmt.id);
  1530. if (!ff->dec_vfi)
  1531. return PJ_ENOTSUP;
  1532. pj_bzero(&ff->dec_vafp, sizeof(ff->dec_vafp));
  1533. ff->dec_vafp.size = ff->param->dec_fmt.det.vid.size;
  1534. ff->dec_vafp.buffer = NULL;
  1535. status = (*ff->dec_vfi->apply_fmt)(ff->dec_vfi, &ff->dec_vafp);
  1536. if (status != PJ_SUCCESS)
  1537. return status;
  1538. /* Realloc buffer if necessary */
  1539. if (ff->dec_vafp.framebytes > ff->dec_buf_size) {
  1540. PJ_LOG(5,(THIS_FILE, "Reallocating decoding buffer %u --> %u",
  1541. (unsigned)ff->dec_buf_size,
  1542. (unsigned)ff->dec_vafp.framebytes));
  1543. ff->dec_buf_size = (unsigned)ff->dec_vafp.framebytes;
  1544. ff->dec_buf = pj_pool_alloc(ff->pool, ff->dec_buf_size);
  1545. }
  1546. /* Broadcast format changed event */
  1547. pjmedia_event_init(&event, PJMEDIA_EVENT_FMT_CHANGED, ts, codec);
  1548. event.data.fmt_changed.dir = PJMEDIA_DIR_DECODING;
  1549. pj_memcpy(&event.data.fmt_changed.new_fmt, &ff->param->dec_fmt,
  1550. sizeof(ff->param->dec_fmt));
  1551. pjmedia_event_publish(NULL, codec, &event, 0);
  1552. }
  1553. /* Check for missing/found keyframe */
  1554. if (got_keyframe) {
  1555. pj_get_timestamp(&ff->last_dec_keyframe_ts);
  1556. /* Broadcast keyframe event */
  1557. pjmedia_event_init(&event, PJMEDIA_EVENT_KEYFRAME_FOUND, ts, codec);
  1558. pjmedia_event_publish(NULL, codec, &event, 0);
  1559. } else if (ff->last_dec_keyframe_ts.u64 == 0) {
  1560. /* Broadcast missing keyframe event */
  1561. pjmedia_event_init(&event, PJMEDIA_EVENT_KEYFRAME_MISSING, ts, codec);
  1562. pjmedia_event_publish(NULL, codec, &event, 0);
  1563. }
  1564. return PJ_SUCCESS;
  1565. }
  1566. /*
  1567. * Unreference AVFrame.
  1568. */
  1569. static void ffmpeg_frame_unref(AVFrame *frame)
  1570. {
  1571. #ifdef PJMEDIA_USE_OLD_FFMPEG
  1572. (void)frame;
  1573. #else
  1574. av_frame_unref(frame);
  1575. #endif
  1576. }
  1577. /*
  1578. * Decode frame.
  1579. */
  1580. static pj_status_t ffmpeg_codec_decode_whole(pjmedia_vid_codec *codec,
  1581. const pjmedia_frame *input,
  1582. unsigned output_buf_len,
  1583. pjmedia_frame *output)
  1584. {
  1585. ffmpeg_private *ff = (ffmpeg_private*)codec->codec_data;
  1586. AVFrame avframe;
  1587. AVPacket avpacket;
  1588. int err, got_picture;
  1589. /* Check if decoder has been opened */
  1590. PJ_ASSERT_RETURN(ff->dec_ctx, PJ_EINVALIDOP);
  1591. /* Reset output frame bit info */
  1592. output->bit_info = 0;
  1593. /* Validate output buffer size */
  1594. // Do this validation later after getting decoding result, where the real
  1595. // decoded size will be assured.
  1596. //if (ff->dec_vafp.framebytes > output_buf_len)
  1597. //return PJ_ETOOSMALL;
  1598. /* Init frame to receive the decoded data, the ffmpeg codec context will
  1599. * automatically provide the decoded buffer (single buffer used for the
  1600. * whole decoding session, and seems to be freed when the codec context
  1601. * closed).
  1602. */
  1603. #ifdef PJMEDIA_USE_OLD_FFMPEG
  1604. avcodec_get_frame_defaults(&avframe);
  1605. #else
  1606. pj_bzero(&avframe, sizeof(avframe));
  1607. av_frame_unref(&avframe);
  1608. #endif
  1609. /* Init packet, the container of the encoded data */
  1610. av_init_packet(&avpacket);
  1611. avpacket.data = (pj_uint8_t*)input->buf;
  1612. avpacket.size = (int)input->size;
  1613. /* ffmpeg warns:
  1614. * - input buffer padding, at least FF_INPUT_BUFFER_PADDING_SIZE
  1615. * - null terminated
  1616. * Normally, encoded buffer is allocated more than needed, so lets just
  1617. * bzero the input buffer end/pad, hope it will be just fine.
  1618. */
  1619. #if LIBAVCODEC_VER_AT_LEAST(56,35)
  1620. /* 2015-07-27 - lavc 56.56.100 / 56.35.0 - avcodec.h
  1621. * 29d147c / 059a9348
  1622. * - Rename FF_INPUT_BUFFER_PADDING_SIZE and FF_MIN_BUFFER_SIZE
  1623. * to AV_INPUT_BUFFER_PADDING_SIZE and AV_INPUT_BUFFER_MIN_SIZE.
  1624. */
  1625. pj_bzero(avpacket.data+avpacket.size, AV_INPUT_BUFFER_PADDING_SIZE);
  1626. #else
  1627. pj_bzero(avpacket.data+avpacket.size, FF_INPUT_BUFFER_PADDING_SIZE);
  1628. #endif
  1629. output->bit_info = 0;
  1630. output->timestamp = input->timestamp;
  1631. #if LIBAVCODEC_VER_AT_LEAST(52,72)
  1632. //avpacket.flags = AV_PKT_FLAG_KEY;
  1633. #else
  1634. avpacket.flags = 0;
  1635. #endif
  1636. #if LIBAVCODEC_VER_AT_LEAST(58,137)
  1637. err = avcodec_send_packet(ff->dec_ctx, &avpacket);
  1638. if (err >= 0) {
  1639. err = avcodec_receive_frame(ff->dec_ctx, &avframe);
  1640. if (err == AVERROR_EOF)
  1641. err = 0;
  1642. if (err >= 0) {
  1643. got_picture = PJ_TRUE;
  1644. }
  1645. }
  1646. #elif LIBAVCODEC_VER_AT_LEAST(52,72)
  1647. err = avcodec_decode_video2(ff->dec_ctx, &avframe,
  1648. &got_picture, &avpacket);
  1649. #else
  1650. err = avcodec_decode_video(ff->dec_ctx, &avframe,
  1651. &got_picture, avpacket.data, avpacket.size);
  1652. #endif
  1653. if (err < 0) {
  1654. pjmedia_event event;
  1655. output->type = PJMEDIA_FRAME_TYPE_NONE;
  1656. output->size = 0;
  1657. print_ffmpeg_err(err);
  1658. /* Broadcast missing keyframe event */
  1659. pjmedia_event_init(&event, PJMEDIA_EVENT_KEYFRAME_MISSING,
  1660. &input->timestamp, codec);
  1661. pjmedia_event_publish(NULL, codec, &event, 0);
  1662. return PJMEDIA_CODEC_EBADBITSTREAM;
  1663. } else if (got_picture) {
  1664. pjmedia_video_apply_fmt_param *vafp = &ff->dec_vafp;
  1665. pj_uint8_t *q = (pj_uint8_t*)output->buf;
  1666. unsigned i;
  1667. pj_status_t status;
  1668. /* Check decoding result, e.g: see if the format got changed,
  1669. * keyframe found/missing.
  1670. */
  1671. status = check_decode_result(codec, &input->timestamp,
  1672. avframe.key_frame);
  1673. if (status != PJ_SUCCESS) {
  1674. ffmpeg_frame_unref(&avframe);
  1675. return status;
  1676. }
  1677. /* Check provided buffer size */
  1678. if (vafp->framebytes > output_buf_len) {
  1679. ffmpeg_frame_unref(&avframe);
  1680. return PJ_ETOOSMALL;
  1681. }
  1682. /* Get the decoded data */
  1683. for (i = 0; i < ff->dec_vfi->plane_cnt; ++i) {
  1684. pj_uint8_t *p = avframe.data[i];
  1685. /* The decoded data may contain padding */
  1686. if (avframe.linesize[i]!=vafp->strides[i]) {
  1687. /* Padding exists, copy line by line */
  1688. pj_uint8_t *q_end;
  1689. q_end = q+vafp->plane_bytes[i];
  1690. while(q < q_end) {
  1691. pj_memcpy(q, p, vafp->strides[i]);
  1692. q += vafp->strides[i];
  1693. p += avframe.linesize[i];
  1694. }
  1695. } else {
  1696. /* No padding, copy the whole plane */
  1697. pj_memcpy(q, p, vafp->plane_bytes[i]);
  1698. q += vafp->plane_bytes[i];
  1699. }
  1700. }
  1701. output->type = PJMEDIA_FRAME_TYPE_VIDEO;
  1702. output->size = vafp->framebytes;
  1703. ffmpeg_frame_unref(&avframe);
  1704. } else {
  1705. output->type = PJMEDIA_FRAME_TYPE_NONE;
  1706. output->size = 0;
  1707. }
  1708. return PJ_SUCCESS;
  1709. }
  1710. static pj_status_t ffmpeg_codec_decode( pjmedia_vid_codec *codec,
  1711. pj_size_t pkt_count,
  1712. pjmedia_frame packets[],
  1713. unsigned out_size,
  1714. pjmedia_frame *output)
  1715. {
  1716. ffmpeg_private *ff = (ffmpeg_private*)codec->codec_data;
  1717. pj_status_t status;
  1718. PJ_ASSERT_RETURN(codec && pkt_count > 0 && packets && output,
  1719. PJ_EINVAL);
  1720. if (ff->whole) {
  1721. pj_assert(pkt_count==1);
  1722. return ffmpeg_codec_decode_whole(codec, &packets[0], out_size, output);
  1723. } else {
  1724. pjmedia_frame whole_frm;
  1725. unsigned whole_len = 0;
  1726. unsigned i;
  1727. for (i=0; i<pkt_count; ++i) {
  1728. if (whole_len + packets[i].size > ff->dec_buf_size) {
  1729. PJ_LOG(5,(THIS_FILE, "Decoding buffer overflow"));
  1730. break;
  1731. }
  1732. status = ffmpeg_unpacketize(codec, packets[i].buf, packets[i].size,
  1733. ff->dec_buf, ff->dec_buf_size,
  1734. &whole_len);
  1735. if (status != PJ_SUCCESS) {
  1736. PJ_PERROR(5,(THIS_FILE, status, "Unpacketize error"));
  1737. continue;
  1738. }
  1739. }
  1740. whole_frm.buf = ff->dec_buf;
  1741. whole_frm.size = whole_len;
  1742. whole_frm.timestamp = output->timestamp = packets[i].timestamp;
  1743. whole_frm.bit_info = 0;
  1744. return ffmpeg_codec_decode_whole(codec, &whole_frm, out_size, output);
  1745. }
  1746. }
  1747. #ifdef _MSC_VER
  1748. # pragma comment( lib, "avcodec.lib")
  1749. #endif
  1750. #endif /* PJMEDIA_HAS_FFMPEG_VID_CODEC */