On 08/02/16 21:05, Vittorio Giovara wrote:
> On Mon, Aug 31, 2015 at 11:07 AM, Luca Barbato <[email protected]> wrote:
>> Same rationale and same code
>> ---
>>  libavcodec/libx265.c | 31 +++++++++++++++++++++++++++----
>>  1 file changed, 27 insertions(+), 4 deletions(-)
>>
>> diff --git a/libavcodec/libx265.c b/libavcodec/libx265.c
>> index 11ffccf..0fa2bab 100644
>> --- a/libavcodec/libx265.c
>> +++ b/libavcodec/libx265.c
>> @@ -36,6 +36,8 @@
>>
>>  typedef struct libx265Context {
>>      const AVClass *class;
>> +    int match_frame_type;
>> +    int forced_idr;
>>
>>      x265_encoder *encoder;
>>      x265_param   *params;
>> @@ -47,6 +49,13 @@ typedef struct libx265Context {
>>      char *x265_opts;
>>  } libx265Context;
>>
>> +enum {
>> +    MATCH_IFRAME = 1 << 0,
>> +    MATCH_PFRAME = 1 << 1,
>> +    MATCH_BFRAME = 1 << 2,
>> +    MATCH_ALL    = MATCH_BFRAME | MATCH_PFRAME | MATCH_IFRAME
>> +};
>> +
>>  static int is_keyframe(NalUnitType naltype)
>>  {
>>      switch (naltype) {
>> @@ -263,10 +272,19 @@ static int libx265_encode_frame(AVCodecContext *avctx, 
>> AVPacket *pkt,
>>          x265pic.pts      = pic->pts;
>>          x265pic.bitDepth = 
>> av_pix_fmt_desc_get(avctx->pix_fmt)->comp[0].depth_minus1 + 1;
>>
>> -        x265pic.sliceType = pic->pict_type == AV_PICTURE_TYPE_I ? 
>> X265_TYPE_I :
>> -                            pic->pict_type == AV_PICTURE_TYPE_P ? 
>> X265_TYPE_P :
>> -                            pic->pict_type == AV_PICTURE_TYPE_B ? 
>> X265_TYPE_B :
>> -                            X265_TYPE_AUTO;
>> +        x265pic.sliceType = X265_TYPE_AUTO;
>> +
>> +        if (ctx->match_frame_type) {
>> +            if ((ctx->match_frame_type & MATCH_IFRAME) &&
>> +                pic->pict_type == AV_PICTURE_TYPE_I)
>> +                x265pic.sliceType = (ctx->forced_idr > 0) ? X265_TYPE_IDR : 
>> X265_TYPE_I;
>> +            if ((ctx->match_frame_type & MATCH_PFRAME) &&
>> +                pic->pict_type == AV_PICTURE_TYPE_P)
>> +                x265pic.sliceType = X265_TYPE_P;
>> +            if ((ctx->match_frame_type & MATCH_BFRAME) &&
>> +                pic->pict_type == AV_PICTURE_TYPE_B)
>> +                x265pic.sliceType = X265_TYPE_B;
>> +        }
>>      }
>>
>>      ret = ctx->api->encoder_encode(ctx->encoder, &nal, &nnal,
>> @@ -350,6 +368,11 @@ static const AVOption options[] = {
>>      { "crf",         "set the x265 crf",                                    
>>                         OFFSET(crf),       AV_OPT_TYPE_FLOAT,  { .dbl = -1 
>> }, -1, FLT_MAX, VE },
>>      { "preset",      "set the x265 preset",                                 
>>                         OFFSET(preset),    AV_OPT_TYPE_STRING, { 0 }, 0, 0, 
>> VE },
>>      { "tune",        "set the x265 tune parameter",                         
>>                         OFFSET(tune),      AV_OPT_TYPE_STRING, { 0 }, 0, 0, 
>> VE },
>> +    { "match-frame-type", "Forward the frame type information to the 
>> encoder", OFFSET(match_frame_type),  AV_OPT_TYPE_FLAGS, { .i64 = MATCH_ALL 
>> }, 0, UINT_MAX, VE, "match-frame" },
>> +    { "iframe",        NULL, 0, AV_OPT_TYPE_CONST, { .i64 = MATCH_IFRAME }, 
>>  INT_MIN, INT_MAX, VE, "match-frame" },
>> +    { "pframe",        NULL, 0, AV_OPT_TYPE_CONST, { .i64 = MATCH_PFRAME }, 
>>  INT_MIN, INT_MAX, VE, "match-frame" },
>> +    { "bframe",        NULL, 0, AV_OPT_TYPE_CONST, { .i64 = MATCH_BFRAME }, 
>>  INT_MIN, INT_MAX, VE, "match-frame" },
>> +    { "forced-idr",   "If forwarding iframes, require them to be IDR 
>> frames.", OFFSET(forced_idr),  AV_OPT_TYPE_INT,    { .i64 = -1 }, -1, 1, VE 
>> },
>>      { "x265-params", "set the x265 configuration using a :-separated list 
>> of key=value parameters", OFFSET(x265_opts), AV_OPT_TYPE_STRING, { 0 }, 0, 
>> 0, VE },
>>      { NULL }
>>  };
>> --
> 
> is this still needed?
> 

No, it is not.
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to