From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by master.gitmailbox.com (Postfix) with ESMTP id 8B16043041 for ; Sun, 19 Jun 2022 00:24:50 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 8435868B366; Sun, 19 Jun 2022 03:24:47 +0300 (EEST) Received: from sonic309-26.consmr.mail.ir2.yahoo.com (sonic309-26.consmr.mail.ir2.yahoo.com [77.238.179.84]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 66DA668A484 for ; Sun, 19 Jun 2022 03:24:40 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.it; s=s2048; t=1655598279; bh=DP3F5u6iNwQ2P246rkAGSg25EEEyzgxN2A5iGTCP9sw=; h=Date:From:To:In-Reply-To:References:Subject:From:Subject:Reply-To; b=afGQvvfAUgck3Hqgm1/jex3dVcah5lsb4EezEPDjRlots32ZguWt1112ctg3B2he/O7uUYCwVndwVhmV/+/V0oeYUKI7N2pJn6e5neqadtx2svmZ8HM4wIv9/sUSgrm2a9b0vaCJhKdBVvzjoU70bYhuu1/jIk98epqmMF8hHM+QPbNM84sx41Wj5DCtjjYDccaiRfFoNH+qeQ09RaeElF1sreLIY/IJR0ZvcoEplHS/Q2SZSe3SUcVKzPfjjw5Zq1XHRXCLJFUwnuO3cRaAAgzzWYqgURpVLRJRqzj6JGMF4z/T78BRGVWgWpkPY32CPtv/0bDf6k6mNT6K0hjdKA== X-SONIC-DKIM-SIGN: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1655598279; bh=u+A1sDIG75OxQTDS323fJS+HnetZkC42KPXpMqk4JTm=; h=X-Sonic-MF:Date:From:To:Subject:From:Subject; b=WuFYmY0YiHX0oqv8tHC3CAAMQKeA7cg4zzhbYCP8E4hfGslokwqfVrtyBXEJWAEZL6AOhz4MSg+F4MjrP/b46uGAWXdWc1w/Th+YMtXmRKySToXMH9F4xwzZIdD58U/oXtDg/xS1CKSB0OtAbEN73jzJ433uLA8RWWCaQqZdMRC/C0rJQVtTMEfuUx6dNxKzrYAaPBf16AdiaDI+gZpsGbsGZAIQW8fxEqnxDdzi3RCI9xNhpCWr7LkyOB0/Nz5AfGfixsTatth+cnieK1OWmHNL2wTz1iklRNouAI1meR0ipzhMHOu3ZMHlxTWCR/qz+ZMOeRrJ8DGFJm/hssxMJQ== X-YMail-OSG: CChv.M8VM1kPuUG3v.CGheIxMXlQhAhGloihHTPbzmXHQbB2JyPIHsmQNzRGsJE eCui3VftCl9iOdi2QhTeLB.K4jgoFzmK8QHnwkGXC9pIKyt8bK4kKuv5f7p_9njgPgQkh.42OJ.h 3pfAnZsb5TczFh0TeeX0i12jzDQ2HfpcZWnOitqq0GT.Ce_D4tGYS6MDIz7PeTINBc6rPg544xFD BrJp05qC_nB1TPP6n0.9hpNW4RBJiroKEUsc_rdj3vUU3wXhzdo5OLYdAXl_kUbe4ZjhbaK_3zgo MwCt2nN8lb6qK65SeoOhRMVyQLtztqjO2w7aOYsCWBtqjN5KwtUVdczxvSMZCEQ5.Kxqlth9e53l mFXUGxyySbcoyYPmjG.vBsF3Qunkg9Z74obdmJf8mTUQVkbVZlz0aPrutCf_uXuUrL4JYxqVzkbq vPknlE7rYi.5f6MWAsL8Doa9sxYpx5pwJ73hMIW5lTX5BeNtvaqQNpGrPct7F9SAoZlYKDZlL_hx 4qvyTJ72L.desta8uTW9n8wCa1UCg2K8_FYOR3z2QbEvvV_.DLJeihVUiQsDZj1KVXb4RtBJGCAE idVMxaZd1ZaL.IGvPlu4UVWY9eR_kyN6ZRlReBCOv3q6C6r1qQItYh01a_71fV11cf_q6tdHjHgk Z2nUwEqmZhZ3LT8t__qeNeHdcZQT6m_Q97sQSa.IXYrYPswoipjGsw1sXCGfzBSP9cg8Z5BAFGQN kx4cWsF_JqkH_1yzewDf7DvYAPQJ5l7z7c42nigpxjqbAL.73pJc0LC4_h7TF5JdOnGfCZXYNno0 Q0vhyEiaDYo5uAMqLSbs7SX8iL53aUyIfDoa_sIB5Q5ww_.tsA08uWKwo0xCE2s93H0qxs_eol5g 4uf.GS7sErjBYtSoBf8.rkOLIvaJls.mTBXP0PyMw43jx1fFTWf91Z4LVpiqbH8edvMXRQeHftG1 _fP6utzmY011cvpkC.2yks5yfc61koDazT37pJjC__VSz3peuTGO0f3xReGut6kpCQpA58gqTADI V.i2KQTXfBRrr3Kgt_YiHmEb43n6UVTq6JSBFp7i6pSLvMDo5uqJKuYZfudZdiFCPteOMW3Pd8Z1 AUpHepjBeJpx93ahffTuap6Zcu2or4Fisk1G2vxP2wjranG9IR5nCEbd.eUmK.E6OZziqHxiy0p2 qJBGrGU96AwVmbUeE5FDMHxuqWGdBKcWud2DZ_7eqb_U_eUzGFB8RGHraLkWbPDzVUsFCj0nCvo6 LThlNJFnHWr79.hkkq3WCCDuLJTfrCnB0fLf4ndgXXP0aGbw_WKS1OEtgAfdOQsi.7H.O9UtFlU5 lFCdacR3xIJIhlT3yDUTeIPKes6wjb9J0KW5j6OQRW_zT.NlHroBlNeai4Lx0EvgPC71Xlrsa9sF iVmhMBwdsw.nXEKyrGY4zWr8dYi.eteBsM7LDny9CIswN2IX3qqRNkj6KiNyX6kvMNVIwJU0xw5w VqwSk.JmLq5tvRsePrHVoUC754uWfo6ycBUlDx.eqLUzPpU6rRaDiG6muxzMW3ir4OFZBg3Rvnbq FCabzaFgODkLMIfRI.fCbsWbXoPeLUNkozuAFyV_5SMSVuOKJ9W9TpnxS3U5vQqhnbBpGT4dOzeT ShAMSPTpj_nqafvzfCbbXLGjeGCpNCd5kkYKILv1Bpq89AdEFzfX0s.pDc6RurgNwJgxalmPlmLS WqhYSRKcL57tS.m0.PH5XBnyBMe4BeAczNYn2Q6OlX8HRxdNoy7andOUjNAUqwWE7yRGMtZXWI2j Z4V3k2_4gdqes_zoZxvX5SeCQR9FztGGWanAaT0GfzqZzVC6bFVrrswLnFe6EsoC2ACVnybDwNbi oQ.dNl2b8jb6QJkmLtbjAIu29qKecId3WJwmSBm0JXBcAbVd3JZzqTtzSMpFdXT8asAdA06kZgKt S8D2HS98UX6m6EeVN73tcnhqfgjghOqY0C43FRIBpVO6xKf3Pjv2reGhBPShC445O.JqJCPnc2Of xIsbrsF1sO3bUXZDTxoP4MuCeecbAjssFVCvS7nQwLFVYr6ftowSQZNKnoggkxZl6W4kfnTMUb4A sEzbbtLVqrMEeRoFta6SnDBeqXq5ttIOSMPoPzPY.LOncf1JNh32JYMdjTDSMknar.AMmrqUF.zj EvvU.4YRvvbU5f9bcn4KtUYG7wtevXZ91IzuzrIcqDGRMcGYdrEVZu0rsXqnCzM_9K9dvyzW5JEe 4zO9Dii8wSeOMLvomltMljDPEk2jRNFwd4xDD9QaEwa4kvh6DvQ-- X-Sonic-MF: Received: from sonic.gate.mail.ne1.yahoo.com by sonic309.consmr.mail.ir2.yahoo.com with HTTP; Sun, 19 Jun 2022 00:24:39 +0000 Date: Sun, 19 Jun 2022 00:25:57 +0000 (UTC) From: Paolo Prete To: "ffmpeg-devel@ffmpeg.org" Message-ID: <1013032387.9340924.1655598357193@mail.yahoo.com> In-Reply-To: <8f62739f-89a5-1be1-2f92-3db3df124a21@gmail.com> References: <122266341.9130638.1655553986479.ref@mail.yahoo.com> <122266341.9130638.1655553986479@mail.yahoo.com> <8f62739f-89a5-1be1-2f92-3db3df124a21@gmail.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_Part_9340923_218664257.1655598357190" X-Mailer: WebService/1.1.20280 YMailNorrin X-Content-Filtered-By: Mailman/MimeDel 2.1.29 Subject: Re: [FFmpeg-devel] [PATCH] doc/examples/muxing: code rewrite with improved readability and fixed issues X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Archived-At: List-Archive: List-Post: ------=_Part_9340923_218664257.1655598357190 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable =20 Il sabato 18 giugno 2022, 17:18:18 CEST, Leo Izen ha s= critto: >>On 6/18/22 08:06, Paolo Prete wrote:>> +{>> +=C2=A0 =C2=A0 if (num)>> += =C2=A0 =C2=A0 =C2=A0 =C2=A0 av_log(NULL, AV_LOG_ERROR, "%s (error '%s')\n",= s, av_err2str(*num));>> +=C2=A0 =C2=A0 else>> +=C2=A0 =C2=A0 =C2=A0 =C2=A0= av_log(NULL, AV_LOG_ERROR, "%s\n", s);> +}>This does not need to be a poin= ter. Convention is that negative values>are errors and nonnegative values a= re not. So you could always use>something like: if (num < 0). The pointer makes clearer, when I call the function, that I'm not managing = a specific error with a number id. >> -=C2=A0 =C2=A0 AVPacket *tmp_pkt;>> +=C2=A0 =C2=A0 if (type =3D=3D AVMED= IA_TYPE_AUDIO)>> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 enc_time_base =3D ((AVRationa= l *)out_fmt_ctx->opaque)[0];>> +=C2=A0 =C2=A0 else>> +=C2=A0 =C2=A0 =C2=A0 = =C2=A0 enc_time_base =3D ((AVRational *)out_fmt_ctx->opaque)[1];>>>Why are = you referencing the opaque elements of out_fmt_ctx? I pass, through the opaque element, user data to the muxer. That data (the = timebases of the audio and video encoders) will be used for rescaling ts to= themuxer timebases. Otherwise I would have to pass them through the functi= on's params, which would make the function prototype longer and less readab= le. >>>> -static int write_frame(AVFormatContext *fmt_ctx, AVCodecContext *c,>>= -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 AVStream *st, AVFrame *frame, AVPacket *pkt)>> +static int is_extension= _supported(const char *filename)>Why are you artificially limiting what is = permitted? >From what I see, not all extensions are supported without modifying the def= ault settings. In fact, as specified in the commit msg, some extensions don= 't work and the original muxing.c fails with them. >> +=C2=A0 =C2=A0 if (!(c =3D avcodec_find_encoder(id))) {>> +=C2=A0 =C2=A0= =C2=A0 =C2=A0 avformat_free_context(tmp_fctx);>> +=C2=A0 =C2=A0 =C2=A0 =C2= =A0 return ret;>You probably don't want to return "ret" here as you don't a= ssign it. ret is assigned to 0 (=3D success) at the definition of the variable. And i= n this case, the function succeeds: the returned AVCodecParameter is set wi= th AV_CODEC_ID_NONE >> -=C2=A0 =C2=A0 if (oc->oformat->flags & AVFMT_GLOBALHEADER)>> -=C2=A0 = =C2=A0 =C2=A0 =C2=A0 c->flags |=3D AV_CODEC_FLAG_GLOBAL_HEADER;>> +=C2=A0 = =C2=A0 return ret;> Again, why are you returning ret if you are not assigni= ng to it? as above, ret is assigned to 0. >> +=C2=A0 =C2=A0 codec =3D avcodec_find_encoder(params->codec_id);>> +=C2= =A0 =C2=A0 *enc_ctx =3D avcodec_alloc_context3(codec);>Don't attempt to all= ocate anything until after you check if the codec is>found. Is it really necessary?It has been already checked in the line with "if (pr= ocess_audio/video) {" and the API doxy says that a NULL parameter will only= cause that codec-specific defaults won't be initialized (so=C2=A0 it appea= rs safe to me). >> +=C2=A0 =C2=A0 if (!codec) {>> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 log_error("C= ould not allocate the encoding context", NULL);>This error message does not= match the check, which is if the codec is found.>> +=C2=A0 =C2=A0 =C2=A0 = =C2=A0 return AVERROR_EXIT;>return AVERROR_CODEC_NOT_FOUND; Instead of changing the error msg, I think that what was wrong is the check= . I fixed it withif (!(*enc_ctx =3D avcodec_alloc_context3(codec))) { >> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 (*enc_ctx)->sample_rate =3D params->sample_= rate;>> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 (*enc_ctx)->time_base=C2=A0 =3D (AVRat= ional){1, params->sample_rate};>Use av_make_q to avoid casting. Done, thanks. > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 return ret;> +=C2=A0 =C2=A0 } else> +=C2=A0 = =C2=A0 =C2=A0 =C2=A0 return 0;This violates the coding style, you need to u= se braces {} for the elseblock if you also use it for the if block. Done, thanks. > +=C2=A0 =C2=A0 if ((ret =3D av_frame_get_buffer(*frame, 0)) < 0) {> +=C2= =A0 =C2=A0 =C2=A0 =C2=A0 log_error("Could not allocate buffer for AVFrame",= &ret);> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 return AVERROR(ENOMEM);> +=C2=A0 =C2= =A0 } else> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 return 0;You don't need the else b= lock here at all. Done, thanks. >> +static int init_video_convert(struct SwsContext **ctx, AVCodecParameter= s *in_params,>> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 AVCodecParameters *out_par= ams)>> +{>This paper-thin wrapper function is unnecessary, just inline it. This is intentional: even if it's a paper-thin wrapper, it shortens the cod= e of the main() functionby making it quicker to understand that the audio/v= ideo converters are initialized with their respective AVCodecParameters. I = would wait for feedback about this from other readers, before changing the = code. > +> +=C2=A0 =C2=A0 if (!tincr) {> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 t=C2=A0 =C2= =A0 =C2=A0 =3D 0;> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 tincr=C2=A0 =3D 2 * M_PI * = 110.0 / frame->sample_rate;> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 /* increment freq= uency by 110 Hz per second */> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 tincr2=C2=A0 = =3D tincr / frame->sample_rate;What are you doing here? Why are you doing i= t?>>=C2=A0 =C2=A0 =C2=A0 }>> ->> -=C2=A0 =C2=A0 return write_frame(oc, c, o= st->st, frame, ost->tmp_pkt);>> +=C2=A0 =C2=A0 for (j =3D 0; j nb_s= amples; j++) {>> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 v =3D (int)(sin(t) * 10000);>= > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 for (i =3D 0; i < frame->ch_layout.nb_channe= ls; i++)>> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 *data++ =3D v;>> +=C2= =A0 =C2=A0 =C2=A0 =C2=A0 t=C2=A0 =C2=A0 +=3D tincr;>> +=C2=A0 =C2=A0 =C2=A0= =C2=A0 tincr +=3D tincr2;>> +=C2=A0 =C2=A0 }>> +=C2=A0 =C2=A0 frame->pts = =3D frame->nb_samples*(++frame_ctr);>If you're trying to populate a stream,= you should be using the aevalsrc>filter, which exists for exactly this pur= pose. Otherwise just populate>it with zeroes (silence).>>=C2=A0 }>>>> -/***= ***********************************************************/>> -/* video ou= tput */>> ->> -static AVFrame *alloc_picture(enum AVPixelFormat pix_fmt, in= t width, int height)>> +static void fill_dummy_yuv420p_frame(AVFrame *frame= )>>=C2=A0 {>There's a testsrc filter, or just fill a frame with zeroes (bla= ck).>Don't reinvent the wheel in an example, that discourages people from>u= sing features that exist. This is all copied from the original muxing.c example. These dummy audio/vi= deo frames consist in few lines of code and they are common in doc/example = files. See also encode-audio.c, encode-video.c. Adding a filtering context = to the current example would consequently require to patch (and maybe renam= e) the other files as well. And if you patch in that way, for example, "enc= ode-audio.c" the reader won't focus on the encoding task, because the filte= ring block of code would be somewhat distracting. >> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 }>> +=C2=A0 =C2=A0 if (ret < = 0) {>You need to check for AVERROR(EAGAIN).>> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 = av_log(NULL, AV_LOG_ERROR,>> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 "Error sending frame to the encoder (error '%s')\n", av_err2str(ret));>= > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 return ret; Is it really necessary to check AVERROR(EAGAIN) when sending the frame to t= he encoder, in this specific case?The function is written in a way that the= encoder's output is always read before sending new frames. Note that in th= e original muxing.c this is not checked as well >> -=C2=A0 =C2=A0 return write_frame(oc, ost->enc, ost->st, get_video_frame= (ost), ost->tmp_pkt);>> +=C2=A0 =C2=A0 enum AVMediaType *type =3D (enum AVM= ediaType *)(fr->opaque);>Why are you reading from the opaque structure of t= he frame. Are you sure>this is what you wanted to do? Yes, it just stores an additional info for the frame (it says if the frame = contains video or audio data), which will be used later in "frame_exceeds_s= tream_duration()" function. >>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 "The output forma= t is automatically guessed according to the file extension.\n">> -=C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 "Raw images can also be output by= using '%%d' in the filename.\n">> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 "BMP or JPEG images can also be output by using '%%d' in the fil= ename.\n">>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 "\n", ar= gv[0]);>> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 return 1;>> +=C2=A0 =C2=A0 =C2=A0 = =C2=A0 return AVERROR_EXIT;>This return value is sent to the operating syst= em with the exit() system>call so you don't actually want to return an AVER= ROR value here. I replaced it with return 1.I also allocated AVCodecParameter with the prop= er alloc() function, as Andreas suggested.A new patch is attached to this m= ail. Il sabato 18 giugno 2022, 17:18:18 CEST, Leo Izen = ha scritto: =20 =20 On 6/18/22 08:06, Paolo Prete wrote: > Please review this. It's a code rewrite of doc/examples/muxing.c which im= proves readability and fixes issues. > From 8a4e942a001ae49dc052899f331ed43abf954dda Mon Sep 17 00:00:00 2001 > From: paolo > Date: Sat, 18 Jun 2022 13:53:55 +0200 > Subject: [PATCH] doc/examples/muxing: code rewrite with improved readabil= ity >=C2=A0 and fixed issues This commit message is too long, you can just truncate "and fixed=20 issues" since it doesn't say much. >=20 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 Improved readabili= ty with functions that have clearer prototypes and that don't mix logically= unrelated blocks of code >=20 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 Fixed issues in ca= se of unsupported extensions >=20 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 Fixed memory leaks= on errors, which are now properly propagated to the main() function >=20 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 Fixed issue on raw= images output >=20 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 fprintf() replaced= with av_log() >=20 >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 Input A/V paramete= rs exposed in the main() function and easier to customize > --- >=C2=A0 doc/examples/muxing.c | 905 +++++++++++++++++++--------------------= --- >=C2=A0 1 file changed, 406 insertions(+), 499 deletions(-) >=20 > diff --git a/doc/examples/muxing.c b/doc/examples/muxing.c > index 3acb778322..04739995d8 100644 > --- a/doc/examples/muxing.c > +++ b/doc/examples/muxing.c > @@ -1,5 +1,5 @@ >=C2=A0 /* > - * Copyright (c) 2003 Fabrice Bellard > + * Copyright (c) 2022 Paolo Prete (paolopr976 at gmail.com) after Fabric= e Bellard Don't remove the original copyright, just add yourself below it. You=20 also don't need to put your email address in the copyright line. >=C2=A0 * >=C2=A0 * Permission is hereby granted, free of charge, to any person obtai= ning a copy >=C2=A0 * of this software and associated documentation files (the "Softwar= e"), to deal > @@ -24,625 +24,532 @@ >=C2=A0 * @file >=C2=A0 * libavformat API example. >=C2=A0 * > - * Output a media file in any supported libavformat format. The default > + * Output a media file in a set of supported libavformat formats. The de= fault >=C2=A0 * codecs are used. >=C2=A0 * @example muxing.c >=C2=A0 */ >=C2=A0=20 > -#include > -#include > -#include > -#include > - > -#include > -#include > -#include > -#include > -#include >=C2=A0 #include >=C2=A0 #include > -#include > +#include Make sure these stay sorted. >=C2=A0 #include > +#include >=C2=A0=20 > -#define STREAM_DURATION=C2=A0 10.0 > -#define STREAM_FRAME_RATE 25 /* 25 images/s */ > -#define STREAM_PIX_FMT=C2=A0 =C2=A0 AV_PIX_FMT_YUV420P /* default pix_fm= t */ > - > -#define SCALE_FLAGS SWS_BICUBIC > +#define VIDEO_FRAME_RATE 25 /* 25 images/s */ > +#define VIDEO_SCALE_FLAGS SWS_BICUBIC > +#define STREAM_DURATION 10.0 /* 10 seconds */ >=C2=A0=20 > -// a wrapper around a single output AVStream > -typedef struct OutputStream { > -=C2=A0 =C2=A0 AVStream *st; > -=C2=A0 =C2=A0 AVCodecContext *enc; > +static void log_error(const char *s, int *num) > +{ > +=C2=A0 =C2=A0 if (num) > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 av_log(NULL, AV_LOG_ERROR, "%s (error '%s')\= n", s, av_err2str(*num)); > +=C2=A0 =C2=A0 else > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 av_log(NULL, AV_LOG_ERROR, "%s\n", s); > +} This does not need to be a pointer. Convention is that negative values=20 are errors and nonnegative values are not. So you could always use=20 something like: if (num < 0). > -=C2=A0 =C2=A0 /* pts of the next frame that will be generated */ > -=C2=A0 =C2=A0 int64_t next_pts; > -=C2=A0 =C2=A0 int samples_count; > +static int mux_encoded_pkt(AVPacket *out_pkt, AVFormatContext *out_fmt_c= tx, > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 enum AVMediaType type) > +{ > +=C2=A0 =C2=A0 int ret; > +=C2=A0 =C2=A0 AVRational enc_time_base, str_time_base; >=C2=A0=20 > -=C2=A0 =C2=A0 AVFrame *frame; > -=C2=A0 =C2=A0 AVFrame *tmp_frame; > +=C2=A0 =C2=A0 if (out_fmt_ctx->streams[0]->codecpar->codec_type =3D=3D t= ype) > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 out_pkt->stream_index =3D 0; > +=C2=A0 =C2=A0 else if ((out_fmt_ctx->nb_streams > 1) && (type =3D=3D AVM= EDIA_TYPE_VIDEO)) > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 out_pkt->stream_index =3D 1; > +=C2=A0 =C2=A0 str_time_base =3D out_fmt_ctx->streams[out_pkt->stream_ind= ex]->time_base; >=C2=A0=20 > -=C2=A0 =C2=A0 AVPacket *tmp_pkt; > +=C2=A0 =C2=A0 if (type =3D=3D AVMEDIA_TYPE_AUDIO) > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 enc_time_base =3D ((AVRational *)out_fmt_ctx= ->opaque)[0]; > +=C2=A0 =C2=A0 else > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 enc_time_base =3D ((AVRational *)out_fmt_ctx= ->opaque)[1]; >=20 Why are you referencing the opaque elements of out_fmt_ctx? > -=C2=A0 =C2=A0 float t, tincr, tincr2; > +=C2=A0 =C2=A0 av_packet_rescale_ts(out_pkt, enc_time_base, str_time_base= ); >=C2=A0=20 > -=C2=A0 =C2=A0 struct SwsContext *sws_ctx; > -=C2=A0 =C2=A0 struct SwrContext *swr_ctx; > -} OutputStream; > +=C2=A0 =C2=A0 av_log(NULL, AV_LOG_INFO, "stream_index=3D%d, size=3D%d, p= ts_time=3D%s\n", > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 out_pkt->stream_index, > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 out_pkt->size, av_ts2timestr(out_pkt-= >pts, &str_time_base)); >=C2=A0=20 > -static void log_packet(const AVFormatContext *fmt_ctx, const AVPacket *p= kt) > -{ > -=C2=A0 =C2=A0 AVRational *time_base =3D &fmt_ctx->streams[pkt->stream_in= dex]->time_base; > +=C2=A0 =C2=A0 if ((ret =3D av_interleaved_write_frame(out_fmt_ctx, out_p= kt)) < 0) > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 log_error("Error calling av_interleaved_writ= e_frame()", &ret); >=C2=A0=20 > -=C2=A0 =C2=A0 printf("pts:%s pts_time:%s dts:%s dts_time:%s duration:%s = duration_time:%s stream_index:%d\n", > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 av_ts2str(pkt->pts), av_ts2timestr(pk= t->pts, time_base), > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 av_ts2str(pkt->dts), av_ts2timestr(pk= t->dts, time_base), > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 av_ts2str(pkt->duration), av_ts2times= tr(pkt->duration, time_base), > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 pkt->stream_index); > +=C2=A0 =C2=A0 return ret; >=C2=A0 } >=C2=A0=20 > -static int write_frame(AVFormatContext *fmt_ctx, AVCodecContext *c, > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 AVStream *st, AVFrame *frame, AVPacket *pkt) > +static int is_extension_supported(const char *filename) Why are you artificially limiting what is permitted? >=C2=A0 { > -=C2=A0 =C2=A0 int ret; > +=C2=A0 =C2=A0 const char *extensions[] =3D {".aac", ".avi", ".bmp", ".jp= eg", ".mka", > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 ".mkv", ".mov", ".mp4", ".flv",= =C2=A0 ".ts"}; > +=C2=A0 =C2=A0 int i, size =3D sizeof(extensions) / sizeof(extensions[0])= ; > +=C2=A0 =C2=A0 char *dot =3D strrchr(filename, '.'); >=C2=A0=20 > -=C2=A0 =C2=A0 // send the frame to the encoder > -=C2=A0 =C2=A0 ret =3D avcodec_send_frame(c, frame); > -=C2=A0 =C2=A0 if (ret < 0) { > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 fprintf(stderr, "Error sending a frame to th= e encoder: %s\n", > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 av_err2str(ret))= ; > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 exit(1); > +=C2=A0 =C2=A0 for (i =3D 0; i < size; i++) { > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 if (dot && !strcmp(dot, extensions[i])) > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 return 1; >=C2=A0 =C2=A0 =C2=A0 } >=C2=A0=20 > -=C2=A0 =C2=A0 while (ret >=3D 0) { > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 ret =3D avcodec_receive_packet(c, pkt); > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 if (ret =3D=3D AVERROR(EAGAIN) || ret =3D=3D= AVERROR_EOF) > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 break; > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 else if (ret < 0) { > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 fprintf(stderr, "Error encodin= g a frame: %s\n", av_err2str(ret)); > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 exit(1); > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 } > +=C2=A0 =C2=A0 log_error("File extension not supported", NULL); > +=C2=A0 =C2=A0 av_log(NULL, AV_LOG_WARNING, "Please choose one of the fol= lowing extensions: "); > +=C2=A0 =C2=A0 for (i =3D 0; i < size - 1; i++) > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 av_log(NULL, AV_LOG_WARNING, "%s, ", extensi= ons[i]); > +=C2=A0 =C2=A0 av_log(NULL, AV_LOG_WARNING, "%s\n", extensions[size-1]); >=C2=A0=20 > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 /* rescale output packet timestamp values fr= om codec to stream timebase */ > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 av_packet_rescale_ts(pkt, c->time_base, st->= time_base); > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 pkt->stream_index =3D st->index; > - > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 /* Write the compressed frame to the media f= ile. */ > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 log_packet(fmt_ctx, pkt); > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 ret =3D av_interleaved_write_frame(fmt_ctx, = pkt); > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 /* pkt is now blank (av_interleaved_write_fr= ame() takes ownership of > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 * its contents and resets pkt), so that no u= nreferencing is necessary. > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 * This would be different if one used av_wri= te_frame(). */ > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 if (ret < 0) { > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 fprintf(stderr, "Error while w= riting output packet: %s\n", av_err2str(ret)); > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 exit(1); > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 } > -=C2=A0 =C2=A0 } > - > -=C2=A0 =C2=A0 return ret =3D=3D AVERROR_EOF ? 1 : 0; > +=C2=A0 =C2=A0 return 0; >=C2=A0 } >=C2=A0=20 > -/* Add an output stream. */ > -static void add_stream(OutputStream *ost, AVFormatContext *oc, > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 const AVCodec **codec, > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 enum AVCodecID codec_id) > +static int get_default_enc_params(AVCodecParameters *params, > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 const char *fname, enum AV= MediaType type) >=C2=A0 { > -=C2=A0 =C2=A0 AVCodecContext *c; > -=C2=A0 =C2=A0 int i; > - > -=C2=A0 =C2=A0 /* find the encoder */ > -=C2=A0 =C2=A0 *codec =3D avcodec_find_encoder(codec_id); > -=C2=A0 =C2=A0 if (!(*codec)) { > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 fprintf(stderr, "Could not find encoder for = '%s'\n", > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 avcodec_get_name= (codec_id)); > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 exit(1); > +=C2=A0 =C2=A0 AVFormatContext *tmp_fctx; > +=C2=A0 =C2=A0 enum AVCodecID id; > +=C2=A0 =C2=A0 const AVCodec *c; > +=C2=A0 =C2=A0 int ret =3D 0; > + > +=C2=A0 =C2=A0 if ((ret =3D avformat_alloc_output_context2(&tmp_fctx, NUL= L, NULL, fname)) < 0) { > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 log_error("Could not get default encoder", &= ret); > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 return AVERROR_EXIT; >=C2=A0 =C2=A0 =C2=A0 } >=C2=A0=20 > -=C2=A0 =C2=A0 ost->tmp_pkt =3D av_packet_alloc(); > -=C2=A0 =C2=A0 if (!ost->tmp_pkt) { > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 fprintf(stderr, "Could not allocate AVPacket= \n"); > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 exit(1); > -=C2=A0 =C2=A0 } > +=C2=A0 =C2=A0 id =3D (type =3D=3D AVMEDIA_TYPE_AUDIO) ? tmp_fctx->oforma= t->audio_codec : > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 tmp_f= ctx->oformat->video_codec; >=C2=A0=20 > -=C2=A0 =C2=A0 ost->st =3D avformat_new_stream(oc, NULL); > -=C2=A0 =C2=A0 if (!ost->st) { > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 fprintf(stderr, "Could not allocate stream\n= "); > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 exit(1); > -=C2=A0 =C2=A0 } > -=C2=A0 =C2=A0 ost->st->id =3D oc->nb_streams-1; > -=C2=A0 =C2=A0 c =3D avcodec_alloc_context3(*codec); > -=C2=A0 =C2=A0 if (!c) { > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 fprintf(stderr, "Could not alloc an encoding= context\n"); > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 exit(1); > +=C2=A0 =C2=A0 if (!(c =3D avcodec_find_encoder(id))) { > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 avformat_free_context(tmp_fctx); > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 return ret; You probably don't want to return "ret" here as you don't assign it. >=C2=A0 =C2=A0 =C2=A0 } > -=C2=A0 =C2=A0 ost->enc =3D c; > - > -=C2=A0 =C2=A0 switch ((*codec)->type) { > -=C2=A0 =C2=A0 case AVMEDIA_TYPE_AUDIO: > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 c->sample_fmt=C2=A0 =3D (*codec)->sample_fmt= s ? > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (*codec)->sample_fmts[0] : AV_= SAMPLE_FMT_FLTP; > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 c->bit_rate=C2=A0 =C2=A0 =3D 64000; > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 c->sample_rate =3D 44100; > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 if ((*codec)->supported_samplerates) { > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 c->sample_rate =3D (*codec)->s= upported_samplerates[0]; > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 for (i =3D 0; (*codec)->suppor= ted_samplerates[i]; i++) { > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 if ((*codec)->su= pported_samplerates[i] =3D=3D 44100) > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 c-= >sample_rate =3D 44100; > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 } > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 } > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 av_channel_layout_copy(&c->ch_layout, &(AVCh= annelLayout)AV_CHANNEL_LAYOUT_STEREO); > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 ost->st->time_base =3D (AVRational){ 1, c->s= ample_rate }; > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 break; > - > -=C2=A0 =C2=A0 case AVMEDIA_TYPE_VIDEO: > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 c->codec_id =3D codec_id; > - > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 c->bit_rate =3D 400000; > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 /* Resolution must be a multiple of two. */ > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 c->width=C2=A0 =C2=A0 =3D 352; > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 c->height=C2=A0 =3D 288; > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 /* timebase: This is the fundamental unit of= time (in seconds) in terms > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 * of which frame timestamps are represented.= For fixed-fps content, > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 * timebase should be 1/framerate and timesta= mp increments should be > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 * identical to 1. */ > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 ost->st->time_base =3D (AVRational){ 1, STRE= AM_FRAME_RATE }; > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 c->time_base=C2=A0 =C2=A0 =C2=A0 =3D ost->st= ->time_base; > - > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 c->gop_size=C2=A0 =C2=A0 =C2=A0 =3D 12; /* e= mit one intra frame every twelve frames at most */ > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 c->pix_fmt=C2=A0 =C2=A0 =C2=A0 =3D STREAM_PI= X_FMT; > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 if (c->codec_id =3D=3D AV_CODEC_ID_MPEG2VIDE= O) { > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /* just for testing, we also a= dd B-frames */ > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 c->max_b_frames =3D 2; > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 } > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 if (c->codec_id =3D=3D AV_CODEC_ID_MPEG1VIDE= O) { > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 /* Needed to avoid using macro= blocks in which some coeffs overflow. > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 * This does not happen with no= rmal video, it just happens here as > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 * the motion of the chroma pla= ne does not match the luma plane. */ > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 c->mb_decision =3D 2; > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 } > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 break; >=C2=A0=20 > -=C2=A0 =C2=A0 default: > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 break; > +=C2=A0 =C2=A0 params->codec_type =3D c->type; > +=C2=A0 =C2=A0 params->codec_id=C2=A0 =3D c-> id; > +=C2=A0 =C2=A0 if (c->type =3D=3D AVMEDIA_TYPE_AUDIO) { > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 params->format=C2=A0 =C2=A0 =C2=A0 =3D c->sa= mple_fmts ? > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 c->sample_fmts[0] : AV_SAMPLE_FMT_FLTP; > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 params->ch_layout=C2=A0 =3D (AVChannelLayout= )AV_CHANNEL_LAYOUT_STEREO; > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 params->sample_rate =3D c->supported_sampler= ates ? > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 c->supported_samplerates[0] : 44100; > +=C2=A0 =C2=A0 } else if (c->type =3D=3D AVMEDIA_TYPE_VIDEO) { > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 params->format =3D c->pix_fmts ? c->pix_fmts= [0] : AV_PIX_FMT_YUV420P; >=C2=A0 =C2=A0 =C2=A0 } > +=C2=A0 =C2=A0 avformat_free_context(tmp_fctx); >=C2=A0=20 > -=C2=A0 =C2=A0 /* Some formats want stream headers to be separate. */ > -=C2=A0 =C2=A0 if (oc->oformat->flags & AVFMT_GLOBALHEADER) > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 c->flags |=3D AV_CODEC_FLAG_GLOBAL_HEADER; > +=C2=A0 =C2=A0 return ret; Again, why are you returning ret if you are not assigning to it? >=C2=A0 } >=C2=A0=20 > -/**************************************************************/ > -/* audio output */ > - > -static AVFrame *alloc_audio_frame(enum AVSampleFormat sample_fmt, > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 const AVChannelLayout *cha= nnel_layout, > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 int sample_rate, int nb_sa= mples) > +static int init_encoder(AVCodecContext **enc_ctx, AVCodecParameters *par= ams) >=C2=A0 { > -=C2=A0 =C2=A0 AVFrame *frame =3D av_frame_alloc(); > +=C2=A0 =C2=A0 const AVCodec *codec =3D NULL; >=C2=A0 =C2=A0 =C2=A0 int ret; >=C2=A0=20 > -=C2=A0 =C2=A0 if (!frame) { > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 fprintf(stderr, "Error allocating an audio f= rame\n"); > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 exit(1); > +=C2=A0 =C2=A0 codec =3D avcodec_find_encoder(params->codec_id); > +=C2=A0 =C2=A0 *enc_ctx =3D avcodec_alloc_context3(codec); Don't attempt to allocate anything until after you check if the codec is=20 found. > +=C2=A0 =C2=A0 if (!codec) { > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 log_error("Could not allocate the encoding c= ontext", NULL); This error message does not match the check, which is if the codec is found= . > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 return AVERROR_EXIT; return AVERROR_CODEC_NOT_FOUND; >=C2=A0 =C2=A0 =C2=A0 } >=C2=A0=20 > -=C2=A0 =C2=A0 frame->format =3D sample_fmt; > -=C2=A0 =C2=A0 av_channel_layout_copy(&frame->ch_layout, channel_layout); > -=C2=A0 =C2=A0 frame->sample_rate =3D sample_rate; > -=C2=A0 =C2=A0 frame->nb_samples =3D nb_samples; > - > -=C2=A0 =C2=A0 if (nb_samples) { > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 ret =3D av_frame_get_buffer(frame, 0); > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 if (ret < 0) { > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 fprintf(stderr, "Error allocat= ing an audio buffer\n"); > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 exit(1); > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 } > +=C2=A0 =C2=A0 (*enc_ctx)->codec_id=C2=A0 =3D params->codec_id; > +=C2=A0 =C2=A0 (*enc_ctx)->codec_type =3D params->codec_type; > +=C2=A0 =C2=A0 if (params->codec_type =3D=3D AVMEDIA_TYPE_AUDIO) { > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 (*enc_ctx)->sample_fmt=C2=A0 =3D params->for= mat; > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 (*enc_ctx)->sample_rate =3D params->sample_r= ate; > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 (*enc_ctx)->time_base=C2=A0 =3D (AVRational)= {1, params->sample_rate}; Use av_make_q to avoid casting. > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 (*enc_ctx)->ch_layout=C2=A0 =3D params->ch_l= ayout; > +=C2=A0 =C2=A0 } else if (params->codec_type =3D=3D AVMEDIA_TYPE_VIDEO) { > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 (*enc_ctx)->width=C2=A0 =C2=A0 =C2=A0 =3D pa= rams->width; > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 (*enc_ctx)->height=C2=A0 =C2=A0 =3D params->= height; > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 (*enc_ctx)->time_base=C2=A0 =3D (AVRational)= { 1, VIDEO_FRAME_RATE };Better off just definine VIDEO_FRAME_RATE_Q to be a= n AVRational with=20 value {1, 25}; > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 (*enc_ctx)->gop_size=C2=A0 =3D 12; > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 (*enc_ctx)->pix_fmt=C2=A0 =C2=A0 =3D params-= >format; >=C2=A0 =C2=A0 =C2=A0 } >=C2=A0=20 > -=C2=A0 =C2=A0 return frame; > +=C2=A0 =C2=A0 if ((ret =3D avcodec_open2(*enc_ctx, codec, NULL)) < 0) { > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 log_error("Could not open input codec", &ret= ); > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 return ret; > +=C2=A0 =C2=A0 } else > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 return 0;This violates the coding style, you= need to use braces {} for the else=20 block if you also use it for the if block. >=C2=A0 } >=C2=A0=20 > -static void open_audio(AVFormatContext *oc, const AVCodec *codec, > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 OutputStream *ost, AVDictionary *opt_arg) > +static int init_avframe(AVFrame **frame, AVCodecParameters *params) >=C2=A0 { > -=C2=A0 =C2=A0 AVCodecContext *c; > -=C2=A0 =C2=A0 int nb_samples; >=C2=A0 =C2=A0 =C2=A0 int ret; > -=C2=A0 =C2=A0 AVDictionary *opt =3D NULL; >=C2=A0=20 > -=C2=A0 =C2=A0 c =3D ost->enc; > +=C2=A0 =C2=A0 if (!(*frame =3D av_frame_alloc())) { > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 log_error("Could not allocate AVFrame", NULL= ); > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 return AVERROR(ENOMEM); > +=C2=A0 =C2=A0 } >=C2=A0=20 > -=C2=A0 =C2=A0 /* open it */ > -=C2=A0 =C2=A0 av_dict_copy(&opt, opt_arg, 0); > -=C2=A0 =C2=A0 ret =3D avcodec_open2(c, codec, &opt); > -=C2=A0 =C2=A0 av_dict_free(&opt); > -=C2=A0 =C2=A0 if (ret < 0) { > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 fprintf(stderr, "Could not open audio codec:= %s\n", av_err2str(ret)); > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 exit(1); > +=C2=A0 =C2=A0 (*frame)->opaque =3D ¶ms->codec_type; > +=C2=A0 =C2=A0 if (params->codec_type =3D=3D AVMEDIA_TYPE_AUDIO) { > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 (*frame)->nb_samples=C2=A0 =3D params->frame= _size; > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 (*frame)->sample_rate =3D params->sample_rat= e; > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 (*frame)->format=C2=A0 =C2=A0 =C2=A0 =3D par= ams->format; > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 (*frame)->ch_layout=C2=A0 =3D params->ch_lay= out; > +=C2=A0 =C2=A0 } else { > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 (*frame)->width=C2=A0 =3D params->width; > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 (*frame)->height =3D params->height; > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 (*frame)->format =3D params->format; >=C2=A0 =C2=A0 =C2=A0 } >=C2=A0=20 > -=C2=A0 =C2=A0 /* init signal generator */ > -=C2=A0 =C2=A0 ost->t=C2=A0 =C2=A0 =3D 0; > -=C2=A0 =C2=A0 ost->tincr =3D 2 * M_PI * 110.0 / c->sample_rate; > -=C2=A0 =C2=A0 /* increment frequency by 110 Hz per second */ > -=C2=A0 =C2=A0 ost->tincr2 =3D 2 * M_PI * 110.0 / c->sample_rate / c->sam= ple_rate; > +=C2=A0 =C2=A0 /* Allocate the frame's data buffer */ > +=C2=A0 =C2=A0 if ((ret =3D av_frame_get_buffer(*frame, 0)) < 0) { > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 log_error("Could not allocate buffer for AVF= rame", &ret); > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 return AVERROR(ENOMEM); > +=C2=A0 =C2=A0 } else > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 return 0; You don't need the else block here at all. > +} >=C2=A0=20 > -=C2=A0 =C2=A0 if (c->codec->capabilities & AV_CODEC_CAP_VARIABLE_FRAME_S= IZE) > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 nb_samples =3D 10000; > -=C2=A0 =C2=A0 else > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 nb_samples =3D c->frame_size; > +static int init_audio_convert(struct SwrContext **ctx, AVCodecParameters= *in_params, > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 AVCodecParameters *out_params) > +{ > +=C2=A0 =C2=A0 swr_alloc_set_opts2(ctx, > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 &(out_params->ch_layout), > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 out_params->format, out_params->sample_rate, > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 &(in_params->ch_layout), > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 in_params->format, in_params->sample_rate, > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 0, NULL); > +=C2=A0 =C2=A0 if (!*ctx) { > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 log_error("Could not allocate resample conte= xt", NULL); > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 return AVERROR(ENOMEM); > +=C2=A0 =C2=A0 } else > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 return 0; > +} You don't need the else block here at all. >=C2=A0=20 > -=C2=A0 =C2=A0 ost->frame=C2=A0 =C2=A0 =3D alloc_audio_frame(c->sample_fm= t, &c->ch_layout, > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 c->sample_ra= te, nb_samples); > -=C2=A0 =C2=A0 ost->tmp_frame =3D alloc_audio_frame(AV_SAMPLE_FMT_S16, &c= ->ch_layout, > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 c->sample_ra= te, nb_samples); > +static int init_video_convert(struct SwsContext **ctx, AVCodecParameters= *in_params, > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 AVCodecParameters *out_params) > +{ This paper-thin wrapper function is unnecessary, just inline it. > +=C2=A0 =C2=A0 *ctx =3D sws_getContext(in_params->width, in_params->heigh= t, > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 in_params->format, > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 out_params->width, out_params->height, > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 out_params->codec_id =3D=3D out_params->format, > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 VIDEO_SCALE_FLAGS, NULL, NULL, NULL); > +=C2=A0 =C2=A0 if (!*ctx) { > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 log_error("Could not allocate scale context"= , NULL); > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 return AVERROR(ENOMEM); > +=C2=A0 =C2=A0 } else > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 return 0; > +} >=C2=A0=20 > -=C2=A0 =C2=A0 /* copy the stream parameters to the muxer */ > -=C2=A0 =C2=A0 ret =3D avcodec_parameters_from_context(ost->st->codecpar,= c); > -=C2=A0 =C2=A0 if (ret < 0) { > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 fprintf(stderr, "Could not copy the stream p= arameters\n"); > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 exit(1); > -=C2=A0 =C2=A0 } > +static int init_muxer(AVFormatContext **out_fmt_ctx, AVCodecContext *aud= io_enc_ctx, > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 AVCodecContext *video_enc_ctx, const char *filename) > +{ > +=C2=A0 =C2=A0 int ret; > +=C2=A0 =C2=A0 AVStream *out_audio_str, *out_video_str; >=C2=A0=20 > -=C2=A0 =C2=A0 /* create resampler context */ > -=C2=A0 =C2=A0 ost->swr_ctx =3D swr_alloc(); > -=C2=A0 =C2=A0 if (!ost->swr_ctx) { > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 fprintf(stderr, "Could not allocate resample= r context\n"); > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 exit(1); > +=C2=A0 =C2=A0 if ((ret =3D avformat_alloc_output_context2(out_fmt_ctx, N= ULL, NULL, filename)) < 0) { > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 log_error("Could not create output context",= &ret); > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 return ret; >=C2=A0 =C2=A0 =C2=A0 } >=C2=A0=20 > -=C2=A0 =C2=A0 /* set options */ > -=C2=A0 =C2=A0 av_opt_set_chlayout=C2=A0 (ost->swr_ctx, "in_chlayout",=C2= =A0 =C2=A0 =C2=A0 &c->ch_layout,=C2=A0 =C2=A0 =C2=A0 0); > -=C2=A0 =C2=A0 av_opt_set_int=C2=A0 =C2=A0 =C2=A0 (ost->swr_ctx, "in_samp= le_rate",=C2=A0 =C2=A0 c->sample_rate,=C2=A0 =C2=A0 0); > -=C2=A0 =C2=A0 av_opt_set_sample_fmt(ost->swr_ctx, "in_sample_fmt",=C2=A0= =C2=A0 =C2=A0 AV_SAMPLE_FMT_S16, 0); > -=C2=A0 =C2=A0 av_opt_set_chlayout=C2=A0 (ost->swr_ctx, "out_chlayout",= =C2=A0 =C2=A0 =C2=A0 &c->ch_layout,=C2=A0 =C2=A0 =C2=A0 0); > -=C2=A0 =C2=A0 av_opt_set_int=C2=A0 =C2=A0 =C2=A0 (ost->swr_ctx, "out_sam= ple_rate",=C2=A0 =C2=A0 c->sample_rate,=C2=A0 =C2=A0 0); > -=C2=A0 =C2=A0 av_opt_set_sample_fmt(ost->swr_ctx, "out_sample_fmt",=C2= =A0 =C2=A0 c->sample_fmt,=C2=A0 =C2=A0 0); > - > -=C2=A0 =C2=A0 /* initialize the resampling context */ > -=C2=A0 =C2=A0 if ((ret =3D swr_init(ost->swr_ctx)) < 0) { > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 fprintf(stderr, "Failed to initialize the re= sampling context\n"); > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 exit(1); > +=C2=A0 =C2=A0 /* open the output file, if needed */ > +=C2=A0 =C2=A0 if (!((*out_fmt_ctx)->oformat->flags & AVFMT_NOFILE)) { > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 if ((ret =3D avio_open(&(*out_fmt_ctx)->pb, = filename, AVIO_FLAG_WRITE)) < 0) { > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 log_error("Could not open outp= ut file", &ret); > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 return ret; > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 } >=C2=A0 =C2=A0 =C2=A0 } > -} >=C2=A0=20 > -/* Prepare a 16 bit dummy audio frame of 'frame_size' samples and > - * 'nb_channels' channels. */ > -static AVFrame *get_audio_frame(OutputStream *ost) > -{ > -=C2=A0 =C2=A0 AVFrame *frame =3D ost->tmp_frame; > -=C2=A0 =C2=A0 int j, i, v; > -=C2=A0 =C2=A0 int16_t *q =3D (int16_t*)frame->data[0]; > - > -=C2=A0 =C2=A0 /* check if we want to generate more frames */ > -=C2=A0 =C2=A0 if (av_compare_ts(ost->next_pts, ost->enc->time_base, > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 STREAM_DURATION, (AVRational){ 1, 1 }) > 0) > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 return NULL; > +=C2=A0 =C2=A0 if (audio_enc_ctx) { > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 if (!(out_audio_str =3D avformat_new_stream(= *out_fmt_ctx, NULL))) { > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 log_error("Could not create ne= w stream", NULL); > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 return AVERROR(ENOMEM); > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 } > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 out_audio_str->id =3D (*out_fmt_ctx)->nb_str= eams - 1; > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 avcodec_parameters_from_context(out_audio_st= r->codecpar, audio_enc_ctx); > +=C2=A0 =C2=A0 } >=C2=A0=20 > -=C2=A0 =C2=A0 for (j =3D 0; j nb_samples; j++) { > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 v =3D (int)(sin(ost->t) * 10000); > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 for (i =3D 0; i < ost->enc->ch_layout.nb_cha= nnels; i++) > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 *q++ =3D v; > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 ost->t=C2=A0 =C2=A0 +=3D ost->tincr; > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 ost->tincr +=3D ost->tincr2; > +=C2=A0 =C2=A0 if (video_enc_ctx) { > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 if (!(out_video_str =3D avformat_new_stream(= *out_fmt_ctx, NULL))) { > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 log_error("Could not create ne= w stream", NULL); > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 return AVERROR(ENOMEM); > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 } > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 out_video_str->id =3D (*out_fmt_ctx)->nb_str= eams - 1; > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 avcodec_parameters_from_context(out_video_st= r->codecpar, video_enc_ctx); >=C2=A0 =C2=A0 =C2=A0 } >=C2=A0=20 > -=C2=A0 =C2=A0 frame->pts =3D ost->next_pts; > -=C2=A0 =C2=A0 ost->next_pts=C2=A0 +=3D frame->nb_samples; > +=C2=A0 =C2=A0 av_dump_format(*out_fmt_ctx, 0, filename, 1); >=C2=A0=20 > -=C2=A0 =C2=A0 return frame; > +=C2=A0 =C2=A0 /* Write the stream header, if any. */ > +=C2=A0 =C2=A0 if (avformat_write_header(*out_fmt_ctx, NULL) < 0) { > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 log_error("avformat_write_header() error", N= ULL); > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 return AVERROR_EXIT; > +=C2=A0 =C2=A0 } else > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 return 0;This else block is unnecessary. >=C2=A0 } >=C2=A0=20 > -/* > - * encode one audio frame and send it to the muxer > - * return 1 when encoding is finished, 0 otherwise > - */ > -static int write_audio_frame(AVFormatContext *oc, OutputStream *ost) > +static void fill_dummy_s16_frame(AVFrame *frame) >=C2=A0 { > -=C2=A0 =C2=A0 AVCodecContext *c; > -=C2=A0 =C2=A0 AVFrame *frame; > -=C2=A0 =C2=A0 int ret; > -=C2=A0 =C2=A0 int dst_nb_samples; > - > -=C2=A0 =C2=A0 c =3D ost->enc; > - > -=C2=A0 =C2=A0 frame =3D get_audio_frame(ost); > - > -=C2=A0 =C2=A0 if (frame) { > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 /* convert samples from native format to des= tination codec format, using the resampler */ > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 /* compute destination number of samples */ > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 dst_nb_samples =3D av_rescale_rnd(swr_get_de= lay(ost->swr_ctx, c->sample_rate) + frame->nb_samples, > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 c->sa= mple_rate, c->sample_rate, AV_ROUND_UP); > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 av_assert0(dst_nb_samples =3D=3D frame->nb_s= amples); > - > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 /* when we pass a frame to the encoder, it m= ay keep a reference to it > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 * internally; > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 * make sure we do not overwrite it here > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 */ > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 ret =3D av_frame_make_writable(ost->frame); > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 if (ret < 0) > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 exit(1); > - > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 /* convert to destination format */ > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 ret =3D swr_convert(ost->swr_ctx, > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 ost->frame->data, dst_nb_samples, > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 (const uint8_t **)frame->data, frame->nb_samples); > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 if (ret < 0) { > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 fprintf(stderr, "Error while c= onverting\n"); > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 exit(1); > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 } > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 frame =3D ost->frame; > - > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 frame->pts =3D av_rescale_q(ost->samples_cou= nt, (AVRational){1, c->sample_rate}, c->time_base); > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 ost->samples_count +=3D dst_nb_samples; > +=C2=A0 =C2=A0 int j, i, v; > +=C2=A0 =C2=A0 static float t, tincr, tincr2; > +=C2=A0 =C2=A0 int16_t *data =3D (int16_t*)frame->data[0]; > +=C2=A0 =C2=A0 static int frame_ctr; > + > +=C2=A0 =C2=A0 if (!tincr) { > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 t=C2=A0 =C2=A0 =C2=A0 =3D 0; > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 tincr=C2=A0 =3D 2 * M_PI * 110.0 / frame->sa= mple_rate; > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 /* increment frequency by 110 Hz per second = */ > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 tincr2=C2=A0 =3D tincr / frame->sample_rate; What are you doing here? Why are you doing it? >=C2=A0 =C2=A0 =C2=A0 } > - > -=C2=A0 =C2=A0 return write_frame(oc, c, ost->st, frame, ost->tmp_pkt); > +=C2=A0 =C2=A0 for (j =3D 0; j nb_samples; j++) { > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 v =3D (int)(sin(t) * 10000); > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 for (i =3D 0; i < frame->ch_layout.nb_channe= ls; i++) > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 *data++ =3D v; > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 t=C2=A0 =C2=A0 +=3D tincr; > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 tincr +=3D tincr2; > +=C2=A0 =C2=A0 } > +=C2=A0 =C2=A0 frame->pts =3D frame->nb_samples*(++frame_ctr); If you're trying to populate a stream, you should be using the aevalsrc=20 filter, which exists for exactly this purpose. Otherwise just populate=20 it with zeroes (silence). >=C2=A0 } >=C2=A0=20 > -/**************************************************************/ > -/* video output */ > - > -static AVFrame *alloc_picture(enum AVPixelFormat pix_fmt, int width, int= height) > +static void fill_dummy_yuv420p_frame(AVFrame *frame) >=C2=A0 { There's a testsrc filter, or just fill a frame with zeroes (black).=20 Don't reinvent the wheel in an example, that discourages people from=20 using features that exist. > -=C2=A0 =C2=A0 AVFrame *picture; > -=C2=A0 =C2=A0 int ret; > - > -=C2=A0 =C2=A0 picture =3D av_frame_alloc(); > -=C2=A0 =C2=A0 if (!picture) > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 return NULL; > +=C2=A0 =C2=A0 int x, y; > +=C2=A0 =C2=A0 static int idx; >=C2=A0=20 > -=C2=A0 =C2=A0 picture->format =3D pix_fmt; > -=C2=A0 =C2=A0 picture->width=C2=A0 =3D width; > -=C2=A0 =C2=A0 picture->height =3D height; > +=C2=A0 =C2=A0 /* Y */ > +=C2=A0 =C2=A0 for (y =3D 0; y < frame->width; y++) > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 for (x =3D 0; x < frame->width; x++) > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 frame->data[0][y * frame->line= size[0] + x] =3D x + y + idx * 3; >=C2=A0=20 > -=C2=A0 =C2=A0 /* allocate the buffers for the frame data */ > -=C2=A0 =C2=A0 ret =3D av_frame_get_buffer(picture, 0); > -=C2=A0 =C2=A0 if (ret < 0) { > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 fprintf(stderr, "Could not allocate frame da= ta.\n"); > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 exit(1); > +=C2=A0 =C2=A0 /* Cb and Cr */ > +=C2=A0 =C2=A0 for (y =3D 0; y < frame->height / 2; y++) { > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 for (x =3D 0; x < frame->width / 2; x++) { > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 frame->data[1][y * frame->line= size[1] + x] =3D 128 + y + idx * 2; > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 frame->data[2][y * frame->line= size[2] + x] =3D 64 + x + idx * 5; > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 } >=C2=A0 =C2=A0 =C2=A0 } > The > -=C2=A0 =C2=A0 return picture; > +=C2=A0 =C2=A0 frame->pts =3D idx++; >=C2=A0 } >=C2=A0=20 > -static void open_video(AVFormatContext *oc, const AVCodec *codec, > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 OutputStream *ost, AVDictionary *opt_arg) > +static int convert_frame(void *convert_ctx, AVFrame *in_frame, AVFrame *= out_frame) >=C2=A0 { >=C2=A0 =C2=A0 =C2=A0 int ret; > -=C2=A0 =C2=A0 AVCodecContext *c =3D ost->enc; > -=C2=A0 =C2=A0 AVDictionary *opt =3D NULL; > - > -=C2=A0 =C2=A0 av_dict_copy(&opt, opt_arg, 0); > +=C2=A0 =C2=A0 enum AVMediaType *type =3D (enum AVMediaType *)(in_frame->= opaque); >=C2=A0=20 > -=C2=A0 =C2=A0 /* open the codec */ > -=C2=A0 =C2=A0 ret =3D avcodec_open2(c, codec, &opt); > -=C2=A0 =C2=A0 av_dict_free(&opt); > -=C2=A0 =C2=A0 if (ret < 0) { > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 fprintf(stderr, "Could not open video codec:= %s\n", av_err2str(ret)); > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 exit(1); > -=C2=A0 =C2=A0 } > - > -=C2=A0 =C2=A0 /* allocate and init a re-usable frame */ > -=C2=A0 =C2=A0 ost->frame =3D alloc_picture(c->pix_fmt, c->width, c->heig= ht); > -=C2=A0 =C2=A0 if (!ost->frame) { > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 fprintf(stderr, "Could not allocate video fr= ame\n"); > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 exit(1); > +=C2=A0 =C2=A0 if (av_frame_make_writable(out_frame) < 0) { =C2=A0 if ((ret =3D av_frame_make_writable(out_frame)) < 0) { > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 log_error("av_frame_make_writable() error", = NULL); > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 return AVERROR_EXIT;return ret; >=C2=A0 =C2=A0 =C2=A0 } >=C2=A0=20 > -=C2=A0 =C2=A0 /* If the output format is not YUV420P, then a temporary Y= UV420P > -=C2=A0 =C2=A0 * picture is needed too. It is then converted to the requi= red > -=C2=A0 =C2=A0 * output format. */ > -=C2=A0 =C2=A0 ost->tmp_frame =3D NULL; > -=C2=A0 =C2=A0 if (c->pix_fmt !=3D AV_PIX_FMT_YUV420P) { > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 ost->tmp_frame =3D alloc_picture(AV_PIX_FMT_= YUV420P, c->width, c->height); > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 if (!ost->tmp_frame) { > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 fprintf(stderr, "Could not all= ocate temporary picture\n"); > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 exit(1); > +=C2=A0 =C2=A0 if (*type =3D=3D AVMEDIA_TYPE_AUDIO) { > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 if ((ret =3D swr_convert_frame((struct SwrCo= ntext *)convert_ctx, out_frame, > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (const AVFrame *)in= _frame)) !=3D 0) { > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 log_error("Error converting AV= Frame", &ret); > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 return ret; >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 } > +=C2=A0 =C2=A0 } else { > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 sws_scale((struct SwsContext *)convert_ctx, = (const uint8_t * const *)in_frame->data, > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 in_frame-= >linesize, 0, in_frame->height, out_frame->data, > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 out_frame= ->linesize); >=C2=A0 =C2=A0 =C2=A0 } >=C2=A0=20 > -=C2=A0 =C2=A0 /* copy the stream parameters to the muxer */ > -=C2=A0 =C2=A0 ret =3D avcodec_parameters_from_context(ost->st->codecpar,= c); > -=C2=A0 =C2=A0 if (ret < 0) { > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 fprintf(stderr, "Could not copy the stream p= arameters\n"); > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 exit(1); > -=C2=A0 =C2=A0 } > +=C2=A0 =C2=A0 out_frame->pts =3D in_frame->pts; > +=C2=A0 =C2=A0 return 0; >=C2=A0 } >=C2=A0=20 > -/* Prepare a dummy image. */ > -static void fill_yuv_image(AVFrame *pict, int frame_index, > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 int width, int height) > +static int encode_frame(AVCodecContext *ctx, AVFrame *in_frame, AVPacket= *out_pkt) >=C2=A0 { > -=C2=A0 =C2=A0 int x, y, i; > +=C2=A0 =C2=A0 static int is_flushing_audio =3D 0, is_flushing_video =3D = 0; > +=C2=A0 =C2=A0 int ret =3D 0; > +=C2=A0 =C2=A0 int is_audio =3D ctx->codec->type =3D=3D AVMEDIA_TYPE_AUDI= O; >=C2=A0=20 > -=C2=A0 =C2=A0 i =3D frame_index; > - > -=C2=A0 =C2=A0 /* Y */ > -=C2=A0 =C2=A0 for (y =3D 0; y < height; y++) > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 for (x =3D 0; x < width; x++) > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 pict->data[0][y * pict->linesi= ze[0] + x] =3D x + y + i * 3; > - > -=C2=A0 =C2=A0 /* Cb and Cr */ > -=C2=A0 =C2=A0 for (y =3D 0; y < height / 2; y++) { > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 for (x =3D 0; x < width / 2; x++) { > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 pict->data[1][y * pict->linesi= ze[1] + x] =3D 128 + y + i * 2; > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 pict->data[2][y * pict->linesi= ze[2] + x] =3D 64 + x + i * 5; > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 } > +=C2=A0 =C2=A0 if ((is_audio && !is_flushing_audio) || (!is_audio && !is_= flushing_video)) { > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 ret =3D avcodec_send_frame(ctx, in_frame); >=C2=A0 =C2=A0 =C2=A0 } > -} > - > -static AVFrame *get_video_frame(OutputStream *ost) > -{ > -=C2=A0 =C2=A0 AVCodecContext *c =3D ost->enc; > - > -=C2=A0 =C2=A0 /* check if we want to generate more frames */ > -=C2=A0 =C2=A0 if (av_compare_ts(ost->next_pts, c->time_base, > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 STREAM_DURATION, (AVRational){ 1, 1 }) > 0) > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 return NULL; > - > -=C2=A0 =C2=A0 /* when we pass a frame to the encoder, it may keep a refe= rence to it > -=C2=A0 =C2=A0 * internally; make sure we do not overwrite it here */ > -=C2=A0 =C2=A0 if (av_frame_make_writable(ost->frame) < 0) > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 exit(1); > - > -=C2=A0 =C2=A0 if (c->pix_fmt !=3D AV_PIX_FMT_YUV420P) { > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 /* as we only generate a YUV420P picture, we= must convert it > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 * to the codec pixel format if needed */ > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 if (!ost->sws_ctx) { > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 ost->sws_ctx =3D sws_getContex= t(c->width, c->height, > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 AV_PIX_FMT_YUV420P, > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 c->width, c->height, > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 c->pix_fmt, > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 SCALE_FLAGS, NULL, NULL, NULL); > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 if (!ost->sws_ctx) { > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 fprintf(stderr, > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 "Could not initialize the conversion context\n"); > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 exit(1); > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 } > +=C2=A0 =C2=A0 if (ret < 0) { You need to check for AVERROR(EAGAIN). > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 av_log(NULL, AV_LOG_ERROR, > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 "Error sending frame to= the encoder (error '%s')\n", av_err2str(ret)); > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 return ret; > +=C2=A0 =C2=A0 } else if (ret =3D=3D 0) { > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 ret =3D avcodec_receive_packet(ctx, out_pkt)= ; > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 if ((ret < 0) && (ret !=3D AVERROR(EAGAIN)) = && (ret !=3D AVERROR_EOF)) { > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 av_log(NULL, AV_LOG_ERROR, > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 "Error re= ceiving encoded packet (error '%s')\n", av_err2str(ret)); > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 return ret; >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 } > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 fill_yuv_image(ost->tmp_frame, ost->next_pts= , c->width, c->height); > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 sws_scale(ost->sws_ctx, (const uint8_t * con= st *) ost->tmp_frame->data, > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 ost->tmp_= frame->linesize, 0, c->height, ost->frame->data, > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 ost->fram= e->linesize); > -=C2=A0 =C2=A0 } else { > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 fill_yuv_image(ost->frame, ost->next_pts, c-= >width, c->height); >=C2=A0 =C2=A0 =C2=A0 } >=C2=A0=20 > -=C2=A0 =C2=A0 ost->frame->pts =3D ost->next_pts++; > +=C2=A0 =C2=A0 if (is_audio) > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 is_flushing_audio =3D (in_frame =3D=3D NULL)= ; > +=C2=A0 =C2=A0 else > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 is_flushing_video =3D (in_frame =3D=3D NULL)= ; >=C2=A0=20 > -=C2=A0 =C2=A0 return ost->frame; > +=C2=A0 =C2=A0 return ret; >=C2=A0 } >=C2=A0=20 > -/* > - * encode one video frame and send it to the muxer > - * return 1 when encoding is finished, 0 otherwise > - */ > -static int write_video_frame(AVFormatContext *oc, OutputStream *ost) > +static int frame_exceeds_stream_duration(AVFrame *fr) >=C2=A0 { > -=C2=A0 =C2=A0 return write_frame(oc, ost->enc, ost->st, get_video_frame(= ost), ost->tmp_pkt); > +=C2=A0 =C2=A0 enum AVMediaType *type =3D (enum AVMediaType *)(fr->opaque= ); Why are you reading from the opaque structure of the frame. Are you sure=20 this is what you wanted to do? > +=C2=A0 =C2=A0 AVRational tb =3D (*type =3D=3D AVMEDIA_TYPE_AUDIO) ? (AVR= ational){ 1, fr->sample_rate} : > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (AVRational){ 1, VIDEO_FRAME_RATE}; > + > +=C2=A0 =C2=A0 return av_compare_ts(fr->pts, tb ,STREAM_DURATION, (AVRati= onal){ 1, 1 }) > 0; >=C2=A0 } >=C2=A0=20 > -static void close_stream(AVFormatContext *oc, OutputStream *ost) > +static enum AVMediaType media_type_of_earlier_frame(AVFrame *audio_fr, > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 AVFrame *video_fr) >=C2=A0 { > -=C2=A0 =C2=A0 avcodec_free_context(&ost->enc); > -=C2=A0 =C2=A0 av_frame_free(&ost->frame); > -=C2=A0 =C2=A0 av_frame_free(&ost->tmp_frame); > -=C2=A0 =C2=A0 av_packet_free(&ost->tmp_pkt); > -=C2=A0 =C2=A0 sws_freeContext(ost->sws_ctx); > -=C2=A0 =C2=A0 swr_free(&ost->swr_ctx); > +=C2=A0 =C2=A0 if (!audio_fr) > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 return AVMEDIA_TYPE_VIDEO; > +=C2=A0 =C2=A0 if (!video_fr) > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 return AVMEDIA_TYPE_AUDIO; > + > +=C2=A0 =C2=A0 if (av_compare_ts(audio_fr->pts, (AVRational){ 1, audio_fr= ->sample_rate}, > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 video_fr->pts, (AVRational){ 1, VIDEO_FRAME_RATE}) < 0) > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 return AVMEDIA_TYPE_AUDIO; > +=C2=A0 =C2=A0 else > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 return AVMEDIA_TYPE_VIDEO; >=C2=A0 } >=C2=A0=20 > -/**************************************************************/ > -/* media file output */ > - >=C2=A0 int main(int argc, char **argv) >=C2=A0 { > -=C2=A0 =C2=A0 OutputStream video_st =3D { 0 }, audio_st =3D { 0 }; > -=C2=A0 =C2=A0 const AVOutputFormat *fmt; > -=C2=A0 =C2=A0 const char *filename; > -=C2=A0 =C2=A0 AVFormatContext *oc; > -=C2=A0 =C2=A0 const AVCodec *audio_codec, *video_codec; > -=C2=A0 =C2=A0 int ret; > -=C2=A0 =C2=A0 int have_video =3D 0, have_audio =3D 0; > -=C2=A0 =C2=A0 int encode_video =3D 0, encode_audio =3D 0; > -=C2=A0 =C2=A0 AVDictionary *opt =3D NULL; > -=C2=A0 =C2=A0 int i; > - > -=C2=A0 =C2=A0 if (argc < 2) { > +=C2=A0 =C2=A0 const char *fname; > +=C2=A0 =C2=A0 AVCodecContext *audio_enc_ctx =3D NULL, *video_enc_ctx =3D= NULL, *enc_ctx =3D NULL; > + > +=C2=A0 =C2=A0 /* NOTE: if you want to modify the audio/video input ".for= mat" parameter, > +=C2=A0 =C2=A0 * you need to modify the corresponding fill_dummy_XXX_fram= e() function(s) too */ > +=C2=A0 =C2=A0 AVCodecParameters audio_in_params =3D { > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 .codec_type=C2=A0 =3D AVMEDIA_TYPE_AUDIO, > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 .format=C2=A0 =C2=A0 =C2=A0 =3D AV_SAMPLE_FM= T_S16, > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 .sample_rate =3D 44100, > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 .ch_layout=C2=A0 =3D (AVChannelLayout)AV_CHA= NNEL_LAYOUT_STEREO > +=C2=A0 =C2=A0 }, > +=C2=A0 =C2=A0 video_in_params =3D { > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 .codec_type =3D AVMEDIA_TYPE_VIDEO, > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 .width=C2=A0 =C2=A0 =C2=A0 =3D 352, > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 .height=C2=A0 =C2=A0 =3D 288, > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 .format=C2=A0 =C2=A0 =3D AV_PIX_FMT_YUV420P > +=C2=A0 =C2=A0 }, > +=C2=A0 =C2=A0 video_enc_params=C2=A0 =3D { 0 }, audio_enc_params =3D { 0= }; > +=C2=A0 =C2=A0 struct AVRational enc_timebases[2]; > +=C2=A0 =C2=A0 AVFrame *in_audio_frame =3D NULL, *converted_audio_frame = =3D NULL, > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 *in_video_frame =3D NULL, *con= verted_video_frame =3D NULL, > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 *frame_to_encode =3D NULL; > +=C2=A0 =C2=A0 struct SwrContext *audio_convert_ctx =3D NULL; > +=C2=A0 =C2=A0 struct SwsContext *video_convert_ctx =3D NULL; > +=C2=A0 =C2=A0 enum AVMediaType media_type; > +=C2=A0 =C2=A0 AVFormatContext *out_fmt_ctx =3D NULL; > +=C2=A0 =C2=A0 AVPacket *out_pkt =3D av_packet_alloc(); > +=C2=A0 =C2=A0 int ret =3D 0, process_audio =3D 0, process_video =3D 0; > + > +=C2=A0 =C2=A0 if (argc !=3D 2) { >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 printf("usage: %s output_file\n" >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 "API example progr= am to output a media file with libavformat.\n" > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 "This program generates= a synthetic audio and video stream, encodes and\n" > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 "This program generates= a synthetic audio and/or video stream, encodes and\n" >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 "muxes them into a= file named output_file.\n" >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 "The output format= is automatically guessed according to the file extension.\n" > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 "Raw images can also be= output by using '%%d' in the filename.\n" > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 "BMP or JPEG images can= also be output by using '%%d' in the filename.\n" >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 "\n", argv[0]); > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 return 1; > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 return AVERROR_EXIT; This return value is sent to the operating system with the exit() system=20 call so you don't actually want to return an AVERROR value here. >=C2=A0 =C2=A0 =C2=A0 } >=C2=A0=20 > -=C2=A0 =C2=A0 filename =3D argv[1]; > -=C2=A0 =C2=A0 for (i =3D 2; i+1 < argc; i+=3D2) { > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 if (!strcmp(argv[i], "-flags") || !strcmp(ar= gv[i], "-fflags")) > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 av_dict_set(&opt, argv[i]+1, a= rgv[i+1], 0); > +=C2=A0 =C2=A0 fname =3D argv[1]; > +=C2=A0 =C2=A0 if (!is_extension_supported(fname)) { > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 ret =3D AVERROR_EXIT; > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 goto end; >=C2=A0 =C2=A0 =C2=A0 } >=C2=A0=20 > -=C2=A0 =C2=A0 /* allocate the output media context */ > -=C2=A0 =C2=A0 avformat_alloc_output_context2(&oc, NULL, NULL, filename); > -=C2=A0 =C2=A0 if (!oc) { > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 printf("Could not deduce output format from = file extension: using MPEG.\n"); > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 avformat_al= loc_output_context2(&oc, NULL, "mpeg", filename); > -=C2=A0 =C2=A0 } > -=C2=A0 =C2=A0 if (!oc) > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 return 1; > - > -=C2=A0 =C2=A0 fmt =3D oc->oformat; > - > -=C2=A0 =C2=A0 /* Add the audio and video streams using the default forma= t codecs > -=C2=A0 =C2=A0 * and initialize the codecs. */ > -=C2=A0 =C2=A0 if (fmt->video_codec !=3D AV_CODEC_ID_NONE) { > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 add_stream(&video_st, oc, &video_codec, fmt-= >video_codec); > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 have_video =3D 1; > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 encode_video =3D 1; > +=C2=A0 =C2=A0 /* Desume the default codecs and their default parameters = from the filename */ > +=C2=A0 =C2=A0 if ((ret =3D get_default_enc_params(&audio_enc_params, fna= me, AVMEDIA_TYPE_AUDIO)) < 0) > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 goto end; > +=C2=A0 =C2=A0 if ((ret =3D get_default_enc_params(&video_enc_params, fna= me, AVMEDIA_TYPE_VIDEO)) < 0) > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 goto end; > +=C2=A0 =C2=A0 process_audio =3D audio_enc_params.codec_id !=3D AV_CODEC_= ID_NONE; > +=C2=A0 =C2=A0 process_video =3D video_enc_params.codec_id !=3D AV_CODEC_= ID_NONE; > +=C2=A0 =C2=A0 if (!process_audio && !process_video) { > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 log_error("Could not get default encoder(s)"= , NULL); > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 ret =3D AVERROR_EXIT; > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 goto end; >=C2=A0 =C2=A0 =C2=A0 } > -=C2=A0 =C2=A0 if (fmt->audio_codec !=3D AV_CODEC_ID_NONE) { > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 add_stream(&audio_st, oc, &audio_codec, fmt-= >audio_codec); > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 have_audio =3D 1; > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 encode_audio =3D 1; > -=C2=A0 =C2=A0 } > - > -=C2=A0 =C2=A0 /* Now that all the parameters are set, we can open the au= dio and > -=C2=A0 =C2=A0 * video codecs and allocate the necessary encode buffers. = */ > -=C2=A0 =C2=A0 if (have_video) > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 open_video(oc, video_codec, &video_st, opt); > - > -=C2=A0 =C2=A0 if (have_audio) > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 open_audio(oc, audio_codec, &audio_st, opt); > - > -=C2=A0 =C2=A0 av_dump_format(oc, 0, filename, 1); >=C2=A0=20 > -=C2=A0 =C2=A0 /* open the output file, if needed */ > -=C2=A0 =C2=A0 if (!(fmt->flags & AVFMT_NOFILE)) { > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 ret =3D avio_open(&oc->pb, filename, AVIO_FL= AG_WRITE); > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 if (ret < 0) { > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 fprintf(stderr, "Could not ope= n '%s': %s\n", filename, > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 av= _err2str(ret)); > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 return 1; > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 } > +=C2=A0 =C2=A0 if (process_audio) { > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 /* Prepare the audio encoder*/ > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 if ((ret =3D init_encoder(&audio_enc_ctx, &a= udio_enc_params)) < 0) > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto end; > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 enc_timebases[0] =3D audio_enc_ctx->time_bas= e; > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 audio_in_params.frame_size=C2=A0 =3D audio_e= nc_params.frame_size=C2=A0 =3D audio_enc_ctx->frame_size; > + > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 /* Allocate an audio resampler and its input= and output AVFrames */ > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 if ((ret =3D init_audio_convert(&audio_conve= rt_ctx, &audio_in_params, > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 &audio_enc_p= arams)) < 0) > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto end; > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 if ((ret =3D init_avframe(&in_audio_frame, &= audio_in_params)) < 0) > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto end; > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 if ((ret =3D init_avframe(&converted_audio_f= rame, &audio_enc_params)) < 0) > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto end; >=C2=A0 =C2=A0 =C2=A0 } >=C2=A0=20 > -=C2=A0 =C2=A0 /* Write the stream header, if any. */ > -=C2=A0 =C2=A0 ret =3D avformat_write_header(oc, &opt); > -=C2=A0 =C2=A0 if (ret < 0) { > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 fprintf(stderr, "Error occurred when opening= output file: %s\n", > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 av_err2str(ret))= ; > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 return 1; > +=C2=A0 =C2=A0 if (process_video) { > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 video_enc_params.width=C2=A0 =3D video_in_pa= rams.width; > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 video_enc_params.height =3D video_in_params.= height; > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 if ((ret =3D init_encoder(&video_enc_ctx, &v= ideo_enc_params)) < 0) > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto end; > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 enc_timebases[1] =3D video_enc_ctx->time_bas= e; > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 if ((ret =3D init_video_convert(&video_conve= rt_ctx,&video_in_params, > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 &video_enc_p= arams)) < 0) > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto end; > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 if ((ret =3D init_avframe(&in_video_frame, &= video_in_params)) < 0) > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto end; > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 if ((ret =3D init_avframe(&converted_video_f= rame, &video_enc_params)) < 0) > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto end; >=C2=A0 =C2=A0 =C2=A0 } >=C2=A0=20 > -=C2=A0 =C2=A0 while (encode_video || encode_audio) { > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 /* select the stream to encode */ > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 if (encode_video && > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 (!encode_audio || av_compare_t= s(video_st.next_pts, video_st.enc->time_base, > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 audio_st.next_pts, audio_st.enc->time_base) <=3D 0)) { > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 encode_video =3D !write_video_= frame(oc, &video_st); > +=C2=A0 =C2=A0 /* Create the output container for the encoded frames */ > +=C2=A0 =C2=A0 if ((ret =3D init_muxer(&out_fmt_ctx, audio_enc_ctx, video= _enc_ctx, fname)) < 0) > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 goto end; > +=C2=A0 =C2=A0 out_fmt_ctx->opaque =3D &enc_timebases; > + > +=C2=A0 =C2=A0 while (process_audio || process_video) { > + > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 frame_to_encode =3D NULL; > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 media_type =3D media_type_of_earlier_frame(i= n_audio_frame, in_video_frame); > + > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 /* fill and convert the input frames */ > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 if (media_type =3D=3D AVMEDIA_TYPE_AUDIO) { > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 enc_ctx =3D audio_enc_ctx; > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 fill_dummy_s16_frame(in_audio_= frame); > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 if ((ret =3D convert_frame(aud= io_convert_ctx, in_audio_frame, > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 converted_audio_fra= me)) !=3D 0) > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto end; > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 if (!frame_exceeds_stream_dura= tion(converted_audio_frame)) > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 frame_to_encode = =3D converted_audio_frame; >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 } else { > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 encode_audio =3D !write_audio_= frame(oc, &audio_st); > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 enc_ctx =3D video_enc_ctx; > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 fill_dummy_yuv420p_frame(in_vi= deo_frame); > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 if ((ret =3D convert_frame(vid= eo_convert_ctx, in_video_frame, > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 converted_video_fra= me)) !=3D 0) > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto end; > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 if (!frame_exceeds_stream_dura= tion(in_video_frame)) > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 frame_to_encode = =3D converted_video_frame; >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 } > -=C2=A0 =C2=A0 } > - > -=C2=A0 =C2=A0 av_write_trailer(oc); >=C2=A0=20 > -=C2=A0 =C2=A0 /* Close each codec. */ > -=C2=A0 =C2=A0 if (have_video) > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 close_stream(oc, &video_st); > -=C2=A0 =C2=A0 if (have_audio) > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 close_stream(oc, &audio_st); > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 /* encode the converted frames and mux the e= ncoded packets */ > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 if ((ret =3D encode_frame(enc_ctx, frame_to_= encode, out_pkt)) =3D=3D 0) { > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 if ((ret =3D mux_encoded_pkt(o= ut_pkt, out_fmt_ctx, media_type)) < 0) > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto end; > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 } >=C2=A0=20 > -=C2=A0 =C2=A0 if (!(fmt->flags & AVFMT_NOFILE)) > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 /* Close the output file. */ > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 avio_closep(&oc->pb); > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 /* check if the encoders have been fully flu= shed */ > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 process_audio &=3D !((ret =3D=3D AVERROR_EOF= ) && (media_type =3D=3D AVMEDIA_TYPE_AUDIO)); > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 process_video &=3D !((ret =3D=3D AVERROR_EOF= ) && (media_type =3D=3D AVMEDIA_TYPE_VIDEO)); >=C2=A0=20 > -=C2=A0 =C2=A0 /* free the stream */ > -=C2=A0 =C2=A0 avformat_free_context(oc); > +=C2=A0 =C2=A0 } >=C2=A0=20 > -=C2=A0 =C2=A0 return 0; > +=C2=A0 =C2=A0 av_write_trailer(out_fmt_ctx); > +=C2=A0 =C2=A0 ret =3D 0; > + > +end: > + > +=C2=A0 =C2=A0 avcodec_free_context(&audio_enc_ctx); > +=C2=A0 =C2=A0 avcodec_free_context(&video_enc_ctx); > +=C2=A0 =C2=A0 av_frame_free(&in_audio_frame); > +=C2=A0 =C2=A0 av_frame_free(&in_video_frame); > +=C2=A0 =C2=A0 av_frame_free(&converted_audio_frame); > +=C2=A0 =C2=A0 av_frame_free(&converted_video_frame); > +=C2=A0 =C2=A0 swr_free(&audio_convert_ctx); > +=C2=A0 =C2=A0 sws_freeContext(video_convert_ctx); > +=C2=A0 =C2=A0 if (out_fmt_ctx) > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 avio_closep(&out_fmt_ctx->pb); > +=C2=A0 =C2=A0 avformat_free_context(out_fmt_ctx); > +=C2=A0 =C2=A0 av_packet_free(&out_pkt); > + > +=C2=A0 =C2=A0 return ret; >=C2=A0 } > --=20 > 2.32.0 This isn't a thorough review since I'm not familiar enough with the mux=20 API to really say whether or not it was used correctly, but this is what=20 I noticed on first glance. _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe". =20 ------=_Part_9340923_218664257.1655598357190 Content-Type: text/x-patch Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="=?UTF-8?b?MDAwMS1kb2MtZXhhbXBsZXMtbXV4aW5nLWNvZGUtcmV3cml0ZS13aXRoLWltcHJvdmVkLXJlYWRhLnBhdGNo?=" Content-ID: <9edb022c-d31b-c3d2-2fb9-8e1e7a98d438@yahoo.com> RnJvbSBiZDBkNGJhZDIxOTAwYzM2YWE4MmRlYzU0MTU1ODYyZmVhZWZkMDhjIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBwYW9sbyA8cGFvbG9wcjk3NkBnbWFpbC5jb20+CkRhdGU6IFN1 biwgMTkgSnVuIDIwMjIgMDI6MDQ6MDcgKzAyMDAKU3ViamVjdDogW1BBVENIXSBkb2MvZXhhbXBs ZXMvbXV4aW5nOiBjb2RlIHJld3JpdGUgd2l0aCBpbXByb3ZlZCByZWFkYWJpbGl0eQogYW5kIGZp eGVkIGlzc3VlcwoKICAgICAgICAgICAgICAgSW1wcm92ZWQgcmVhZGFiaWxpdHkgd2l0aCBmdW5j dGlvbnMgdGhhdCBoYXZlIGNsZWFyZXIgcHJvdG90eXBlcyBhbmQgdGhhdCBkb24ndCBtaXggbG9n aWNhbGx5IHVucmVsYXRlZCBibG9ja3Mgb2YgY29kZQoKICAgICAgICAgICAgICAgRml4ZWQgaXNz dWVzIGluIGNhc2Ugb2YgdW5zdXBwb3J0ZWQgZXh0ZW5zaW9ucwoKICAgICAgICAgICAgICAgRml4 ZWQgbWVtb3J5IGxlYWtzIG9uIGVycm9ycywgd2hpY2ggYXJlIG5vdyBwcm9wZXJseSBwcm9wYWdh dGVkIHRvIHRoZSBtYWluKCkgZnVuY3Rpb24KCiAgICAgICAgICAgICAgIEZpeGVkIGlzc3VlIG9u IHJhdyBpbWFnZXMgb3V0cHV0CgogICAgICAgICAgICAgICBmcHJpbnRmKCkgcmVwbGFjZWQgd2l0 aCBhdl9sb2coKQoKICAgICAgICAgICAgICAgSW5wdXQgQS9WIHBhcmFtZXRlcnMgZXhwb3NlZCBp biB0aGUgbWFpbigpIGZ1bmN0aW9uIGFuZCBlYXNpZXIgdG8gY3VzdG9taXplCi0tLQogZG9jL2V4 YW1wbGVzL211eGluZy5jIHwgOTE5ICsrKysrKysrKysrKysrKysrKystLS0tLS0tLS0tLS0tLS0t LS0tLS0tLQogMSBmaWxlIGNoYW5nZWQsIDQyMyBpbnNlcnRpb25zKCspLCA0OTYgZGVsZXRpb25z KC0pCgpkaWZmIC0tZ2l0IGEvZG9jL2V4YW1wbGVzL211eGluZy5jIGIvZG9jL2V4YW1wbGVzL211 eGluZy5jCmluZGV4IDNhY2I3NzgzMjIuLmE5MTEzNGFjN2MgMTAwNjQ0Ci0tLSBhL2RvYy9leGFt cGxlcy9tdXhpbmcuYworKysgYi9kb2MvZXhhbXBsZXMvbXV4aW5nLmMKQEAgLTEsNSArMSw2IEBA CiAvKgogICogQ29weXJpZ2h0IChjKSAyMDAzIEZhYnJpY2UgQmVsbGFyZAorICogKENvZGUgcmV3 cml0ZSBieSBQYW9sbyBQcmV0ZSwgMjAyMikKICAqCiAgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBn cmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CiAg KiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRo ZSAiU29mdHdhcmUiKSwgdG8gZGVhbApAQCAtMjQsNjI1ICsyNSw1NTEgQEAKICAqIEBmaWxlCiAg KiBsaWJhdmZvcm1hdCBBUEkgZXhhbXBsZS4KICAqCi0gKiBPdXRwdXQgYSBtZWRpYSBmaWxlIGlu IGFueSBzdXBwb3J0ZWQgbGliYXZmb3JtYXQgZm9ybWF0LiBUaGUgZGVmYXVsdAorICogT3V0cHV0 IGEgbWVkaWEgZmlsZSBpbiBhIHNldCBvZiBzdXBwb3J0ZWQgbGliYXZmb3JtYXQgZm9ybWF0cy4g VGhlIGRlZmF1bHQKICAqIGNvZGVjcyBhcmUgdXNlZC4KICAqIEBleGFtcGxlIG11eGluZy5jCiAg Ki8KIAotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8 c3RyaW5nLmg+Ci0jaW5jbHVkZSA8bWF0aC5oPgotCi0jaW5jbHVkZSA8bGliYXZ1dGlsL2F2YXNz ZXJ0Lmg+Ci0jaW5jbHVkZSA8bGliYXZ1dGlsL2NoYW5uZWxfbGF5b3V0Lmg+Ci0jaW5jbHVkZSA8 bGliYXZ1dGlsL29wdC5oPgotI2luY2x1ZGUgPGxpYmF2dXRpbC9tYXRoZW1hdGljcy5oPgotI2lu Y2x1ZGUgPGxpYmF2dXRpbC90aW1lc3RhbXAuaD4KICNpbmNsdWRlIDxsaWJhdmNvZGVjL2F2Y29k ZWMuaD4KICNpbmNsdWRlIDxsaWJhdmZvcm1hdC9hdmZvcm1hdC5oPgotI2luY2x1ZGUgPGxpYnN3 c2NhbGUvc3dzY2FsZS5oPgorI2luY2x1ZGUgPGxpYmF2dXRpbC90aW1lc3RhbXAuaD4KICNpbmNs dWRlIDxsaWJzd3Jlc2FtcGxlL3N3cmVzYW1wbGUuaD4KKyNpbmNsdWRlIDxsaWJzd3NjYWxlL3N3 c2NhbGUuaD4KIAotI2RlZmluZSBTVFJFQU1fRFVSQVRJT04gICAxMC4wCi0jZGVmaW5lIFNUUkVB TV9GUkFNRV9SQVRFIDI1IC8qIDI1IGltYWdlcy9zICovCi0jZGVmaW5lIFNUUkVBTV9QSVhfRk1U ICAgIEFWX1BJWF9GTVRfWVVWNDIwUCAvKiBkZWZhdWx0IHBpeF9mbXQgKi8KLQotI2RlZmluZSBT Q0FMRV9GTEFHUyBTV1NfQklDVUJJQworI2RlZmluZSBWSURFT19GUkFNRV9SQVRFIDI1IC8qIDI1 IGltYWdlcy9zICovCisjZGVmaW5lIFZJREVPX1NDQUxFX0ZMQUdTIFNXU19CSUNVQklDCisjZGVm aW5lIFNUUkVBTV9EVVJBVElPTiAxMC4wIC8qIDEwIHNlY29uZHMgKi8KIAotLy8gYSB3cmFwcGVy IGFyb3VuZCBhIHNpbmdsZSBvdXRwdXQgQVZTdHJlYW0KLXR5cGVkZWYgc3RydWN0IE91dHB1dFN0 cmVhbSB7Ci0gICAgQVZTdHJlYW0gKnN0OwotICAgIEFWQ29kZWNDb250ZXh0ICplbmM7CitzdGF0 aWMgdm9pZCBsb2dfZXJyb3IoY29uc3QgY2hhciAqcywgaW50ICpudW0pCit7CisgICAgaWYgKG51 bSkKKyAgICAgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19FUlJPUiwgIiVzIChlcnJvciAnJXMnKVxu IiwgcywgYXZfZXJyMnN0cigqbnVtKSk7CisgICAgZWxzZQorICAgICAgICBhdl9sb2coTlVMTCwg QVZfTE9HX0VSUk9SLCAiJXNcbiIsIHMpOworfQogCi0gICAgLyogcHRzIG9mIHRoZSBuZXh0IGZy YW1lIHRoYXQgd2lsbCBiZSBnZW5lcmF0ZWQgKi8KLSAgICBpbnQ2NF90IG5leHRfcHRzOwotICAg IGludCBzYW1wbGVzX2NvdW50Oworc3RhdGljIGludCBtdXhfZW5jb2RlZF9wa3QoQVZQYWNrZXQg Km91dF9wa3QsIEFWRm9ybWF0Q29udGV4dCAqb3V0X2ZtdF9jdHgsCisgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBlbnVtIEFWTWVkaWFUeXBlIHR5cGUpCit7CisgICAgaW50IHJldDsKKyAg ICBBVlJhdGlvbmFsIGVuY190aW1lX2Jhc2UsIHN0cl90aW1lX2Jhc2U7CiAKLSAgICBBVkZyYW1l ICpmcmFtZTsKLSAgICBBVkZyYW1lICp0bXBfZnJhbWU7CisgICAgaWYgKG91dF9mbXRfY3R4LT5z dHJlYW1zWzBdLT5jb2RlY3Bhci0+Y29kZWNfdHlwZSA9PSB0eXBlKQorICAgICAgICBvdXRfcGt0 LT5zdHJlYW1faW5kZXggPSAwOworICAgIGVsc2UgaWYgKChvdXRfZm10X2N0eC0+bmJfc3RyZWFt cyA+IDEpICYmICh0eXBlID09IEFWTUVESUFfVFlQRV9WSURFTykpCisgICAgICAgIG91dF9wa3Qt PnN0cmVhbV9pbmRleCA9IDE7CisgICAgc3RyX3RpbWVfYmFzZSA9IG91dF9mbXRfY3R4LT5zdHJl YW1zW291dF9wa3QtPnN0cmVhbV9pbmRleF0tPnRpbWVfYmFzZTsKIAotICAgIEFWUGFja2V0ICp0 bXBfcGt0OworICAgIGlmICh0eXBlID09IEFWTUVESUFfVFlQRV9BVURJTykKKyAgICAgICAgZW5j X3RpbWVfYmFzZSA9ICgoQVZSYXRpb25hbCAqKW91dF9mbXRfY3R4LT5vcGFxdWUpWzBdOworICAg IGVsc2UKKyAgICAgICAgZW5jX3RpbWVfYmFzZSA9ICgoQVZSYXRpb25hbCAqKW91dF9mbXRfY3R4 LT5vcGFxdWUpWzFdOwogCi0gICAgZmxvYXQgdCwgdGluY3IsIHRpbmNyMjsKKyAgICBhdl9wYWNr ZXRfcmVzY2FsZV90cyhvdXRfcGt0LCBlbmNfdGltZV9iYXNlLCBzdHJfdGltZV9iYXNlKTsKIAot ICAgIHN0cnVjdCBTd3NDb250ZXh0ICpzd3NfY3R4OwotICAgIHN0cnVjdCBTd3JDb250ZXh0ICpz d3JfY3R4OwotfSBPdXRwdXRTdHJlYW07CisgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19JTkZPLCAi c3RyZWFtX2luZGV4PSVkLCBzaXplPSVkLCBwdHNfdGltZT0lc1xuIiwKKyAgICAgICAgICAgb3V0 X3BrdC0+c3RyZWFtX2luZGV4LAorICAgICAgICAgICBvdXRfcGt0LT5zaXplLCBhdl90czJ0aW1l c3RyKG91dF9wa3QtPnB0cywgJnN0cl90aW1lX2Jhc2UpKTsKIAotc3RhdGljIHZvaWQgbG9nX3Bh Y2tldChjb25zdCBBVkZvcm1hdENvbnRleHQgKmZtdF9jdHgsIGNvbnN0IEFWUGFja2V0ICpwa3Qp Ci17Ci0gICAgQVZSYXRpb25hbCAqdGltZV9iYXNlID0gJmZtdF9jdHgtPnN0cmVhbXNbcGt0LT5z dHJlYW1faW5kZXhdLT50aW1lX2Jhc2U7CisgICAgaWYgKChyZXQgPSBhdl9pbnRlcmxlYXZlZF93 cml0ZV9mcmFtZShvdXRfZm10X2N0eCwgb3V0X3BrdCkpIDwgMCkKKyAgICAgICAgbG9nX2Vycm9y KCJFcnJvciBjYWxsaW5nIGF2X2ludGVybGVhdmVkX3dyaXRlX2ZyYW1lKCkiLCAmcmV0KTsKIAot ICAgIHByaW50ZigicHRzOiVzIHB0c190aW1lOiVzIGR0czolcyBkdHNfdGltZTolcyBkdXJhdGlv bjolcyBkdXJhdGlvbl90aW1lOiVzIHN0cmVhbV9pbmRleDolZFxuIiwKLSAgICAgICAgICAgYXZf dHMyc3RyKHBrdC0+cHRzKSwgYXZfdHMydGltZXN0cihwa3QtPnB0cywgdGltZV9iYXNlKSwKLSAg ICAgICAgICAgYXZfdHMyc3RyKHBrdC0+ZHRzKSwgYXZfdHMydGltZXN0cihwa3QtPmR0cywgdGlt ZV9iYXNlKSwKLSAgICAgICAgICAgYXZfdHMyc3RyKHBrdC0+ZHVyYXRpb24pLCBhdl90czJ0aW1l c3RyKHBrdC0+ZHVyYXRpb24sIHRpbWVfYmFzZSksCi0gICAgICAgICAgIHBrdC0+c3RyZWFtX2lu ZGV4KTsKKyAgICByZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IHdyaXRlX2ZyYW1lKEFWRm9y bWF0Q29udGV4dCAqZm10X2N0eCwgQVZDb2RlY0NvbnRleHQgKmMsCi0gICAgICAgICAgICAgICAg ICAgICAgIEFWU3RyZWFtICpzdCwgQVZGcmFtZSAqZnJhbWUsIEFWUGFja2V0ICpwa3QpCitzdGF0 aWMgaW50IGlzX2V4dGVuc2lvbl9zdXBwb3J0ZWQoY29uc3QgY2hhciAqZmlsZW5hbWUpCiB7Ci0g ICAgaW50IHJldDsKLQotICAgIC8vIHNlbmQgdGhlIGZyYW1lIHRvIHRoZSBlbmNvZGVyCi0gICAg cmV0ID0gYXZjb2RlY19zZW5kX2ZyYW1lKGMsIGZyYW1lKTsKLSAgICBpZiAocmV0IDwgMCkgewot ICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yIHNlbmRpbmcgYSBmcmFtZSB0byB0aGUgZW5j b2RlcjogJXNcbiIsCi0gICAgICAgICAgICAgICAgYXZfZXJyMnN0cihyZXQpKTsKLSAgICAgICAg ZXhpdCgxKTsKLSAgICB9Ci0KLSAgICB3aGlsZSAocmV0ID49IDApIHsKLSAgICAgICAgcmV0ID0g YXZjb2RlY19yZWNlaXZlX3BhY2tldChjLCBwa3QpOwotICAgICAgICBpZiAocmV0ID09IEFWRVJS T1IoRUFHQUlOKSB8fCByZXQgPT0gQVZFUlJPUl9FT0YpCi0gICAgICAgICAgICBicmVhazsKLSAg ICAgICAgZWxzZSBpZiAocmV0IDwgMCkgewotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJF cnJvciBlbmNvZGluZyBhIGZyYW1lOiAlc1xuIiwgYXZfZXJyMnN0cihyZXQpKTsKLSAgICAgICAg ICAgIGV4aXQoMSk7Ci0gICAgICAgIH0KKyAgICBjb25zdCBjaGFyICpleHRlbnNpb25zW10gPSB7 Ii5hYWMiLCAiLmF2aSIsICIuYm1wIiwgIi5qcGVnIiwgIi5ta2EiLAorICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAiLm1rdiIsICIubW92IiwgIi5tcDQiLCAiLmZsdiIsICAiLnRzIn07 CisgICAgaW50IGksIHNpemUgPSBzaXplb2YoZXh0ZW5zaW9ucykgLyBzaXplb2YoZXh0ZW5zaW9u c1swXSk7CisgICAgY2hhciAqZG90ID0gc3RycmNocihmaWxlbmFtZSwgJy4nKTsKIAotICAgICAg ICAvKiByZXNjYWxlIG91dHB1dCBwYWNrZXQgdGltZXN0YW1wIHZhbHVlcyBmcm9tIGNvZGVjIHRv IHN0cmVhbSB0aW1lYmFzZSAqLwotICAgICAgICBhdl9wYWNrZXRfcmVzY2FsZV90cyhwa3QsIGMt PnRpbWVfYmFzZSwgc3QtPnRpbWVfYmFzZSk7Ci0gICAgICAgIHBrdC0+c3RyZWFtX2luZGV4ID0g c3QtPmluZGV4OwotCi0gICAgICAgIC8qIFdyaXRlIHRoZSBjb21wcmVzc2VkIGZyYW1lIHRvIHRo ZSBtZWRpYSBmaWxlLiAqLwotICAgICAgICBsb2dfcGFja2V0KGZtdF9jdHgsIHBrdCk7Ci0gICAg ICAgIHJldCA9IGF2X2ludGVybGVhdmVkX3dyaXRlX2ZyYW1lKGZtdF9jdHgsIHBrdCk7Ci0gICAg ICAgIC8qIHBrdCBpcyBub3cgYmxhbmsgKGF2X2ludGVybGVhdmVkX3dyaXRlX2ZyYW1lKCkgdGFr ZXMgb3duZXJzaGlwIG9mCi0gICAgICAgICAqIGl0cyBjb250ZW50cyBhbmQgcmVzZXRzIHBrdCks IHNvIHRoYXQgbm8gdW5yZWZlcmVuY2luZyBpcyBuZWNlc3NhcnkuCi0gICAgICAgICAqIFRoaXMg d291bGQgYmUgZGlmZmVyZW50IGlmIG9uZSB1c2VkIGF2X3dyaXRlX2ZyYW1lKCkuICovCi0gICAg ICAgIGlmIChyZXQgPCAwKSB7Ci0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVycm9yIHdo aWxlIHdyaXRpbmcgb3V0cHV0IHBhY2tldDogJXNcbiIsIGF2X2VycjJzdHIocmV0KSk7Ci0gICAg ICAgICAgICBleGl0KDEpOwotICAgICAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkr KykgeworICAgICAgICBpZiAoZG90ICYmICFzdHJjbXAoZG90LCBleHRlbnNpb25zW2ldKSkKKyAg ICAgICAgICAgIHJldHVybiAxOwogICAgIH0KIAotICAgIHJldHVybiByZXQgPT0gQVZFUlJPUl9F T0YgPyAxIDogMDsKKyAgICBsb2dfZXJyb3IoIkZpbGUgZXh0ZW5zaW9uIG5vdCBzdXBwb3J0ZWQi LCBOVUxMKTsKKyAgICBhdl9sb2coTlVMTCwgQVZfTE9HX1dBUk5JTkcsICJQbGVhc2UgY2hvb3Nl IG9uZSBvZiB0aGUgZm9sbG93aW5nIGV4dGVuc2lvbnM6ICIpOworICAgIGZvciAoaSA9IDA7IGkg PCBzaXplIC0gMTsgaSsrKQorICAgICAgICBhdl9sb2coTlVMTCwgQVZfTE9HX1dBUk5JTkcsICIl cywgIiwgZXh0ZW5zaW9uc1tpXSk7CisgICAgYXZfbG9nKE5VTEwsIEFWX0xPR19XQVJOSU5HLCAi JXNcbiIsIGV4dGVuc2lvbnNbc2l6ZS0xXSk7CisKKyAgICByZXR1cm4gMDsKIH0KIAotLyogQWRk IGFuIG91dHB1dCBzdHJlYW0uICovCi1zdGF0aWMgdm9pZCBhZGRfc3RyZWFtKE91dHB1dFN0cmVh bSAqb3N0LCBBVkZvcm1hdENvbnRleHQgKm9jLAotICAgICAgICAgICAgICAgICAgICAgICBjb25z dCBBVkNvZGVjICoqY29kZWMsCi0gICAgICAgICAgICAgICAgICAgICAgIGVudW0gQVZDb2RlY0lE IGNvZGVjX2lkKQorc3RhdGljIGludCBnZXRfZGVmYXVsdF9lbmNfcGFyYW1zKEFWQ29kZWNQYXJh bWV0ZXJzICpwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qg Y2hhciAqZm5hbWUsIGVudW0gQVZNZWRpYVR5cGUgdHlwZSkKIHsKLSAgICBBVkNvZGVjQ29udGV4 dCAqYzsKLSAgICBpbnQgaTsKLQotICAgIC8qIGZpbmQgdGhlIGVuY29kZXIgKi8KLSAgICAqY29k ZWMgPSBhdmNvZGVjX2ZpbmRfZW5jb2Rlcihjb2RlY19pZCk7Ci0gICAgaWYgKCEoKmNvZGVjKSkg ewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNvdWxkIG5vdCBmaW5kIGVuY29kZXIgZm9yICcl cydcbiIsCi0gICAgICAgICAgICAgICAgYXZjb2RlY19nZXRfbmFtZShjb2RlY19pZCkpOwotICAg ICAgICBleGl0KDEpOwotICAgIH0KLQotICAgIG9zdC0+dG1wX3BrdCA9IGF2X3BhY2tldF9hbGxv YygpOwotICAgIGlmICghb3N0LT50bXBfcGt0KSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAi Q291bGQgbm90IGFsbG9jYXRlIEFWUGFja2V0XG4iKTsKLSAgICAgICAgZXhpdCgxKTsKLSAgICB9 Ci0KLSAgICBvc3QtPnN0ID0gYXZmb3JtYXRfbmV3X3N0cmVhbShvYywgTlVMTCk7Ci0gICAgaWYg KCFvc3QtPnN0KSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiQ291bGQgbm90IGFsbG9jYXRl IHN0cmVhbVxuIik7Ci0gICAgICAgIGV4aXQoMSk7Ci0gICAgfQotICAgIG9zdC0+c3QtPmlkID0g b2MtPm5iX3N0cmVhbXMtMTsKLSAgICBjID0gYXZjb2RlY19hbGxvY19jb250ZXh0MygqY29kZWMp OwotICAgIGlmICghYykgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNvdWxkIG5vdCBhbGxv YyBhbiBlbmNvZGluZyBjb250ZXh0XG4iKTsKLSAgICAgICAgZXhpdCgxKTsKLSAgICB9Ci0gICAg b3N0LT5lbmMgPSBjOwotCi0gICAgc3dpdGNoICgoKmNvZGVjKS0+dHlwZSkgewotICAgIGNhc2Ug QVZNRURJQV9UWVBFX0FVRElPOgotICAgICAgICBjLT5zYW1wbGVfZm10ICA9ICgqY29kZWMpLT5z YW1wbGVfZm10cyA/Ci0gICAgICAgICAgICAoKmNvZGVjKS0+c2FtcGxlX2ZtdHNbMF0gOiBBVl9T QU1QTEVfRk1UX0ZMVFA7Ci0gICAgICAgIGMtPmJpdF9yYXRlICAgID0gNjQwMDA7Ci0gICAgICAg IGMtPnNhbXBsZV9yYXRlID0gNDQxMDA7Ci0gICAgICAgIGlmICgoKmNvZGVjKS0+c3VwcG9ydGVk X3NhbXBsZXJhdGVzKSB7Ci0gICAgICAgICAgICBjLT5zYW1wbGVfcmF0ZSA9ICgqY29kZWMpLT5z dXBwb3J0ZWRfc2FtcGxlcmF0ZXNbMF07Ci0gICAgICAgICAgICBmb3IgKGkgPSAwOyAoKmNvZGVj KS0+c3VwcG9ydGVkX3NhbXBsZXJhdGVzW2ldOyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAo KCpjb2RlYyktPnN1cHBvcnRlZF9zYW1wbGVyYXRlc1tpXSA9PSA0NDEwMCkKLSAgICAgICAgICAg ICAgICAgICAgYy0+c2FtcGxlX3JhdGUgPSA0NDEwMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAg fQotICAgICAgICBhdl9jaGFubmVsX2xheW91dF9jb3B5KCZjLT5jaF9sYXlvdXQsICYoQVZDaGFu bmVsTGF5b3V0KUFWX0NIQU5ORUxfTEFZT1VUX1NURVJFTyk7Ci0gICAgICAgIG9zdC0+c3QtPnRp bWVfYmFzZSA9IChBVlJhdGlvbmFsKXsgMSwgYy0+c2FtcGxlX3JhdGUgfTsKLSAgICAgICAgYnJl YWs7Ci0KLSAgICBjYXNlIEFWTUVESUFfVFlQRV9WSURFTzoKLSAgICAgICAgYy0+Y29kZWNfaWQg PSBjb2RlY19pZDsKLQotICAgICAgICBjLT5iaXRfcmF0ZSA9IDQwMDAwMDsKLSAgICAgICAgLyog UmVzb2x1dGlvbiBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgdHdvLiAqLwotICAgICAgICBjLT53aWR0 aCAgICA9IDM1MjsKLSAgICAgICAgYy0+aGVpZ2h0ICAgPSAyODg7Ci0gICAgICAgIC8qIHRpbWVi YXNlOiBUaGlzIGlzIHRoZSBmdW5kYW1lbnRhbCB1bml0IG9mIHRpbWUgKGluIHNlY29uZHMpIGlu IHRlcm1zCi0gICAgICAgICAqIG9mIHdoaWNoIGZyYW1lIHRpbWVzdGFtcHMgYXJlIHJlcHJlc2Vu dGVkLiBGb3IgZml4ZWQtZnBzIGNvbnRlbnQsCi0gICAgICAgICAqIHRpbWViYXNlIHNob3VsZCBi ZSAxL2ZyYW1lcmF0ZSBhbmQgdGltZXN0YW1wIGluY3JlbWVudHMgc2hvdWxkIGJlCi0gICAgICAg ICAqIGlkZW50aWNhbCB0byAxLiAqLwotICAgICAgICBvc3QtPnN0LT50aW1lX2Jhc2UgPSAoQVZS YXRpb25hbCl7IDEsIFNUUkVBTV9GUkFNRV9SQVRFIH07Ci0gICAgICAgIGMtPnRpbWVfYmFzZSAg ICAgICA9IG9zdC0+c3QtPnRpbWVfYmFzZTsKLQotICAgICAgICBjLT5nb3Bfc2l6ZSAgICAgID0g MTI7IC8qIGVtaXQgb25lIGludHJhIGZyYW1lIGV2ZXJ5IHR3ZWx2ZSBmcmFtZXMgYXQgbW9zdCAq LwotICAgICAgICBjLT5waXhfZm10ICAgICAgID0gU1RSRUFNX1BJWF9GTVQ7Ci0gICAgICAgIGlm IChjLT5jb2RlY19pZCA9PSBBVl9DT0RFQ19JRF9NUEVHMlZJREVPKSB7Ci0gICAgICAgICAgICAv KiBqdXN0IGZvciB0ZXN0aW5nLCB3ZSBhbHNvIGFkZCBCLWZyYW1lcyAqLwotICAgICAgICAgICAg Yy0+bWF4X2JfZnJhbWVzID0gMjsKLSAgICAgICAgfQotICAgICAgICBpZiAoYy0+Y29kZWNfaWQg PT0gQVZfQ09ERUNfSURfTVBFRzFWSURFTykgewotICAgICAgICAgICAgLyogTmVlZGVkIHRvIGF2 b2lkIHVzaW5nIG1hY3JvYmxvY2tzIGluIHdoaWNoIHNvbWUgY29lZmZzIG92ZXJmbG93LgotICAg ICAgICAgICAgICogVGhpcyBkb2VzIG5vdCBoYXBwZW4gd2l0aCBub3JtYWwgdmlkZW8sIGl0IGp1 c3QgaGFwcGVucyBoZXJlIGFzCi0gICAgICAgICAgICAgKiB0aGUgbW90aW9uIG9mIHRoZSBjaHJv bWEgcGxhbmUgZG9lcyBub3QgbWF0Y2ggdGhlIGx1bWEgcGxhbmUuICovCi0gICAgICAgICAgICBj LT5tYl9kZWNpc2lvbiA9IDI7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0KLSAgICBkZWZh dWx0OgotICAgICAgICBicmVhazsKKyAgICBBVkZvcm1hdENvbnRleHQgKnRtcF9mY3R4OworICAg IGVudW0gQVZDb2RlY0lEIGlkOworICAgIGNvbnN0IEFWQ29kZWMgKmM7CisgICAgaW50IHJldCA9 IDA7CisKKyAgICBpZiAoKHJldCA9IGF2Zm9ybWF0X2FsbG9jX291dHB1dF9jb250ZXh0MigmdG1w X2ZjdHgsIE5VTEwsIE5VTEwsIGZuYW1lKSkgPCAwKSB7CisgICAgICAgIGxvZ19lcnJvcigiQ291 bGQgbm90IGdldCBkZWZhdWx0IGVuY29kZXIiLCAmcmV0KTsKKyAgICAgICAgcmV0dXJuIEFWRVJS T1JfRVhJVDsKICAgICB9CiAKLSAgICAvKiBTb21lIGZvcm1hdHMgd2FudCBzdHJlYW0gaGVhZGVy cyB0byBiZSBzZXBhcmF0ZS4gKi8KLSAgICBpZiAob2MtPm9mb3JtYXQtPmZsYWdzICYgQVZGTVRf R0xPQkFMSEVBREVSKQotICAgICAgICBjLT5mbGFncyB8PSBBVl9DT0RFQ19GTEFHX0dMT0JBTF9I RUFERVI7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKi8KLS8qIGF1ZGlvIG91dHB1dCAqLwotCi1zdGF0aWMgQVZGcmFt ZSAqYWxsb2NfYXVkaW9fZnJhbWUoZW51bSBBVlNhbXBsZUZvcm1hdCBzYW1wbGVfZm10LAotICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFWQ2hhbm5lbExheW91dCAqY2hh bm5lbF9sYXlvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNhbXBs ZV9yYXRlLCBpbnQgbmJfc2FtcGxlcykKLXsKLSAgICBBVkZyYW1lICpmcmFtZSA9IGF2X2ZyYW1l X2FsbG9jKCk7Ci0gICAgaW50IHJldDsKKyAgICBpZCA9ICh0eXBlID09IEFWTUVESUFfVFlQRV9B VURJTykgPyB0bXBfZmN0eC0+b2Zvcm1hdC0+YXVkaW9fY29kZWMgOgorICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIHRtcF9mY3R4LT5vZm9ybWF0LT52aWRlb19jb2RlYzsK IAotICAgIGlmICghZnJhbWUpIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJFcnJvciBhbGxv Y2F0aW5nIGFuIGF1ZGlvIGZyYW1lXG4iKTsKLSAgICAgICAgZXhpdCgxKTsKKyAgICBpZiAoIShj ID0gYXZjb2RlY19maW5kX2VuY29kZXIoaWQpKSkgeworICAgICAgICBhdmZvcm1hdF9mcmVlX2Nv bnRleHQodG1wX2ZjdHgpOworICAgICAgICByZXR1cm4gcmV0OwogICAgIH0KIAotICAgIGZyYW1l LT5mb3JtYXQgPSBzYW1wbGVfZm10OwotICAgIGF2X2NoYW5uZWxfbGF5b3V0X2NvcHkoJmZyYW1l LT5jaF9sYXlvdXQsIGNoYW5uZWxfbGF5b3V0KTsKLSAgICBmcmFtZS0+c2FtcGxlX3JhdGUgPSBz YW1wbGVfcmF0ZTsKLSAgICBmcmFtZS0+bmJfc2FtcGxlcyA9IG5iX3NhbXBsZXM7Ci0KLSAgICBp ZiAobmJfc2FtcGxlcykgewotICAgICAgICByZXQgPSBhdl9mcmFtZV9nZXRfYnVmZmVyKGZyYW1l LCAwKTsKLSAgICAgICAgaWYgKHJldCA8IDApIHsKLSAgICAgICAgICAgIGZwcmludGYoc3RkZXJy LCAiRXJyb3IgYWxsb2NhdGluZyBhbiBhdWRpbyBidWZmZXJcbiIpOwotICAgICAgICAgICAgZXhp dCgxKTsKLSAgICAgICAgfQorICAgIHBhcmFtcy0+Y29kZWNfdHlwZSA9IGMtPnR5cGU7CisgICAg cGFyYW1zLT5jb2RlY19pZCAgID0gYy0+IGlkOworICAgIGlmIChjLT50eXBlID09IEFWTUVESUFf VFlQRV9BVURJTykgeworICAgICAgICBwYXJhbXMtPmZvcm1hdCAgICAgID0gYy0+c2FtcGxlX2Zt dHMgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy0+c2FtcGxlX2ZtdHNbMF0gOiBB Vl9TQU1QTEVfRk1UX0ZMVFA7CisgICAgICAgIHBhcmFtcy0+Y2hfbGF5b3V0ICAgPSAoQVZDaGFu bmVsTGF5b3V0KUFWX0NIQU5ORUxfTEFZT1VUX1NURVJFTzsKKyAgICAgICAgcGFyYW1zLT5zYW1w bGVfcmF0ZSA9IGMtPnN1cHBvcnRlZF9zYW1wbGVyYXRlcyA/CisgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBjLT5zdXBwb3J0ZWRfc2FtcGxlcmF0ZXNbMF0gOiA0NDEwMDsKKyAgICB9IGVs c2UgaWYgKGMtPnR5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPKSB7CisgICAgICAgIHBhcmFtcy0+ Zm9ybWF0ID0gYy0+cGl4X2ZtdHMgPyBjLT5waXhfZm10c1swXSA6IEFWX1BJWF9GTVRfWVVWNDIw UDsKICAgICB9CisgICAgYXZmb3JtYXRfZnJlZV9jb250ZXh0KHRtcF9mY3R4KTsKIAotICAgIHJl dHVybiBmcmFtZTsKKyAgICByZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgdm9pZCBvcGVuX2F1ZGlv KEFWRm9ybWF0Q29udGV4dCAqb2MsIGNvbnN0IEFWQ29kZWMgKmNvZGVjLAotICAgICAgICAgICAg ICAgICAgICAgICBPdXRwdXRTdHJlYW0gKm9zdCwgQVZEaWN0aW9uYXJ5ICpvcHRfYXJnKQorc3Rh dGljIGludCBpbml0X2VuY29kZXIoQVZDb2RlY0NvbnRleHQgKiplbmNfY3R4LCBBVkNvZGVjUGFy YW1ldGVycyAqcGFyYW1zKQogewotICAgIEFWQ29kZWNDb250ZXh0ICpjOwotICAgIGludCBuYl9z YW1wbGVzOworICAgIGNvbnN0IEFWQ29kZWMgKmNvZGVjID0gTlVMTDsKICAgICBpbnQgcmV0Owot ICAgIEFWRGljdGlvbmFyeSAqb3B0ID0gTlVMTDsKIAotICAgIGMgPSBvc3QtPmVuYzsKLQotICAg IC8qIG9wZW4gaXQgKi8KLSAgICBhdl9kaWN0X2NvcHkoJm9wdCwgb3B0X2FyZywgMCk7Ci0gICAg cmV0ID0gYXZjb2RlY19vcGVuMihjLCBjb2RlYywgJm9wdCk7Ci0gICAgYXZfZGljdF9mcmVlKCZv cHQpOwotICAgIGlmIChyZXQgPCAwKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiQ291bGQg bm90IG9wZW4gYXVkaW8gY29kZWM6ICVzXG4iLCBhdl9lcnIyc3RyKHJldCkpOwotICAgICAgICBl eGl0KDEpOworICAgIGlmICghKGNvZGVjID0gYXZjb2RlY19maW5kX2VuY29kZXIocGFyYW1zLT5j b2RlY19pZCkpKSB7CisgICAgICAgIGxvZ19lcnJvcigiQ291bGQgbm90IGZpbmQgZW5jb2RlciIs IE5VTEwpOworICAgICAgICByZXR1cm4gQVZFUlJPUl9FWElUOwogICAgIH0KIAotICAgIC8qIGlu aXQgc2lnbmFsIGdlbmVyYXRvciAqLwotICAgIG9zdC0+dCAgICAgPSAwOwotICAgIG9zdC0+dGlu Y3IgPSAyICogTV9QSSAqIDExMC4wIC8gYy0+c2FtcGxlX3JhdGU7Ci0gICAgLyogaW5jcmVtZW50 IGZyZXF1ZW5jeSBieSAxMTAgSHogcGVyIHNlY29uZCAqLwotICAgIG9zdC0+dGluY3IyID0gMiAq IE1fUEkgKiAxMTAuMCAvIGMtPnNhbXBsZV9yYXRlIC8gYy0+c2FtcGxlX3JhdGU7Ci0KLSAgICBp ZiAoYy0+Y29kZWMtPmNhcGFiaWxpdGllcyAmIEFWX0NPREVDX0NBUF9WQVJJQUJMRV9GUkFNRV9T SVpFKQotICAgICAgICBuYl9zYW1wbGVzID0gMTAwMDA7Ci0gICAgZWxzZQotICAgICAgICBuYl9z YW1wbGVzID0gYy0+ZnJhbWVfc2l6ZTsKLQotICAgIG9zdC0+ZnJhbWUgICAgID0gYWxsb2NfYXVk aW9fZnJhbWUoYy0+c2FtcGxlX2ZtdCwgJmMtPmNoX2xheW91dCwKLSAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIGMtPnNhbXBsZV9yYXRlLCBuYl9zYW1wbGVzKTsKLSAgICBv c3QtPnRtcF9mcmFtZSA9IGFsbG9jX2F1ZGlvX2ZyYW1lKEFWX1NBTVBMRV9GTVRfUzE2LCAmYy0+ Y2hfbGF5b3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy0+c2Ft cGxlX3JhdGUsIG5iX3NhbXBsZXMpOwotCi0gICAgLyogY29weSB0aGUgc3RyZWFtIHBhcmFtZXRl cnMgdG8gdGhlIG11eGVyICovCi0gICAgcmV0ID0gYXZjb2RlY19wYXJhbWV0ZXJzX2Zyb21fY29u dGV4dChvc3QtPnN0LT5jb2RlY3BhciwgYyk7Ci0gICAgaWYgKHJldCA8IDApIHsKLSAgICAgICAg ZnByaW50ZihzdGRlcnIsICJDb3VsZCBub3QgY29weSB0aGUgc3RyZWFtIHBhcmFtZXRlcnNcbiIp OwotICAgICAgICBleGl0KDEpOworICAgIGlmICghKCplbmNfY3R4ID0gYXZjb2RlY19hbGxvY19j b250ZXh0Myhjb2RlYykpKSB7CisgICAgICAgIGxvZ19lcnJvcigiQ291bGQgbm90IGFsbG9jYXRl IHRoZSBlbmNvZGluZyBjb250ZXh0IiwgTlVMTCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0VY SVQ7CiAgICAgfQogCi0gICAgLyogY3JlYXRlIHJlc2FtcGxlciBjb250ZXh0ICovCi0gICAgb3N0 LT5zd3JfY3R4ID0gc3dyX2FsbG9jKCk7Ci0gICAgaWYgKCFvc3QtPnN3cl9jdHgpIHsKLSAgICAg ICAgZnByaW50ZihzdGRlcnIsICJDb3VsZCBub3QgYWxsb2NhdGUgcmVzYW1wbGVyIGNvbnRleHRc biIpOwotICAgICAgICBleGl0KDEpOworICAgICgqZW5jX2N0eCktPmNvZGVjX2lkICAgPSBwYXJh bXMtPmNvZGVjX2lkOworICAgICgqZW5jX2N0eCktPmNvZGVjX3R5cGUgPSBwYXJhbXMtPmNvZGVj X3R5cGU7CisgICAgaWYgKHBhcmFtcy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8p IHsKKyAgICAgICAgKCplbmNfY3R4KS0+c2FtcGxlX2ZtdCAgPSBwYXJhbXMtPmZvcm1hdDsKKyAg ICAgICAgKCplbmNfY3R4KS0+c2FtcGxlX3JhdGUgPSBwYXJhbXMtPnNhbXBsZV9yYXRlOworICAg ICAgICAoKmVuY19jdHgpLT50aW1lX2Jhc2UgICA9IGF2X21ha2VfcSgxLCBwYXJhbXMtPnNhbXBs ZV9yYXRlKTsKKyAgICAgICAgKCplbmNfY3R4KS0+Y2hfbGF5b3V0ICAgPSBwYXJhbXMtPmNoX2xh eW91dDsKKyAgICB9IGVsc2UgaWYgKHBhcmFtcy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVf VklERU8pIHsKKyAgICAgICAgKCplbmNfY3R4KS0+d2lkdGggICAgICA9IHBhcmFtcy0+d2lkdGg7 CisgICAgICAgICgqZW5jX2N0eCktPmhlaWdodCAgICAgPSBwYXJhbXMtPmhlaWdodDsKKyAgICAg ICAgKCplbmNfY3R4KS0+dGltZV9iYXNlICA9IGF2X21ha2VfcSgxLCBWSURFT19GUkFNRV9SQVRF KTsKKyAgICAgICAgKCplbmNfY3R4KS0+Z29wX3NpemUgICA9IDEyOworICAgICAgICAoKmVuY19j dHgpLT5waXhfZm10ICAgID0gcGFyYW1zLT5mb3JtYXQ7CiAgICAgfQogCi0gICAgLyogc2V0IG9w dGlvbnMgKi8KLSAgICBhdl9vcHRfc2V0X2NobGF5b3V0ICAob3N0LT5zd3JfY3R4LCAiaW5fY2hs YXlvdXQiLCAgICAgICAmYy0+Y2hfbGF5b3V0LCAgICAgIDApOwotICAgIGF2X29wdF9zZXRfaW50 ICAgICAgIChvc3QtPnN3cl9jdHgsICJpbl9zYW1wbGVfcmF0ZSIsICAgICBjLT5zYW1wbGVfcmF0 ZSwgICAgMCk7Ci0gICAgYXZfb3B0X3NldF9zYW1wbGVfZm10KG9zdC0+c3dyX2N0eCwgImluX3Nh bXBsZV9mbXQiLCAgICAgIEFWX1NBTVBMRV9GTVRfUzE2LCAwKTsKLSAgICBhdl9vcHRfc2V0X2No bGF5b3V0ICAob3N0LT5zd3JfY3R4LCAib3V0X2NobGF5b3V0IiwgICAgICAmYy0+Y2hfbGF5b3V0 LCAgICAgIDApOwotICAgIGF2X29wdF9zZXRfaW50ICAgICAgIChvc3QtPnN3cl9jdHgsICJvdXRf c2FtcGxlX3JhdGUiLCAgICBjLT5zYW1wbGVfcmF0ZSwgICAgMCk7Ci0gICAgYXZfb3B0X3NldF9z YW1wbGVfZm10KG9zdC0+c3dyX2N0eCwgIm91dF9zYW1wbGVfZm10IiwgICAgIGMtPnNhbXBsZV9m bXQsICAgICAwKTsKLQotICAgIC8qIGluaXRpYWxpemUgdGhlIHJlc2FtcGxpbmcgY29udGV4dCAq LwotICAgIGlmICgocmV0ID0gc3dyX2luaXQob3N0LT5zd3JfY3R4KSkgPCAwKSB7Ci0gICAgICAg IGZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIGluaXRpYWxpemUgdGhlIHJlc2FtcGxpbmcgY29u dGV4dFxuIik7Ci0gICAgICAgIGV4aXQoMSk7CisgICAgaWYgKChyZXQgPSBhdmNvZGVjX29wZW4y KCplbmNfY3R4LCBjb2RlYywgTlVMTCkpIDwgMCkgeworICAgICAgICBsb2dfZXJyb3IoIkNvdWxk IG5vdCBvcGVuIGlucHV0IGNvZGVjIiwgJnJldCk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAg fSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogfQogCi0vKiBQcmVwYXJlIGEgMTYg Yml0IGR1bW15IGF1ZGlvIGZyYW1lIG9mICdmcmFtZV9zaXplJyBzYW1wbGVzIGFuZAotICogJ25i X2NoYW5uZWxzJyBjaGFubmVscy4gKi8KLXN0YXRpYyBBVkZyYW1lICpnZXRfYXVkaW9fZnJhbWUo T3V0cHV0U3RyZWFtICpvc3QpCitzdGF0aWMgaW50IGluaXRfYXVkaW9fY29udmVydChzdHJ1Y3Qg U3dyQ29udGV4dCAqKmN0eCwgQVZDb2RlY1BhcmFtZXRlcnMgKmluX3BhcmFtcywKKyAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIEFWQ29kZWNQYXJhbWV0ZXJzICpvdXRfcGFyYW1zKQogewot ICAgIEFWRnJhbWUgKmZyYW1lID0gb3N0LT50bXBfZnJhbWU7Ci0gICAgaW50IGosIGksIHY7Ci0g ICAgaW50MTZfdCAqcSA9IChpbnQxNl90KilmcmFtZS0+ZGF0YVswXTsKLQotICAgIC8qIGNoZWNr IGlmIHdlIHdhbnQgdG8gZ2VuZXJhdGUgbW9yZSBmcmFtZXMgKi8KLSAgICBpZiAoYXZfY29tcGFy ZV90cyhvc3QtPm5leHRfcHRzLCBvc3QtPmVuYy0+dGltZV9iYXNlLAotICAgICAgICAgICAgICAg ICAgICAgIFNUUkVBTV9EVVJBVElPTiwgKEFWUmF0aW9uYWwpeyAxLCAxIH0pID4gMCkKLSAgICAg ICAgcmV0dXJuIE5VTEw7Ci0KLSAgICBmb3IgKGogPSAwOyBqIDxmcmFtZS0+bmJfc2FtcGxlczsg aisrKSB7Ci0gICAgICAgIHYgPSAoaW50KShzaW4ob3N0LT50KSAqIDEwMDAwKTsKLSAgICAgICAg Zm9yIChpID0gMDsgaSA8IG9zdC0+ZW5jLT5jaF9sYXlvdXQubmJfY2hhbm5lbHM7IGkrKykKLSAg ICAgICAgICAgICpxKysgPSB2OwotICAgICAgICBvc3QtPnQgICAgICs9IG9zdC0+dGluY3I7Ci0g ICAgICAgIG9zdC0+dGluY3IgKz0gb3N0LT50aW5jcjI7CisgICAgc3dyX2FsbG9jX3NldF9vcHRz MihjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAmKG91dF9wYXJhbXMtPmNoX2xheW91dCks CisgICAgICAgICAgICAgICAgICAgICAgICBvdXRfcGFyYW1zLT5mb3JtYXQsIG91dF9wYXJhbXMt PnNhbXBsZV9yYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgJihpbl9wYXJhbXMtPmNoX2xh eW91dCksCisgICAgICAgICAgICAgICAgICAgICAgICBpbl9wYXJhbXMtPmZvcm1hdCwgaW5fcGFy YW1zLT5zYW1wbGVfcmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsIE5VTEwpOworICAg IGlmICghKmN0eCkgeworICAgICAgICBsb2dfZXJyb3IoIkNvdWxkIG5vdCBhbGxvY2F0ZSByZXNh bXBsZSBjb250ZXh0IiwgTlVMTCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CiAg ICAgfQogCi0gICAgZnJhbWUtPnB0cyA9IG9zdC0+bmV4dF9wdHM7Ci0gICAgb3N0LT5uZXh0X3B0 cyAgKz0gZnJhbWUtPm5iX3NhbXBsZXM7Ci0KLSAgICByZXR1cm4gZnJhbWU7CisgICAgcmV0dXJu IDA7CiB9CiAKLS8qCi0gKiBlbmNvZGUgb25lIGF1ZGlvIGZyYW1lIGFuZCBzZW5kIGl0IHRvIHRo ZSBtdXhlcgotICogcmV0dXJuIDEgd2hlbiBlbmNvZGluZyBpcyBmaW5pc2hlZCwgMCBvdGhlcndp c2UKLSAqLwotc3RhdGljIGludCB3cml0ZV9hdWRpb19mcmFtZShBVkZvcm1hdENvbnRleHQgKm9j LCBPdXRwdXRTdHJlYW0gKm9zdCkKK3N0YXRpYyBpbnQgaW5pdF92aWRlb19jb252ZXJ0KHN0cnVj dCBTd3NDb250ZXh0ICoqY3R4LCBBVkNvZGVjUGFyYW1ldGVycyAqaW5fcGFyYW1zLAorICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgQVZDb2RlY1BhcmFtZXRlcnMgKm91dF9wYXJhbXMpCiB7 Ci0gICAgQVZDb2RlY0NvbnRleHQgKmM7Ci0gICAgQVZGcmFtZSAqZnJhbWU7Ci0gICAgaW50IHJl dDsKLSAgICBpbnQgZHN0X25iX3NhbXBsZXM7Ci0KLSAgICBjID0gb3N0LT5lbmM7Ci0KLSAgICBm cmFtZSA9IGdldF9hdWRpb19mcmFtZShvc3QpOwotCi0gICAgaWYgKGZyYW1lKSB7Ci0gICAgICAg IC8qIGNvbnZlcnQgc2FtcGxlcyBmcm9tIG5hdGl2ZSBmb3JtYXQgdG8gZGVzdGluYXRpb24gY29k ZWMgZm9ybWF0LCB1c2luZyB0aGUgcmVzYW1wbGVyICovCi0gICAgICAgIC8qIGNvbXB1dGUgZGVz dGluYXRpb24gbnVtYmVyIG9mIHNhbXBsZXMgKi8KLSAgICAgICAgZHN0X25iX3NhbXBsZXMgPSBh dl9yZXNjYWxlX3JuZChzd3JfZ2V0X2RlbGF5KG9zdC0+c3dyX2N0eCwgYy0+c2FtcGxlX3JhdGUp ICsgZnJhbWUtPm5iX3NhbXBsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgYy0+c2FtcGxlX3JhdGUsIGMtPnNhbXBsZV9yYXRlLCBBVl9ST1VORF9VUCk7Ci0gICAg ICAgIGF2X2Fzc2VydDAoZHN0X25iX3NhbXBsZXMgPT0gZnJhbWUtPm5iX3NhbXBsZXMpOwotCi0g ICAgICAgIC8qIHdoZW4gd2UgcGFzcyBhIGZyYW1lIHRvIHRoZSBlbmNvZGVyLCBpdCBtYXkga2Vl cCBhIHJlZmVyZW5jZSB0byBpdAotICAgICAgICAgKiBpbnRlcm5hbGx5OwotICAgICAgICAgKiBt YWtlIHN1cmUgd2UgZG8gbm90IG92ZXJ3cml0ZSBpdCBoZXJlCi0gICAgICAgICAqLwotICAgICAg ICByZXQgPSBhdl9mcmFtZV9tYWtlX3dyaXRhYmxlKG9zdC0+ZnJhbWUpOwotICAgICAgICBpZiAo cmV0IDwgMCkKLSAgICAgICAgICAgIGV4aXQoMSk7Ci0KLSAgICAgICAgLyogY29udmVydCB0byBk ZXN0aW5hdGlvbiBmb3JtYXQgKi8KLSAgICAgICAgcmV0ID0gc3dyX2NvbnZlcnQob3N0LT5zd3Jf Y3R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICBvc3QtPmZyYW1lLT5kYXRhLCBkc3RfbmJf c2FtcGxlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKiopZnJh bWUtPmRhdGEsIGZyYW1lLT5uYl9zYW1wbGVzKTsKLSAgICAgICAgaWYgKHJldCA8IDApIHsKLSAg ICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRXJyb3Igd2hpbGUgY29udmVydGluZ1xuIik7Ci0g ICAgICAgICAgICBleGl0KDEpOwotICAgICAgICB9Ci0gICAgICAgIGZyYW1lID0gb3N0LT5mcmFt ZTsKLQotICAgICAgICBmcmFtZS0+cHRzID0gYXZfcmVzY2FsZV9xKG9zdC0+c2FtcGxlc19jb3Vu dCwgKEFWUmF0aW9uYWwpezEsIGMtPnNhbXBsZV9yYXRlfSwgYy0+dGltZV9iYXNlKTsKLSAgICAg ICAgb3N0LT5zYW1wbGVzX2NvdW50ICs9IGRzdF9uYl9zYW1wbGVzOworICAgICpjdHggPSBzd3Nf Z2V0Q29udGV4dChpbl9wYXJhbXMtPndpZHRoLCBpbl9wYXJhbXMtPmhlaWdodCwKKyAgICAgICAg ICAgICAgICAgICAgICAgICAgaW5fcGFyYW1zLT5mb3JtYXQsCisgICAgICAgICAgICAgICAgICAg ICAgICAgIG91dF9wYXJhbXMtPndpZHRoLCBvdXRfcGFyYW1zLT5oZWlnaHQsCisgICAgICAgICAg ICAgICAgICAgICAgICAgIG91dF9wYXJhbXMtPmNvZGVjX2lkID09IG91dF9wYXJhbXMtPmZvcm1h dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVklERU9fU0NBTEVfRkxBR1MsIE5VTEwsIE5V TEwsIE5VTEwpOworICAgIGlmICghKmN0eCkgeworICAgICAgICBsb2dfZXJyb3IoIkNvdWxkIG5v dCBhbGxvY2F0ZSBzY2FsZSBjb250ZXh0IiwgTlVMTCk7CisgICAgICAgIHJldHVybiBBVkVSUk9S KEVOT01FTSk7CiAgICAgfQogCi0gICAgcmV0dXJuIHdyaXRlX2ZyYW1lKG9jLCBjLCBvc3QtPnN0 LCBmcmFtZSwgb3N0LT50bXBfcGt0KTsKKyAgICByZXR1cm4gMDsKIH0KIAotLyoqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyog dmlkZW8gb3V0cHV0ICovCi0KLXN0YXRpYyBBVkZyYW1lICphbGxvY19waWN0dXJlKGVudW0gQVZQ aXhlbEZvcm1hdCBwaXhfZm10LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpCitzdGF0aWMgaW50IGlu aXRfYXZmcmFtZShBVkZyYW1lICoqZnJhbWUsIEFWQ29kZWNQYXJhbWV0ZXJzICpwYXJhbXMpCiB7 Ci0gICAgQVZGcmFtZSAqcGljdHVyZTsKICAgICBpbnQgcmV0OwogCi0gICAgcGljdHVyZSA9IGF2 X2ZyYW1lX2FsbG9jKCk7Ci0gICAgaWYgKCFwaWN0dXJlKQotICAgICAgICByZXR1cm4gTlVMTDsK KyAgICBpZiAoISgqZnJhbWUgPSBhdl9mcmFtZV9hbGxvYygpKSkgeworICAgICAgICBsb2dfZXJy b3IoIkNvdWxkIG5vdCBhbGxvY2F0ZSBBVkZyYW1lIiwgTlVMTCk7CisgICAgICAgIHJldHVybiBB VkVSUk9SKEVOT01FTSk7CisgICAgfQogCi0gICAgcGljdHVyZS0+Zm9ybWF0ID0gcGl4X2ZtdDsK LSAgICBwaWN0dXJlLT53aWR0aCAgPSB3aWR0aDsKLSAgICBwaWN0dXJlLT5oZWlnaHQgPSBoZWln aHQ7CisgICAgKCpmcmFtZSktPm9wYXF1ZSA9ICZwYXJhbXMtPmNvZGVjX3R5cGU7CisgICAgaWYg KHBhcmFtcy0+Y29kZWNfdHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8pIHsKKyAgICAgICAgKCpm cmFtZSktPm5iX3NhbXBsZXMgID0gcGFyYW1zLT5mcmFtZV9zaXplOworICAgICAgICAoKmZyYW1l KS0+c2FtcGxlX3JhdGUgPSBwYXJhbXMtPnNhbXBsZV9yYXRlOworICAgICAgICAoKmZyYW1lKS0+ Zm9ybWF0ICAgICAgPSBwYXJhbXMtPmZvcm1hdDsKKyAgICAgICAgKCpmcmFtZSktPmNoX2xheW91 dCAgID0gcGFyYW1zLT5jaF9sYXlvdXQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgKCpmcmFtZSkt PndpZHRoICA9IHBhcmFtcy0+d2lkdGg7CisgICAgICAgICgqZnJhbWUpLT5oZWlnaHQgPSBwYXJh bXMtPmhlaWdodDsKKyAgICAgICAgKCpmcmFtZSktPmZvcm1hdCA9IHBhcmFtcy0+Zm9ybWF0Owor ICAgIH0KIAotICAgIC8qIGFsbG9jYXRlIHRoZSBidWZmZXJzIGZvciB0aGUgZnJhbWUgZGF0YSAq LwotICAgIHJldCA9IGF2X2ZyYW1lX2dldF9idWZmZXIocGljdHVyZSwgMCk7Ci0gICAgaWYgKHJl dCA8IDApIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJDb3VsZCBub3QgYWxsb2NhdGUgZnJh bWUgZGF0YS5cbiIpOwotICAgICAgICBleGl0KDEpOworICAgIC8qIEFsbG9jYXRlIHRoZSBmcmFt ZSdzIGRhdGEgYnVmZmVyICovCisgICAgaWYgKChyZXQgPSBhdl9mcmFtZV9nZXRfYnVmZmVyKCpm cmFtZSwgMCkpIDwgMCkgeworICAgICAgICBsb2dfZXJyb3IoIkNvdWxkIG5vdCBhbGxvY2F0ZSBi dWZmZXIgZm9yIEFWRnJhbWUiLCAmcmV0KTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1IoRU5PTUVN KTsKICAgICB9CiAKLSAgICByZXR1cm4gcGljdHVyZTsKKyAgICByZXR1cm4gMDsKIH0KIAotc3Rh dGljIHZvaWQgb3Blbl92aWRlbyhBVkZvcm1hdENvbnRleHQgKm9jLCBjb25zdCBBVkNvZGVjICpj b2RlYywKLSAgICAgICAgICAgICAgICAgICAgICAgT3V0cHV0U3RyZWFtICpvc3QsIEFWRGljdGlv bmFyeSAqb3B0X2FyZykKK3N0YXRpYyBpbnQgaW5pdF9tdXhlcihBVkZvcm1hdENvbnRleHQgKipv dXRfZm10X2N0eCwgQVZDb2RlY0NvbnRleHQgKmF1ZGlvX2VuY19jdHgsCisgICAgICAgICAgICAg ICAgICAgICAgQVZDb2RlY0NvbnRleHQgKnZpZGVvX2VuY19jdHgsIGNvbnN0IGNoYXIgKmZpbGVu YW1lKQogewogICAgIGludCByZXQ7Ci0gICAgQVZDb2RlY0NvbnRleHQgKmMgPSBvc3QtPmVuYzsK LSAgICBBVkRpY3Rpb25hcnkgKm9wdCA9IE5VTEw7CisgICAgQVZTdHJlYW0gKm91dF9hdWRpb19z dHIsICpvdXRfdmlkZW9fc3RyOwogCi0gICAgYXZfZGljdF9jb3B5KCZvcHQsIG9wdF9hcmcsIDAp OworICAgIGlmICgocmV0ID0gYXZmb3JtYXRfYWxsb2Nfb3V0cHV0X2NvbnRleHQyKG91dF9mbXRf Y3R4LCBOVUxMLCBOVUxMLCBmaWxlbmFtZSkpIDwgMCkgeworICAgICAgICBsb2dfZXJyb3IoIkNv dWxkIG5vdCBjcmVhdGUgb3V0cHV0IGNvbnRleHQiLCAmcmV0KTsKKyAgICAgICAgcmV0dXJuIHJl dDsKKyAgICB9CiAKLSAgICAvKiBvcGVuIHRoZSBjb2RlYyAqLwotICAgIHJldCA9IGF2Y29kZWNf b3BlbjIoYywgY29kZWMsICZvcHQpOwotICAgIGF2X2RpY3RfZnJlZSgmb3B0KTsKLSAgICBpZiAo cmV0IDwgMCkgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNvdWxkIG5vdCBvcGVuIHZpZGVv IGNvZGVjOiAlc1xuIiwgYXZfZXJyMnN0cihyZXQpKTsKLSAgICAgICAgZXhpdCgxKTsKLSAgICB9 Ci0KLSAgICAvKiBhbGxvY2F0ZSBhbmQgaW5pdCBhIHJlLXVzYWJsZSBmcmFtZSAqLwotICAgIG9z dC0+ZnJhbWUgPSBhbGxvY19waWN0dXJlKGMtPnBpeF9mbXQsIGMtPndpZHRoLCBjLT5oZWlnaHQp OwotICAgIGlmICghb3N0LT5mcmFtZSkgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNvdWxk IG5vdCBhbGxvY2F0ZSB2aWRlbyBmcmFtZVxuIik7Ci0gICAgICAgIGV4aXQoMSk7Ci0gICAgfQot Ci0gICAgLyogSWYgdGhlIG91dHB1dCBmb3JtYXQgaXMgbm90IFlVVjQyMFAsIHRoZW4gYSB0ZW1w b3JhcnkgWVVWNDIwUAotICAgICAqIHBpY3R1cmUgaXMgbmVlZGVkIHRvby4gSXQgaXMgdGhlbiBj b252ZXJ0ZWQgdG8gdGhlIHJlcXVpcmVkCi0gICAgICogb3V0cHV0IGZvcm1hdC4gKi8KLSAgICBv c3QtPnRtcF9mcmFtZSA9IE5VTEw7Ci0gICAgaWYgKGMtPnBpeF9mbXQgIT0gQVZfUElYX0ZNVF9Z VVY0MjBQKSB7Ci0gICAgICAgIG9zdC0+dG1wX2ZyYW1lID0gYWxsb2NfcGljdHVyZShBVl9QSVhf Rk1UX1lVVjQyMFAsIGMtPndpZHRoLCBjLT5oZWlnaHQpOwotICAgICAgICBpZiAoIW9zdC0+dG1w X2ZyYW1lKSB7Ci0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNvdWxkIG5vdCBhbGxvY2F0 ZSB0ZW1wb3JhcnkgcGljdHVyZVxuIik7Ci0gICAgICAgICAgICBleGl0KDEpOworICAgIC8qIG9w ZW4gdGhlIG91dHB1dCBmaWxlLCBpZiBuZWVkZWQgKi8KKyAgICBpZiAoISgoKm91dF9mbXRfY3R4 KS0+b2Zvcm1hdC0+ZmxhZ3MgJiBBVkZNVF9OT0ZJTEUpKSB7CisgICAgICAgIGlmICgocmV0ID0g YXZpb19vcGVuKCYoKm91dF9mbXRfY3R4KS0+cGIsIGZpbGVuYW1lLCBBVklPX0ZMQUdfV1JJVEUp KSA8IDApIHsKKyAgICAgICAgICAgIGxvZ19lcnJvcigiQ291bGQgbm90IG9wZW4gb3V0cHV0IGZp bGUiLCAmcmV0KTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgIH0KICAgICB9CiAK LSAgICAvKiBjb3B5IHRoZSBzdHJlYW0gcGFyYW1ldGVycyB0byB0aGUgbXV4ZXIgKi8KLSAgICBy ZXQgPSBhdmNvZGVjX3BhcmFtZXRlcnNfZnJvbV9jb250ZXh0KG9zdC0+c3QtPmNvZGVjcGFyLCBj KTsKLSAgICBpZiAocmV0IDwgMCkgewotICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNvdWxkIG5v dCBjb3B5IHRoZSBzdHJlYW0gcGFyYW1ldGVyc1xuIik7Ci0gICAgICAgIGV4aXQoMSk7CisgICAg aWYgKGF1ZGlvX2VuY19jdHgpIHsKKyAgICAgICAgaWYgKCEob3V0X2F1ZGlvX3N0ciA9IGF2Zm9y bWF0X25ld19zdHJlYW0oKm91dF9mbXRfY3R4LCBOVUxMKSkpIHsKKyAgICAgICAgICAgIGxvZ19l cnJvcigiQ291bGQgbm90IGNyZWF0ZSBuZXcgc3RyZWFtIiwgTlVMTCk7CisgICAgICAgICAgICBy ZXR1cm4gQVZFUlJPUihFTk9NRU0pOworICAgICAgICB9CisgICAgICAgIG91dF9hdWRpb19zdHIt PmlkID0gKCpvdXRfZm10X2N0eCktPm5iX3N0cmVhbXMgLSAxOworICAgICAgICBhdmNvZGVjX3Bh cmFtZXRlcnNfZnJvbV9jb250ZXh0KG91dF9hdWRpb19zdHItPmNvZGVjcGFyLCBhdWRpb19lbmNf Y3R4KTsKKyAgICB9CisKKyAgICBpZiAodmlkZW9fZW5jX2N0eCkgeworICAgICAgICBpZiAoIShv dXRfdmlkZW9fc3RyID0gYXZmb3JtYXRfbmV3X3N0cmVhbSgqb3V0X2ZtdF9jdHgsIE5VTEwpKSkg eworICAgICAgICAgICAgbG9nX2Vycm9yKCJDb3VsZCBub3QgY3JlYXRlIG5ldyBzdHJlYW0iLCBO VUxMKTsKKyAgICAgICAgICAgIHJldHVybiBBVkVSUk9SKEVOT01FTSk7CisgICAgICAgIH0KKyAg ICAgICAgb3V0X3ZpZGVvX3N0ci0+aWQgPSAoKm91dF9mbXRfY3R4KS0+bmJfc3RyZWFtcyAtIDE7 CisgICAgICAgIGF2Y29kZWNfcGFyYW1ldGVyc19mcm9tX2NvbnRleHQob3V0X3ZpZGVvX3N0ci0+ Y29kZWNwYXIsIHZpZGVvX2VuY19jdHgpOwogICAgIH0KKworICAgIGF2X2R1bXBfZm9ybWF0KCpv dXRfZm10X2N0eCwgMCwgZmlsZW5hbWUsIDEpOworCisgICAgLyogV3JpdGUgdGhlIHN0cmVhbSBo ZWFkZXIsIGlmIGFueS4gKi8KKyAgICBpZiAoYXZmb3JtYXRfd3JpdGVfaGVhZGVyKCpvdXRfZm10 X2N0eCwgTlVMTCkgPCAwKSB7CisgICAgICAgIGxvZ19lcnJvcigiYXZmb3JtYXRfd3JpdGVfaGVh ZGVyKCkgZXJyb3IiLCBOVUxMKTsKKyAgICAgICAgcmV0dXJuIEFWRVJST1JfRVhJVDsKKyAgICB9 CisKKyAgICByZXR1cm4gMDsKIH0KIAotLyogUHJlcGFyZSBhIGR1bW15IGltYWdlLiAqLwotc3Rh dGljIHZvaWQgZmlsbF95dXZfaW1hZ2UoQVZGcmFtZSAqcGljdCwgaW50IGZyYW1lX2luZGV4LAot ICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KQorc3RhdGlj IHZvaWQgZmlsbF9kdW1teV9zMTZfZnJhbWUoQVZGcmFtZSAqZnJhbWUpCiB7Ci0gICAgaW50IHgs IHksIGk7CisgICAgaW50IGosIGksIHY7CisgICAgc3RhdGljIGZsb2F0IHQsIHRpbmNyLCB0aW5j cjI7CisgICAgaW50MTZfdCAqZGF0YSA9IChpbnQxNl90KilmcmFtZS0+ZGF0YVswXTsKKyAgICBz dGF0aWMgaW50IGZyYW1lX2N0cjsKKworICAgIGlmICghdGluY3IpIHsKKyAgICAgICAgdCAgICAg ICA9IDA7CisgICAgICAgIHRpbmNyICAgPSAyICogTV9QSSAqIDExMC4wIC8gZnJhbWUtPnNhbXBs ZV9yYXRlOworICAgICAgICAvKiBpbmNyZW1lbnQgZnJlcXVlbmN5IGJ5IDExMCBIeiBwZXIgc2Vj b25kICovCisgICAgICAgIHRpbmNyMiAgPSB0aW5jciAvIGZyYW1lLT5zYW1wbGVfcmF0ZTsKKyAg ICB9CisgICAgZm9yIChqID0gMDsgaiA8ZnJhbWUtPm5iX3NhbXBsZXM7IGorKykgeworICAgICAg ICB2ID0gKGludCkoc2luKHQpICogMTAwMDApOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZnJh bWUtPmNoX2xheW91dC5uYl9jaGFubmVsczsgaSsrKQorICAgICAgICAgICAgKmRhdGErKyA9IHY7 CisgICAgICAgIHQgICAgICs9IHRpbmNyOworICAgICAgICB0aW5jciArPSB0aW5jcjI7CisgICAg fQorICAgIGZyYW1lLT5wdHMgPSBmcmFtZS0+bmJfc2FtcGxlcyooKytmcmFtZV9jdHIpOworfQog Ci0gICAgaSA9IGZyYW1lX2luZGV4Oworc3RhdGljIHZvaWQgZmlsbF9kdW1teV95dXY0MjBwX2Zy YW1lKEFWRnJhbWUgKmZyYW1lKQoreworICAgIGludCB4LCB5OworICAgIHN0YXRpYyBpbnQgaWR4 OwogCiAgICAgLyogWSAqLwotICAgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykKLSAgICAg ICAgZm9yICh4ID0gMDsgeCA8IHdpZHRoOyB4KyspCi0gICAgICAgICAgICBwaWN0LT5kYXRhWzBd W3kgKiBwaWN0LT5saW5lc2l6ZVswXSArIHhdID0geCArIHkgKyBpICogMzsKKyAgICBmb3IgKHkg PSAwOyB5IDwgZnJhbWUtPndpZHRoOyB5KyspCisgICAgICAgIGZvciAoeCA9IDA7IHggPCBmcmFt ZS0+d2lkdGg7IHgrKykKKyAgICAgICAgICAgIGZyYW1lLT5kYXRhWzBdW3kgKiBmcmFtZS0+bGlu ZXNpemVbMF0gKyB4XSA9IHggKyB5ICsgaWR4ICogMzsKIAogICAgIC8qIENiIGFuZCBDciAqLwot ICAgIGZvciAoeSA9IDA7IHkgPCBoZWlnaHQgLyAyOyB5KyspIHsKLSAgICAgICAgZm9yICh4ID0g MDsgeCA8IHdpZHRoIC8gMjsgeCsrKSB7Ci0gICAgICAgICAgICBwaWN0LT5kYXRhWzFdW3kgKiBw aWN0LT5saW5lc2l6ZVsxXSArIHhdID0gMTI4ICsgeSArIGkgKiAyOwotICAgICAgICAgICAgcGlj dC0+ZGF0YVsyXVt5ICogcGljdC0+bGluZXNpemVbMl0gKyB4XSA9IDY0ICsgeCArIGkgKiA1Owor ICAgIGZvciAoeSA9IDA7IHkgPCBmcmFtZS0+aGVpZ2h0IC8gMjsgeSsrKSB7CisgICAgICAgIGZv ciAoeCA9IDA7IHggPCBmcmFtZS0+d2lkdGggLyAyOyB4KyspIHsKKyAgICAgICAgICAgIGZyYW1l LT5kYXRhWzFdW3kgKiBmcmFtZS0+bGluZXNpemVbMV0gKyB4XSA9IDEyOCArIHkgKyBpZHggKiAy OworICAgICAgICAgICAgZnJhbWUtPmRhdGFbMl1beSAqIGZyYW1lLT5saW5lc2l6ZVsyXSArIHhd ID0gNjQgKyB4ICsgaWR4ICogNTsKICAgICAgICAgfQogICAgIH0KKworICAgIGZyYW1lLT5wdHMg PSBpZHgrKzsKIH0KIAotc3RhdGljIEFWRnJhbWUgKmdldF92aWRlb19mcmFtZShPdXRwdXRTdHJl YW0gKm9zdCkKK3N0YXRpYyBpbnQgY29udmVydF9mcmFtZSh2b2lkICpjb252ZXJ0X2N0eCwgQVZG cmFtZSAqaW5fZnJhbWUsIEFWRnJhbWUgKm91dF9mcmFtZSkKIHsKLSAgICBBVkNvZGVjQ29udGV4 dCAqYyA9IG9zdC0+ZW5jOwotCi0gICAgLyogY2hlY2sgaWYgd2Ugd2FudCB0byBnZW5lcmF0ZSBt b3JlIGZyYW1lcyAqLwotICAgIGlmIChhdl9jb21wYXJlX3RzKG9zdC0+bmV4dF9wdHMsIGMtPnRp bWVfYmFzZSwKLSAgICAgICAgICAgICAgICAgICAgICBTVFJFQU1fRFVSQVRJT04sIChBVlJhdGlv bmFsKXsgMSwgMSB9KSA+IDApCi0gICAgICAgIHJldHVybiBOVUxMOwotCi0gICAgLyogd2hlbiB3 ZSBwYXNzIGEgZnJhbWUgdG8gdGhlIGVuY29kZXIsIGl0IG1heSBrZWVwIGEgcmVmZXJlbmNlIHRv IGl0Ci0gICAgICogaW50ZXJuYWxseTsgbWFrZSBzdXJlIHdlIGRvIG5vdCBvdmVyd3JpdGUgaXQg aGVyZSAqLwotICAgIGlmIChhdl9mcmFtZV9tYWtlX3dyaXRhYmxlKG9zdC0+ZnJhbWUpIDwgMCkK LSAgICAgICAgZXhpdCgxKTsKLQotICAgIGlmIChjLT5waXhfZm10ICE9IEFWX1BJWF9GTVRfWVVW NDIwUCkgewotICAgICAgICAvKiBhcyB3ZSBvbmx5IGdlbmVyYXRlIGEgWVVWNDIwUCBwaWN0dXJl LCB3ZSBtdXN0IGNvbnZlcnQgaXQKLSAgICAgICAgICogdG8gdGhlIGNvZGVjIHBpeGVsIGZvcm1h dCBpZiBuZWVkZWQgKi8KLSAgICAgICAgaWYgKCFvc3QtPnN3c19jdHgpIHsKLSAgICAgICAgICAg IG9zdC0+c3dzX2N0eCA9IHN3c19nZXRDb250ZXh0KGMtPndpZHRoLCBjLT5oZWlnaHQsCi0gICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVl9QSVhfRk1UX1lVVjQyMFAs Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLT53aWR0aCwgYy0+ aGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy0+cGl4 X2ZtdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDQUxFX0ZM QUdTLCBOVUxMLCBOVUxMLCBOVUxMKTsKLSAgICAgICAgICAgIGlmICghb3N0LT5zd3NfY3R4KSB7 Ci0gICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsCi0gICAgICAgICAgICAgICAgICAgICAg ICAiQ291bGQgbm90IGluaXRpYWxpemUgdGhlIGNvbnZlcnNpb24gY29udGV4dFxuIik7Ci0gICAg ICAgICAgICAgICAgZXhpdCgxKTsKLSAgICAgICAgICAgIH0KKyAgICBpbnQgcmV0OworICAgIGVu dW0gQVZNZWRpYVR5cGUgKnR5cGUgPSAoZW51bSBBVk1lZGlhVHlwZSAqKShpbl9mcmFtZS0+b3Bh cXVlKTsKKworICAgIGlmIChhdl9mcmFtZV9tYWtlX3dyaXRhYmxlKG91dF9mcmFtZSkgPCAwKSB7 CisgICAgICAgIGxvZ19lcnJvcigiYXZfZnJhbWVfbWFrZV93cml0YWJsZSgpIGVycm9yIiwgTlVM TCk7CisgICAgICAgIHJldHVybiBBVkVSUk9SX0VYSVQ7CisgICAgfQorCisgICAgaWYgKCp0eXBl ID09IEFWTUVESUFfVFlQRV9BVURJTykgeworICAgICAgICBpZiAoKHJldCA9IHN3cl9jb252ZXJ0 X2ZyYW1lKChzdHJ1Y3QgU3dyQ29udGV4dCAqKWNvbnZlcnRfY3R4LCBvdXRfZnJhbWUsCisgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IEFWRnJhbWUgKilpbl9mcmFt ZSkpICE9IDApIHsKKyAgICAgICAgICAgIGxvZ19lcnJvcigiRXJyb3IgY29udmVydGluZyBBVkZy YW1lIiwgJnJldCk7CisgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgICB9Ci0gICAgICAg IGZpbGxfeXV2X2ltYWdlKG9zdC0+dG1wX2ZyYW1lLCBvc3QtPm5leHRfcHRzLCBjLT53aWR0aCwg Yy0+aGVpZ2h0KTsKLSAgICAgICAgc3dzX3NjYWxlKG9zdC0+c3dzX2N0eCwgKGNvbnN0IHVpbnQ4 X3QgKiBjb25zdCAqKSBvc3QtPnRtcF9mcmFtZS0+ZGF0YSwKLSAgICAgICAgICAgICAgICAgIG9z dC0+dG1wX2ZyYW1lLT5saW5lc2l6ZSwgMCwgYy0+aGVpZ2h0LCBvc3QtPmZyYW1lLT5kYXRhLAot ICAgICAgICAgICAgICAgICAgb3N0LT5mcmFtZS0+bGluZXNpemUpOwogICAgIH0gZWxzZSB7Ci0g ICAgICAgIGZpbGxfeXV2X2ltYWdlKG9zdC0+ZnJhbWUsIG9zdC0+bmV4dF9wdHMsIGMtPndpZHRo LCBjLT5oZWlnaHQpOworICAgICAgICBzd3Nfc2NhbGUoKHN0cnVjdCBTd3NDb250ZXh0ICopY29u dmVydF9jdHgsIChjb25zdCB1aW50OF90ICogY29uc3QgKilpbl9mcmFtZS0+ZGF0YSwKKyAgICAg ICAgICAgICAgICAgIGluX2ZyYW1lLT5saW5lc2l6ZSwgMCwgaW5fZnJhbWUtPmhlaWdodCwgb3V0 X2ZyYW1lLT5kYXRhLAorICAgICAgICAgICAgICAgICAgb3V0X2ZyYW1lLT5saW5lc2l6ZSk7CiAg ICAgfQogCi0gICAgb3N0LT5mcmFtZS0+cHRzID0gb3N0LT5uZXh0X3B0cysrOwotCi0gICAgcmV0 dXJuIG9zdC0+ZnJhbWU7CisgICAgb3V0X2ZyYW1lLT5wdHMgPSBpbl9mcmFtZS0+cHRzOworICAg IHJldHVybiAwOwogfQogCi0vKgotICogZW5jb2RlIG9uZSB2aWRlbyBmcmFtZSBhbmQgc2VuZCBp dCB0byB0aGUgbXV4ZXIKLSAqIHJldHVybiAxIHdoZW4gZW5jb2RpbmcgaXMgZmluaXNoZWQsIDAg b3RoZXJ3aXNlCi0gKi8KLXN0YXRpYyBpbnQgd3JpdGVfdmlkZW9fZnJhbWUoQVZGb3JtYXRDb250 ZXh0ICpvYywgT3V0cHV0U3RyZWFtICpvc3QpCitzdGF0aWMgaW50IGVuY29kZV9mcmFtZShBVkNv ZGVjQ29udGV4dCAqY3R4LCBBVkZyYW1lICppbl9mcmFtZSwgQVZQYWNrZXQgKm91dF9wa3QpCiB7 Ci0gICAgcmV0dXJuIHdyaXRlX2ZyYW1lKG9jLCBvc3QtPmVuYywgb3N0LT5zdCwgZ2V0X3ZpZGVv X2ZyYW1lKG9zdCksIG9zdC0+dG1wX3BrdCk7CisgICAgc3RhdGljIGludCBpc19mbHVzaGluZ19h dWRpbyA9IDAsIGlzX2ZsdXNoaW5nX3ZpZGVvID0gMDsKKyAgICBpbnQgcmV0ID0gMDsKKyAgICBp bnQgaXNfYXVkaW8gPSBjdHgtPmNvZGVjLT50eXBlID09IEFWTUVESUFfVFlQRV9BVURJTzsKKwor ICAgIGlmICgoaXNfYXVkaW8gJiYgIWlzX2ZsdXNoaW5nX2F1ZGlvKSB8fCAoIWlzX2F1ZGlvICYm ICFpc19mbHVzaGluZ192aWRlbykpIHsKKyAgICAgICAgcmV0ID0gYXZjb2RlY19zZW5kX2ZyYW1l KGN0eCwgaW5fZnJhbWUpOworICAgIH0KKyAgICBpZiAocmV0IDwgMCkgeworICAgICAgICBsb2df ZXJyb3IoIkVycm9yIHNlbmRpbmcgZnJhbWUgdG8gdGhlIGVuY29kZXIgKGVycm9yICclcycpXG4i LCAmcmV0KTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9IGVsc2UgaWYgKHJldCA9PSAwKSB7 CisgICAgICAgIHJldCA9IGF2Y29kZWNfcmVjZWl2ZV9wYWNrZXQoY3R4LCBvdXRfcGt0KTsKKyAg ICAgICAgaWYgKChyZXQgPCAwKSAmJiAocmV0ICE9IEFWRVJST1IoRUFHQUlOKSkgJiYgKHJldCAh PSBBVkVSUk9SX0VPRikpIHsKKyAgICAgICAgICAgIGxvZ19lcnJvcigiRXJyb3IgcmVjZWl2aW5n IGVuY29kZWQgcGFja2V0IChlcnJvciAnJXMnKVxuIiwgJnJldCk7CisgICAgICAgICAgICByZXR1 cm4gcmV0OworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGlzX2F1ZGlvKQorICAgICAgICBp c19mbHVzaGluZ19hdWRpbyA9IChpbl9mcmFtZSA9PSBOVUxMKTsKKyAgICBlbHNlCisgICAgICAg IGlzX2ZsdXNoaW5nX3ZpZGVvID0gKGluX2ZyYW1lID09IE5VTEwpOworCisgICAgcmV0dXJuIHJl dDsKIH0KIAotc3RhdGljIHZvaWQgY2xvc2Vfc3RyZWFtKEFWRm9ybWF0Q29udGV4dCAqb2MsIE91 dHB1dFN0cmVhbSAqb3N0KQorc3RhdGljIGludCBmcmFtZV9leGNlZWRzX3N0cmVhbV9kdXJhdGlv bihBVkZyYW1lICpmcikKIHsKLSAgICBhdmNvZGVjX2ZyZWVfY29udGV4dCgmb3N0LT5lbmMpOwot ICAgIGF2X2ZyYW1lX2ZyZWUoJm9zdC0+ZnJhbWUpOwotICAgIGF2X2ZyYW1lX2ZyZWUoJm9zdC0+ dG1wX2ZyYW1lKTsKLSAgICBhdl9wYWNrZXRfZnJlZSgmb3N0LT50bXBfcGt0KTsKLSAgICBzd3Nf ZnJlZUNvbnRleHQob3N0LT5zd3NfY3R4KTsKLSAgICBzd3JfZnJlZSgmb3N0LT5zd3JfY3R4KTsK KyAgICBlbnVtIEFWTWVkaWFUeXBlICp0eXBlID0gKGVudW0gQVZNZWRpYVR5cGUgKikoZnItPm9w YXF1ZSk7CisgICAgQVZSYXRpb25hbCB0YiA9ICgqdHlwZSA9PSBBVk1FRElBX1RZUEVfQVVESU8p ID8gYXZfbWFrZV9xKDEsIGZyLT5zYW1wbGVfcmF0ZSkgOgorICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2X21ha2VfcSgxLCBWSURFT19GUkFNRV9S QVRFKTsKKworICAgIHJldHVybiBhdl9jb21wYXJlX3RzKGZyLT5wdHMsIHRiICxTVFJFQU1fRFVS QVRJT04sIGF2X21ha2VfcSgxLCAxKSkgPiAwOwogfQogCi0vKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBtZWRpYSBmaWxl IG91dHB1dCAqLworc3RhdGljIGVudW0gQVZNZWRpYVR5cGUgbWVkaWFfdHlwZV9vZl9lYXJsaWVy X2ZyYW1lKEFWRnJhbWUgKmF1ZGlvX2ZyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIEFWRnJhbWUgKnZpZGVvX2ZyKQoreworICAgIGlmICghYXVk aW9fZnIpCisgICAgICAgIHJldHVybiBBVk1FRElBX1RZUEVfVklERU87CisgICAgaWYgKCF2aWRl b19mcikKKyAgICAgICAgcmV0dXJuIEFWTUVESUFfVFlQRV9BVURJTzsKKworICAgIGlmIChhdl9j b21wYXJlX3RzKGF1ZGlvX2ZyLT5wdHMsIGF2X21ha2VfcSgxLCBhdWRpb19mci0+c2FtcGxlX3Jh dGUpLAorICAgICAgICAgICAgICAgICAgICAgIHZpZGVvX2ZyLT5wdHMsIGF2X21ha2VfcSgxLCBW SURFT19GUkFNRV9SQVRFKSkgPCAwKQorICAgICAgICByZXR1cm4gQVZNRURJQV9UWVBFX0FVRElP OworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIEFWTUVESUFfVFlQRV9WSURFTzsKK30KIAogaW50 IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQogewotICAgIE91dHB1dFN0cmVhbSB2aWRlb19z dCA9IHsgMCB9LCBhdWRpb19zdCA9IHsgMCB9OwotICAgIGNvbnN0IEFWT3V0cHV0Rm9ybWF0ICpm bXQ7Ci0gICAgY29uc3QgY2hhciAqZmlsZW5hbWU7Ci0gICAgQVZGb3JtYXRDb250ZXh0ICpvYzsK LSAgICBjb25zdCBBVkNvZGVjICphdWRpb19jb2RlYywgKnZpZGVvX2NvZGVjOwotICAgIGludCBy ZXQ7Ci0gICAgaW50IGhhdmVfdmlkZW8gPSAwLCBoYXZlX2F1ZGlvID0gMDsKLSAgICBpbnQgZW5j b2RlX3ZpZGVvID0gMCwgZW5jb2RlX2F1ZGlvID0gMDsKLSAgICBBVkRpY3Rpb25hcnkgKm9wdCA9 IE5VTEw7Ci0gICAgaW50IGk7Ci0KLSAgICBpZiAoYXJnYyA8IDIpIHsKKyAgICBjb25zdCBjaGFy ICpmbmFtZTsKKyAgICBBVkNvZGVjQ29udGV4dCAqYXVkaW9fZW5jX2N0eCA9IE5VTEwsICp2aWRl b19lbmNfY3R4ID0gTlVMTCwgKmVuY19jdHggPSBOVUxMOworCisgICAgLyogTk9URTogaWYgeW91 IHdhbnQgdG8gbW9kaWZ5IHRoZSBhdWRpby92aWRlbyBpbnB1dCAiLmZvcm1hdCIgcGFyYW1ldGVy LAorICAgICAqIHlvdSBuZWVkIHRvIG1vZGlmeSB0aGUgY29ycmVzcG9uZGluZyBmaWxsX2R1bW15 X1hYWF9mcmFtZSgpIGZ1bmN0aW9uKHMpIHRvbyAqLworICAgIEFWQ29kZWNQYXJhbWV0ZXJzICph dWRpb19pbl9wYXJhbXMgID0gYXZjb2RlY19wYXJhbWV0ZXJzX2FsbG9jKCksCisgICAgICAgICAg ICAgICAgICAgICAgKmF1ZGlvX2VuY19wYXJhbXMgPSBhdmNvZGVjX3BhcmFtZXRlcnNfYWxsb2Mo KSwKKyAgICAgICAgICAgICAgICAgICAgICAqdmlkZW9faW5fcGFyYW1zICA9IGF2Y29kZWNfcGFy YW1ldGVyc19hbGxvYygpLAorICAgICAgICAgICAgICAgICAgICAgICp2aWRlb19lbmNfcGFyYW1z ID0gYXZjb2RlY19wYXJhbWV0ZXJzX2FsbG9jKCk7CisgICAgc3RydWN0IEFWUmF0aW9uYWwgZW5j X3RpbWViYXNlc1syXTsKKyAgICBBVkZyYW1lICppbl9hdWRpb19mcmFtZSA9IE5VTEwsICpjb252 ZXJ0ZWRfYXVkaW9fZnJhbWUgPSBOVUxMLAorICAgICAgICAgICAgKmluX3ZpZGVvX2ZyYW1lID0g TlVMTCwgKmNvbnZlcnRlZF92aWRlb19mcmFtZSA9IE5VTEwsCisgICAgICAgICAgICAqZnJhbWVf dG9fZW5jb2RlID0gTlVMTDsKKyAgICBzdHJ1Y3QgU3dyQ29udGV4dCAqYXVkaW9fY29udmVydF9j dHggPSBOVUxMOworICAgIHN0cnVjdCBTd3NDb250ZXh0ICp2aWRlb19jb252ZXJ0X2N0eCA9IE5V TEw7CisgICAgZW51bSBBVk1lZGlhVHlwZSBtZWRpYV90eXBlOworICAgIEFWRm9ybWF0Q29udGV4 dCAqb3V0X2ZtdF9jdHggPSBOVUxMOworICAgIEFWUGFja2V0ICpvdXRfcGt0ID0gYXZfcGFja2V0 X2FsbG9jKCk7CisgICAgaW50IHJldCA9IDAsIHByb2Nlc3NfYXVkaW8gPSAwLCBwcm9jZXNzX3Zp ZGVvID0gMDsKKworICAgIGlmIChhcmdjICE9IDIpIHsKICAgICAgICAgcHJpbnRmKCJ1c2FnZTog JXMgb3V0cHV0X2ZpbGVcbiIKICAgICAgICAgICAgICAgICJBUEkgZXhhbXBsZSBwcm9ncmFtIHRv IG91dHB1dCBhIG1lZGlhIGZpbGUgd2l0aCBsaWJhdmZvcm1hdC5cbiIKLSAgICAgICAgICAgICAg ICJUaGlzIHByb2dyYW0gZ2VuZXJhdGVzIGEgc3ludGhldGljIGF1ZGlvIGFuZCB2aWRlbyBzdHJl YW0sIGVuY29kZXMgYW5kXG4iCisgICAgICAgICAgICAgICAiVGhpcyBwcm9ncmFtIGdlbmVyYXRl cyBhIHN5bnRoZXRpYyBhdWRpbyBhbmQvb3IgdmlkZW8gc3RyZWFtLCBlbmNvZGVzIGFuZFxuIgog ICAgICAgICAgICAgICAgIm11eGVzIHRoZW0gaW50byBhIGZpbGUgbmFtZWQgb3V0cHV0X2ZpbGUu XG4iCiAgICAgICAgICAgICAgICAiVGhlIG91dHB1dCBmb3JtYXQgaXMgYXV0b21hdGljYWxseSBn dWVzc2VkIGFjY29yZGluZyB0byB0aGUgZmlsZSBleHRlbnNpb24uXG4iCi0gICAgICAgICAgICAg ICAiUmF3IGltYWdlcyBjYW4gYWxzbyBiZSBvdXRwdXQgYnkgdXNpbmcgJyUlZCcgaW4gdGhlIGZp bGVuYW1lLlxuIgorICAgICAgICAgICAgICAgIkJNUCBvciBKUEVHIGltYWdlcyBjYW4gYWxzbyBi ZSBvdXRwdXQgYnkgdXNpbmcgJyUlZCcgaW4gdGhlIGZpbGVuYW1lLlxuIgogICAgICAgICAgICAg ICAgIlxuIiwgYXJndlswXSk7Ci0gICAgICAgIHJldHVybiAxOworICAgICAgICByZXQgPSAxOwor ICAgICAgICBnb3RvIGVuZDsKICAgICB9CiAKLSAgICBmaWxlbmFtZSA9IGFyZ3ZbMV07Ci0gICAg Zm9yIChpID0gMjsgaSsxIDwgYXJnYzsgaSs9MikgewotICAgICAgICBpZiAoIXN0cmNtcChhcmd2 W2ldLCAiLWZsYWdzIikgfHwgIXN0cmNtcChhcmd2W2ldLCAiLWZmbGFncyIpKQotICAgICAgICAg ICAgYXZfZGljdF9zZXQoJm9wdCwgYXJndltpXSsxLCBhcmd2W2krMV0sIDApOworICAgIGlmICgh YXVkaW9faW5fcGFyYW1zIHx8ICFhdWRpb19lbmNfcGFyYW1zIHx8CisgICAgICAgICF2aWRlb19p bl9wYXJhbXMgfHwgIXZpZGVvX2VuY19wYXJhbXMgfHwgIW91dF9wa3QpIHsKKyAgICAgICAgbG9n X2Vycm9yKCJjb3VsZCBub3QgYWxsb2NhdGUgcmVzb3VyY2VzIiwgTlVMTCk7CisgICAgICAgIHJl dCA9IEFWRVJST1IoRU5PTUVNKTsKKyAgICAgICAgZ290byBlbmQ7CiAgICAgfQogCi0gICAgLyog YWxsb2NhdGUgdGhlIG91dHB1dCBtZWRpYSBjb250ZXh0ICovCi0gICAgYXZmb3JtYXRfYWxsb2Nf b3V0cHV0X2NvbnRleHQyKCZvYywgTlVMTCwgTlVMTCwgZmlsZW5hbWUpOwotICAgIGlmICghb2Mp IHsKLSAgICAgICAgcHJpbnRmKCJDb3VsZCBub3QgZGVkdWNlIG91dHB1dCBmb3JtYXQgZnJvbSBm aWxlIGV4dGVuc2lvbjogdXNpbmcgTVBFRy5cbiIpOwotICAgICAgICBhdmZvcm1hdF9hbGxvY19v dXRwdXRfY29udGV4dDIoJm9jLCBOVUxMLCAibXBlZyIsIGZpbGVuYW1lKTsKLSAgICB9Ci0gICAg aWYgKCFvYykKLSAgICAgICAgcmV0dXJuIDE7CisgICAgYXVkaW9faW5fcGFyYW1zLT5jb2RlY190 eXBlICA9IEFWTUVESUFfVFlQRV9BVURJTzsKKyAgICBhdWRpb19pbl9wYXJhbXMtPmZvcm1hdCAg ICAgID0gQVZfU0FNUExFX0ZNVF9TMTY7CisgICAgYXVkaW9faW5fcGFyYW1zLT5zYW1wbGVfcmF0 ZSA9IDQ0MTAwOworICAgIGF1ZGlvX2luX3BhcmFtcy0+Y2hfbGF5b3V0ICAgPSAoQVZDaGFubmVs TGF5b3V0KUFWX0NIQU5ORUxfTEFZT1VUX1NURVJFTzsKIAotICAgIGZtdCA9IG9jLT5vZm9ybWF0 OworICAgIHZpZGVvX2luX3BhcmFtcy0+Y29kZWNfdHlwZSAgPSBBVk1FRElBX1RZUEVfVklERU87 CisgICAgdmlkZW9faW5fcGFyYW1zLT53aWR0aCAgICAgICA9IDM1MjsKKyAgICB2aWRlb19pbl9w YXJhbXMtPmhlaWdodCAgICAgID0gMjg4OworICAgIHZpZGVvX2luX3BhcmFtcy0+Zm9ybWF0ICAg ICAgPSBBVl9QSVhfRk1UX1lVVjQyMFA7CiAKLSAgICAvKiBBZGQgdGhlIGF1ZGlvIGFuZCB2aWRl byBzdHJlYW1zIHVzaW5nIHRoZSBkZWZhdWx0IGZvcm1hdCBjb2RlY3MKLSAgICAgKiBhbmQgaW5p dGlhbGl6ZSB0aGUgY29kZWNzLiAqLwotICAgIGlmIChmbXQtPnZpZGVvX2NvZGVjICE9IEFWX0NP REVDX0lEX05PTkUpIHsKLSAgICAgICAgYWRkX3N0cmVhbSgmdmlkZW9fc3QsIG9jLCAmdmlkZW9f Y29kZWMsIGZtdC0+dmlkZW9fY29kZWMpOwotICAgICAgICBoYXZlX3ZpZGVvID0gMTsKLSAgICAg ICAgZW5jb2RlX3ZpZGVvID0gMTsKKyAgICBmbmFtZSA9IGFyZ3ZbMV07CisgICAgaWYgKCFpc19l eHRlbnNpb25fc3VwcG9ydGVkKGZuYW1lKSkgeworICAgICAgICByZXQgPSBBVkVSUk9SX0VYSVQ7 CisgICAgICAgIGdvdG8gZW5kOwogICAgIH0KLSAgICBpZiAoZm10LT5hdWRpb19jb2RlYyAhPSBB Vl9DT0RFQ19JRF9OT05FKSB7Ci0gICAgICAgIGFkZF9zdHJlYW0oJmF1ZGlvX3N0LCBvYywgJmF1 ZGlvX2NvZGVjLCBmbXQtPmF1ZGlvX2NvZGVjKTsKLSAgICAgICAgaGF2ZV9hdWRpbyA9IDE7Ci0g ICAgICAgIGVuY29kZV9hdWRpbyA9IDE7Ci0gICAgfQotCi0gICAgLyogTm93IHRoYXQgYWxsIHRo ZSBwYXJhbWV0ZXJzIGFyZSBzZXQsIHdlIGNhbiBvcGVuIHRoZSBhdWRpbyBhbmQKLSAgICAgKiB2 aWRlbyBjb2RlY3MgYW5kIGFsbG9jYXRlIHRoZSBuZWNlc3NhcnkgZW5jb2RlIGJ1ZmZlcnMuICov Ci0gICAgaWYgKGhhdmVfdmlkZW8pCi0gICAgICAgIG9wZW5fdmlkZW8ob2MsIHZpZGVvX2NvZGVj LCAmdmlkZW9fc3QsIG9wdCk7CiAKLSAgICBpZiAoaGF2ZV9hdWRpbykKLSAgICAgICAgb3Blbl9h dWRpbyhvYywgYXVkaW9fY29kZWMsICZhdWRpb19zdCwgb3B0KTsKLQotICAgIGF2X2R1bXBfZm9y bWF0KG9jLCAwLCBmaWxlbmFtZSwgMSk7CisgICAgLyogRGVzdW1lIHRoZSBkZWZhdWx0IGNvZGVj cyBhbmQgdGhlaXIgZGVmYXVsdCBwYXJhbWV0ZXJzIGZyb20gdGhlIGZpbGVuYW1lICovCisgICAg aWYgKChyZXQgPSBnZXRfZGVmYXVsdF9lbmNfcGFyYW1zKGF1ZGlvX2VuY19wYXJhbXMsIGZuYW1l LCBBVk1FRElBX1RZUEVfQVVESU8pKSA8IDApCisgICAgICAgIGdvdG8gZW5kOworICAgIGlmICgo cmV0ID0gZ2V0X2RlZmF1bHRfZW5jX3BhcmFtcyh2aWRlb19lbmNfcGFyYW1zLCBmbmFtZSwgQVZN RURJQV9UWVBFX1ZJREVPKSkgPCAwKQorICAgICAgICBnb3RvIGVuZDsKKyAgICBwcm9jZXNzX2F1 ZGlvID0gYXVkaW9fZW5jX3BhcmFtcy0+Y29kZWNfaWQgIT0gQVZfQ09ERUNfSURfTk9ORTsKKyAg ICBwcm9jZXNzX3ZpZGVvID0gdmlkZW9fZW5jX3BhcmFtcy0+Y29kZWNfaWQgIT0gQVZfQ09ERUNf SURfTk9ORTsKKyAgICBpZiAoIXByb2Nlc3NfYXVkaW8gJiYgIXByb2Nlc3NfdmlkZW8pIHsKKyAg ICAgICAgbG9nX2Vycm9yKCJDb3VsZCBub3QgZ2V0IGRlZmF1bHQgZW5jb2RlcihzKSIsIE5VTEwp OworICAgICAgICByZXQgPSBBVkVSUk9SX0VYSVQ7CisgICAgICAgIGdvdG8gZW5kOworICAgIH0K IAotICAgIC8qIG9wZW4gdGhlIG91dHB1dCBmaWxlLCBpZiBuZWVkZWQgKi8KLSAgICBpZiAoIShm bXQtPmZsYWdzICYgQVZGTVRfTk9GSUxFKSkgewotICAgICAgICByZXQgPSBhdmlvX29wZW4oJm9j LT5wYiwgZmlsZW5hbWUsIEFWSU9fRkxBR19XUklURSk7Ci0gICAgICAgIGlmIChyZXQgPCAwKSB7 Ci0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNvdWxkIG5vdCBvcGVuICclcyc6ICVzXG4i LCBmaWxlbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgYXZfZXJyMnN0cihyZXQpKTsKLSAgICAg ICAgICAgIHJldHVybiAxOwotICAgICAgICB9CisgICAgaWYgKHByb2Nlc3NfYXVkaW8pIHsKKyAg ICAgICAgLyogUHJlcGFyZSB0aGUgYXVkaW8gZW5jb2RlciovCisgICAgICAgIGlmICgocmV0ID0g aW5pdF9lbmNvZGVyKCZhdWRpb19lbmNfY3R4LCBhdWRpb19lbmNfcGFyYW1zKSkgPCAwKQorICAg ICAgICAgICAgZ290byBlbmQ7CisgICAgICAgIGVuY190aW1lYmFzZXNbMF0gPSBhdWRpb19lbmNf Y3R4LT50aW1lX2Jhc2U7CisgICAgICAgIGF1ZGlvX2luX3BhcmFtcy0+ZnJhbWVfc2l6ZSAgPSBh dWRpb19lbmNfcGFyYW1zLT5mcmFtZV9zaXplICA9IGF1ZGlvX2VuY19jdHgtPmZyYW1lX3NpemU7 CisKKyAgICAgICAgLyogQWxsb2NhdGUgYW4gYXVkaW8gcmVzYW1wbGVyIGFuZCBpdHMgaW5wdXQg YW5kIG91dHB1dCBBVkZyYW1lcyAqLworICAgICAgICBpZiAoKHJldCA9IGluaXRfYXVkaW9fY29u dmVydCgmYXVkaW9fY29udmVydF9jdHgsIGF1ZGlvX2luX3BhcmFtcywKKyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZW5jX3BhcmFtcykpIDwgMCkKKyAgICAgICAg ICAgIGdvdG8gZW5kOworICAgICAgICBpZiAoKHJldCA9IGluaXRfYXZmcmFtZSgmaW5fYXVkaW9f ZnJhbWUsIGF1ZGlvX2luX3BhcmFtcykpIDwgMCkKKyAgICAgICAgICAgIGdvdG8gZW5kOworICAg ICAgICBpZiAoKHJldCA9IGluaXRfYXZmcmFtZSgmY29udmVydGVkX2F1ZGlvX2ZyYW1lLCBhdWRp b19lbmNfcGFyYW1zKSkgPCAwKQorICAgICAgICAgICAgZ290byBlbmQ7CiAgICAgfQogCi0gICAg LyogV3JpdGUgdGhlIHN0cmVhbSBoZWFkZXIsIGlmIGFueS4gKi8KLSAgICByZXQgPSBhdmZvcm1h dF93cml0ZV9oZWFkZXIob2MsICZvcHQpOwotICAgIGlmIChyZXQgPCAwKSB7Ci0gICAgICAgIGZw cmludGYoc3RkZXJyLCAiRXJyb3Igb2NjdXJyZWQgd2hlbiBvcGVuaW5nIG91dHB1dCBmaWxlOiAl c1xuIiwKLSAgICAgICAgICAgICAgICBhdl9lcnIyc3RyKHJldCkpOwotICAgICAgICByZXR1cm4g MTsKKyAgICBpZiAocHJvY2Vzc192aWRlbykgeworICAgICAgICB2aWRlb19lbmNfcGFyYW1zLT53 aWR0aCAgPSB2aWRlb19pbl9wYXJhbXMtPndpZHRoOworICAgICAgICB2aWRlb19lbmNfcGFyYW1z LT5oZWlnaHQgPSB2aWRlb19pbl9wYXJhbXMtPmhlaWdodDsKKyAgICAgICAgaWYgKChyZXQgPSBp bml0X2VuY29kZXIoJnZpZGVvX2VuY19jdHgsIHZpZGVvX2VuY19wYXJhbXMpKSA8IDApCisgICAg ICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgZW5jX3RpbWViYXNlc1sxXSA9IHZpZGVvX2VuY19j dHgtPnRpbWVfYmFzZTsKKyAgICAgICAgaWYgKChyZXQgPSBpbml0X3ZpZGVvX2NvbnZlcnQoJnZp ZGVvX2NvbnZlcnRfY3R4LHZpZGVvX2luX3BhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgdmlkZW9fZW5jX3BhcmFtcykpIDwgMCkKKyAgICAgICAgICAgIGdvdG8g ZW5kOworICAgICAgICBpZiAoKHJldCA9IGluaXRfYXZmcmFtZSgmaW5fdmlkZW9fZnJhbWUsIHZp ZGVvX2luX3BhcmFtcykpIDwgMCkKKyAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICBpZiAo KHJldCA9IGluaXRfYXZmcmFtZSgmY29udmVydGVkX3ZpZGVvX2ZyYW1lLCB2aWRlb19lbmNfcGFy YW1zKSkgPCAwKQorICAgICAgICAgICAgZ290byBlbmQ7CiAgICAgfQogCi0gICAgd2hpbGUgKGVu Y29kZV92aWRlbyB8fCBlbmNvZGVfYXVkaW8pIHsKLSAgICAgICAgLyogc2VsZWN0IHRoZSBzdHJl YW0gdG8gZW5jb2RlICovCi0gICAgICAgIGlmIChlbmNvZGVfdmlkZW8gJiYKLSAgICAgICAgICAg ICghZW5jb2RlX2F1ZGlvIHx8IGF2X2NvbXBhcmVfdHModmlkZW9fc3QubmV4dF9wdHMsIHZpZGVv X3N0LmVuYy0+dGltZV9iYXNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBhdWRpb19zdC5uZXh0X3B0cywgYXVkaW9fc3QuZW5jLT50aW1lX2Jhc2UpIDw9IDAp KSB7Ci0gICAgICAgICAgICBlbmNvZGVfdmlkZW8gPSAhd3JpdGVfdmlkZW9fZnJhbWUob2MsICZ2 aWRlb19zdCk7CisgICAgLyogQ3JlYXRlIHRoZSBvdXRwdXQgY29udGFpbmVyIGZvciB0aGUgZW5j b2RlZCBmcmFtZXMgKi8KKyAgICBpZiAoKHJldCA9IGluaXRfbXV4ZXIoJm91dF9mbXRfY3R4LCBh dWRpb19lbmNfY3R4LCB2aWRlb19lbmNfY3R4LCBmbmFtZSkpIDwgMCkKKyAgICAgICAgZ290byBl bmQ7CisgICAgb3V0X2ZtdF9jdHgtPm9wYXF1ZSA9ICZlbmNfdGltZWJhc2VzOworCisgICAgd2hp bGUgKHByb2Nlc3NfYXVkaW8gfHwgcHJvY2Vzc192aWRlbykgeworCisgICAgICAgIGZyYW1lX3Rv X2VuY29kZSA9IE5VTEw7CisgICAgICAgIG1lZGlhX3R5cGUgPSBtZWRpYV90eXBlX29mX2Vhcmxp ZXJfZnJhbWUoaW5fYXVkaW9fZnJhbWUsIGluX3ZpZGVvX2ZyYW1lKTsKKworICAgICAgICAvKiBm aWxsIGFuZCBjb252ZXJ0IHRoZSBpbnB1dCBmcmFtZXMgKi8KKyAgICAgICAgaWYgKG1lZGlhX3R5 cGUgPT0gQVZNRURJQV9UWVBFX0FVRElPKSB7CisgICAgICAgICAgICBlbmNfY3R4ID0gYXVkaW9f ZW5jX2N0eDsKKyAgICAgICAgICAgIGZpbGxfZHVtbXlfczE2X2ZyYW1lKGluX2F1ZGlvX2ZyYW1l KTsKKyAgICAgICAgICAgIGlmICgocmV0ID0gY29udmVydF9mcmFtZShhdWRpb19jb252ZXJ0X2N0 eCwgaW5fYXVkaW9fZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg Y29udmVydGVkX2F1ZGlvX2ZyYW1lKSkgIT0gMCkKKyAgICAgICAgICAgICAgICBnb3RvIGVuZDsK KyAgICAgICAgICAgIGlmICghZnJhbWVfZXhjZWVkc19zdHJlYW1fZHVyYXRpb24oY29udmVydGVk X2F1ZGlvX2ZyYW1lKSkKKyAgICAgICAgICAgICAgICBmcmFtZV90b19lbmNvZGUgPSBjb252ZXJ0 ZWRfYXVkaW9fZnJhbWU7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBlbmNvZGVfYXVk aW8gPSAhd3JpdGVfYXVkaW9fZnJhbWUob2MsICZhdWRpb19zdCk7CisgICAgICAgICAgICBlbmNf Y3R4ID0gdmlkZW9fZW5jX2N0eDsKKyAgICAgICAgICAgIGZpbGxfZHVtbXlfeXV2NDIwcF9mcmFt ZShpbl92aWRlb19mcmFtZSk7CisgICAgICAgICAgICBpZiAoKHJldCA9IGNvbnZlcnRfZnJhbWUo dmlkZW9fY29udmVydF9jdHgsIGluX3ZpZGVvX2ZyYW1lLAorICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIGNvbnZlcnRlZF92aWRlb19mcmFtZSkpICE9IDApCisgICAgICAgICAg ICAgICAgZ290byBlbmQ7CisgICAgICAgICAgICBpZiAoIWZyYW1lX2V4Y2VlZHNfc3RyZWFtX2R1 cmF0aW9uKGluX3ZpZGVvX2ZyYW1lKSkKKyAgICAgICAgICAgICAgICBmcmFtZV90b19lbmNvZGUg PSBjb252ZXJ0ZWRfdmlkZW9fZnJhbWU7CiAgICAgICAgIH0KLSAgICB9Ci0KLSAgICBhdl93cml0 ZV90cmFpbGVyKG9jKTsKIAotICAgIC8qIENsb3NlIGVhY2ggY29kZWMuICovCi0gICAgaWYgKGhh dmVfdmlkZW8pCi0gICAgICAgIGNsb3NlX3N0cmVhbShvYywgJnZpZGVvX3N0KTsKLSAgICBpZiAo aGF2ZV9hdWRpbykKLSAgICAgICAgY2xvc2Vfc3RyZWFtKG9jLCAmYXVkaW9fc3QpOworICAgICAg ICAvKiBlbmNvZGUgdGhlIGNvbnZlcnRlZCBmcmFtZXMgYW5kIG11eCB0aGUgZW5jb2RlZCBwYWNr ZXRzICovCisgICAgICAgIGlmICgocmV0ID0gZW5jb2RlX2ZyYW1lKGVuY19jdHgsIGZyYW1lX3Rv X2VuY29kZSwgb3V0X3BrdCkpID09IDApIHsKKyAgICAgICAgICAgIGlmICgocmV0ID0gbXV4X2Vu Y29kZWRfcGt0KG91dF9wa3QsIG91dF9mbXRfY3R4LCBtZWRpYV90eXBlKSkgPCAwKQorICAgICAg ICAgICAgICAgZ290byBlbmQ7CisgICAgICAgIH0KIAotICAgIGlmICghKGZtdC0+ZmxhZ3MgJiBB VkZNVF9OT0ZJTEUpKQotICAgICAgICAvKiBDbG9zZSB0aGUgb3V0cHV0IGZpbGUuICovCi0gICAg ICAgIGF2aW9fY2xvc2VwKCZvYy0+cGIpOworICAgICAgICAvKiBjaGVjayBpZiB0aGUgZW5jb2Rl cnMgaGF2ZSBiZWVuIGZ1bGx5IGZsdXNoZWQgKi8KKyAgICAgICAgcHJvY2Vzc19hdWRpbyAmPSAh KChyZXQgPT0gQVZFUlJPUl9FT0YpICYmIChtZWRpYV90eXBlID09IEFWTUVESUFfVFlQRV9BVURJ TykpOworICAgICAgICBwcm9jZXNzX3ZpZGVvICY9ICEoKHJldCA9PSBBVkVSUk9SX0VPRikgJiYg KG1lZGlhX3R5cGUgPT0gQVZNRURJQV9UWVBFX1ZJREVPKSk7CiAKLSAgICAvKiBmcmVlIHRoZSBz dHJlYW0gKi8KLSAgICBhdmZvcm1hdF9mcmVlX2NvbnRleHQob2MpOworICAgIH0KIAotICAgIHJl dHVybiAwOworICAgIGF2X3dyaXRlX3RyYWlsZXIob3V0X2ZtdF9jdHgpOworICAgIHJldCA9IDA7 CisKK2VuZDoKKworICAgIGF2Y29kZWNfcGFyYW1ldGVyc19mcmVlKCZhdWRpb19pbl9wYXJhbXMp OworICAgIGF2Y29kZWNfcGFyYW1ldGVyc19mcmVlKCZ2aWRlb19pbl9wYXJhbXMpOworICAgIGF2 Y29kZWNfcGFyYW1ldGVyc19mcmVlKCZhdWRpb19lbmNfcGFyYW1zKTsKKyAgICBhdmNvZGVjX3Bh cmFtZXRlcnNfZnJlZSgmdmlkZW9fZW5jX3BhcmFtcyk7CisgICAgYXZjb2RlY19mcmVlX2NvbnRl eHQoJmF1ZGlvX2VuY19jdHgpOworICAgIGF2Y29kZWNfZnJlZV9jb250ZXh0KCZ2aWRlb19lbmNf Y3R4KTsKKyAgICBhdl9mcmFtZV9mcmVlKCZpbl9hdWRpb19mcmFtZSk7CisgICAgYXZfZnJhbWVf ZnJlZSgmaW5fdmlkZW9fZnJhbWUpOworICAgIGF2X2ZyYW1lX2ZyZWUoJmNvbnZlcnRlZF9hdWRp b19mcmFtZSk7CisgICAgYXZfZnJhbWVfZnJlZSgmY29udmVydGVkX3ZpZGVvX2ZyYW1lKTsKKyAg ICBzd3JfZnJlZSgmYXVkaW9fY29udmVydF9jdHgpOworICAgIHN3c19mcmVlQ29udGV4dCh2aWRl b19jb252ZXJ0X2N0eCk7CisgICAgaWYgKG91dF9mbXRfY3R4KQorICAgICAgICBhdmlvX2Nsb3Nl cCgmb3V0X2ZtdF9jdHgtPnBiKTsKKyAgICBhdmZvcm1hdF9mcmVlX2NvbnRleHQob3V0X2ZtdF9j dHgpOworICAgIGF2X3BhY2tldF9mcmVlKCZvdXRfcGt0KTsKKworICAgIHJldHVybiByZXQ7CiB9 Ci0tIAoyLjMyLjAKCg== ------=_Part_9340923_218664257.1655598357190 Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe". ------=_Part_9340923_218664257.1655598357190--