From patchwork Fri Sep 14 15:55:33 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paul B Mahol X-Patchwork-Id: 10326 Delivered-To: ffmpegpatchwork@gmail.com Received: by 2002:a02:12c4:0:0:0:0:0 with SMTP id 65-v6csp797510jap; Fri, 14 Sep 2018 08:56:00 -0700 (PDT) X-Google-Smtp-Source: ANB0VdYLHZGujByW86NoCAwMRC2BVHavXZ7M/cVn4Rq+LIc6V4KImmunqGVGaFnwKj+3t7kGmVhy X-Received: by 2002:a1c:760d:: with SMTP id r13-v6mr2757861wmc.22.1536940560135; Fri, 14 Sep 2018 08:56:00 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1536940560; cv=none; d=google.com; s=arc-20160816; b=pFlYDjGsvH6eh5MsgYW4kwq6mVnzcGgmFEObIEjMBImQ/ZbfjVABTBKejwyuweW50V b1xkOioqsPFhOviVxtJqKut0Yqgo9A9nE4MeSNjMAoisLin6nFNM/e9x6wtNcaaNNtLd k75OoQDBSuQOCxbM/7jdV6qzPjdI5iU6OS/j0JcVTZAGfQp/X2NvAJyYCSaoGOIZPjKl 9deJKhLnJz7lCINph6XPdcBrD111QB8trVhuAKvwHoZofKazQfZkV8T9WsKqwiN3K0Sm J6atKm1KG5rxmelbZp3BMAglxdKZHTLVQD2yCUBpUWnDVqOoc3UlGHBuRp3xbjDGEZZ/ PHdA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:mime-version:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:references:in-reply-to:message-id:date :to:from:dkim-signature:delivered-to; bh=VJiwzHesoP5isnFajJNRlF03h6iMQ8rtYUdgGqq7iPI=; b=C1RsZWSJvTtzCpBgl7sWVLcpZP+2npSV5otJL3mPz2N+ZM5DVMgEiME+bwoFGLZ+DA WV6JYGeC5rZKbK11IfJJq9qyGk7qQ+1D/gBPKCArNtGebJbKuSjFzHeOuBICuzgSCem0 HP6Frke086Np0cu3Cqo3JtknW78h5+P115h640gPxxmZvlaZeFHzJIat4kDriD80cIVm AFyeg/7d3NyS3NcplVyQuIl+8sLTHInXriYipUIrYu29W+PaKbKMnnb5unUZ/EEnA8MO D9ZaV4AnN620Oi0dznaP245iwCvrzeCsQLPGN8sqCaS1GaRjpoGpeNXuLKrpMM53bphn pM3w== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=ibsFzxA5; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id 35-v6si7160590wrq.201.2018.09.14.08.55.59; Fri, 14 Sep 2018 08:56:00 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com header.s=20161025 header.b=ibsFzxA5; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 73EA468A634; Fri, 14 Sep 2018 18:55:46 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-ed1-f53.google.com (mail-ed1-f53.google.com [209.85.208.53]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id D428568A624 for ; Fri, 14 Sep 2018 18:55:39 +0300 (EEST) Received: by mail-ed1-f53.google.com with SMTP id s10-v6so7813479edb.11 for ; Fri, 14 Sep 2018 08:55:51 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id:in-reply-to:references; bh=mbuCpsZGixpnCl+iRvCXCBIGEFlbaKt0t6BQRcufww0=; b=ibsFzxA5BtUYMGYG9gnyXFucwhMR0DLhx+FAktDJgA6PVxnhKsK7M/tNyGVaNbjxd1 7AgE0Fr3ZsMTlqN5ltvAAS5Nv1zr73uh3XJeIPaGsV5Yhi9STqhNCZWii36GLGpEpu1h oCBX12Uh00carlIQ5A2JM4mrhYIcoFllugBjVHjywDDGxj0rf3ofpqmamhM3fKuir8oq U/snna0l+1jEg1/PXNz38H4driXs7yvau/Eo9/4H5NXJA5ymB0YpoyJsz6p5OSVEoOpj DCc1BLMeVZ3E2GDswQWPxf/FRYipvFrGBwgG7GE+12krvNWmbbrAvWShwiUnJI787UIM CdAQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references; bh=mbuCpsZGixpnCl+iRvCXCBIGEFlbaKt0t6BQRcufww0=; b=r3hxsi5FkTZzVYJk7rqBIgfpHDIdpHxG+iMkGc3FcfZ8LuMT0nVg4LpNqeFnJjH268 Zub16r5ttazBCoaNH4+Cr77KrcLJU0t3V9cfQppPhV3IJJA8ywtRbwspH49I8/AhKgZR UC6Cmz7AAO5puDcdwamIRzfhEiYmXQwZSFE77dEKhsT8GCeoUb5qKqebZMCVlCCUkNgH 8RsUaTBsdapH9hjm5F9C8/+6qbyqm8tmSUYd2DSbq4zr/DwDug8ZtfGJtpXvdQ8cr0/q dooVS8zT9oV/x8gkWDi42N/tY5xg0grDZxwmrqmfciK5DonKP9/mWHMXZL9PJfDmSoXQ unuA== X-Gm-Message-State: APzg51A6GePM9H3rV7QA5lpMXgHSgIZCtz0l41/NVr6yCPlTKRLNbOCt lddq+HKjjj9rPPrgXiC9IBu6pUnk X-Received: by 2002:a50:8612:: with SMTP id o18-v6mr21709516edo.111.1536940550286; Fri, 14 Sep 2018 08:55:50 -0700 (PDT) Received: from localhost.localdomain ([94.250.174.60]) by smtp.gmail.com with ESMTPSA id b47-v6sm3204611eda.79.2018.09.14.08.55.49 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 14 Sep 2018 08:55:49 -0700 (PDT) From: Paul B Mahol To: ffmpeg-devel@ffmpeg.org Date: Fri, 14 Sep 2018 17:55:33 +0200 Message-Id: <20180914155533.4413-1-onemda@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20180914122404.17824-1-onemda@gmail.com> References: <20180914122404.17824-1-onemda@gmail.com> Subject: [FFmpeg-devel] [RFC][WIP][PATCH] avcodec: add IMM5 decoder X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 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 MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Signed-off-by: Paul B Mahol --- libavcodec/Makefile | 5 ++++ libavcodec/allcodecs.c | 1 + libavcodec/avcodec.h | 1 + libavcodec/codec_desc.c | 7 +++++ libavcodec/h264dec.c | 58 ++++++++++++++++++++++++++++++++++++++++- libavcodec/h264dec.h | 3 +++ libavformat/riff.c | 1 + 7 files changed, 75 insertions(+), 1 deletion(-) diff --git a/libavcodec/Makefile b/libavcodec/Makefile index 3e16a13004..22f456bda3 100644 --- a/libavcodec/Makefile +++ b/libavcodec/Makefile @@ -386,6 +386,11 @@ OBJS-$(CONFIG_IDF_DECODER) += bintext.o cga_data.o OBJS-$(CONFIG_IFF_ILBM_DECODER) += iff.o OBJS-$(CONFIG_IMC_DECODER) += imc.o OBJS-$(CONFIG_IMM4_DECODER) += imm4.o +OBJS-$(CONFIG_IMM5_DECODER) += h264dec.o h264_cabac.o h264_cavlc.o \ + h264_direct.o h264_loopfilter.o \ + h264_mb.o h264_picture.o \ + h264_refs.o h264_sei.o \ + h264_slice.o h264data.o OBJS-$(CONFIG_INDEO2_DECODER) += indeo2.o OBJS-$(CONFIG_INDEO3_DECODER) += indeo3.o OBJS-$(CONFIG_INDEO4_DECODER) += indeo4.o ivi.o diff --git a/libavcodec/allcodecs.c b/libavcodec/allcodecs.c index 7dbfcb3dda..29bf718fd4 100644 --- a/libavcodec/allcodecs.c +++ b/libavcodec/allcodecs.c @@ -155,6 +155,7 @@ extern AVCodec ff_huffyuv_decoder; extern AVCodec ff_idcin_decoder; extern AVCodec ff_iff_ilbm_decoder; extern AVCodec ff_imm4_decoder; +extern AVCodec ff_imm5_decoder; extern AVCodec ff_indeo2_decoder; extern AVCodec ff_indeo3_decoder; extern AVCodec ff_indeo4_decoder; diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h index 705a3ce4f3..356cf28325 100644 --- a/libavcodec/avcodec.h +++ b/libavcodec/avcodec.h @@ -452,6 +452,7 @@ enum AVCodecID { AV_CODEC_ID_MWSC, AV_CODEC_ID_WCMV, AV_CODEC_ID_RASC, + AV_CODEC_ID_IMM5, /* various PCM "codecs" */ AV_CODEC_ID_FIRST_AUDIO = 0x10000, ///< A dummy id pointing at the start of audio codecs diff --git a/libavcodec/codec_desc.c b/libavcodec/codec_desc.c index 67a30542d1..e630109db4 100644 --- a/libavcodec/codec_desc.c +++ b/libavcodec/codec_desc.c @@ -1689,6 +1689,13 @@ static const AVCodecDescriptor codec_descriptors[] = { .long_name = NULL_IF_CONFIG_SMALL("RemotelyAnywhere Screen Capture"), .props = AV_CODEC_PROP_LOSSY, }, + { + .id = AV_CODEC_ID_IMM5, + .type = AVMEDIA_TYPE_VIDEO, + .name = "imm5", + .long_name = NULL_IF_CONFIG_SMALL("Infinity IMM5"), + .props = AV_CODEC_PROP_LOSSY, + }, /* various PCM "codecs" */ { diff --git a/libavcodec/h264dec.c b/libavcodec/h264dec.c index 7b4c5c76ea..19e1e743cf 100644 --- a/libavcodec/h264dec.c +++ b/libavcodec/h264dec.c @@ -412,7 +412,7 @@ static av_cold int h264_decode_init(AVCodecContext *avctx) } avctx->ticks_per_frame = 2; - if (avctx->extradata_size > 0 && avctx->extradata) { + if (avctx->codec_id != AV_CODEC_ID_IMM5 && avctx->extradata_size > 0 && avctx->extradata) { ret = ff_h264_decode_extradata(avctx->extradata, avctx->extradata_size, &h->ps, &h->is_avc, &h->nal_length_size, avctx->err_recognition, avctx); @@ -958,6 +958,26 @@ static int send_next_delayed_frame(H264Context *h, AVFrame *dst_frame, return buf_index; } +static const struct IMM5_unit { + uint8_t bits[14]; + uint8_t len; +} IMM5_units[14] = { + { { 0x00, 0x00, 0x00, 0x01, 0x67, 0x42, 0x80, 0x1E, 0xF4, 0x0B, 0x0F, 0x88 }, 12 }, + { { 0x00, 0x00, 0x00, 0x01, 0x67, 0x42, 0x80, 0x1E, 0xF4, 0x05, 0x83, 0xE2 }, 12 }, + { { 0x00, 0x00, 0x00, 0x01, 0x67, 0x42, 0x80, 0x1E, 0xF4, 0x05, 0x81, 0xE8, 0x80 }, 13 }, + { { 0x00, 0x00, 0x00, 0x01, 0x67, 0x42, 0x80, 0x1E, 0xF4, 0x0B, 0x04, 0xA2 }, 12 }, + { { 0x00, 0x00, 0x00, 0x01, 0x67, 0x42, 0x80, 0x1E, 0xF4, 0x05, 0x81, 0x28, 0x80 }, 13 }, + { { 0x00, 0x00, 0x00, 0x01, 0x67, 0x42, 0x80, 0x1E, 0xF4, 0x05, 0x80, 0x92, 0x20 }, 13 }, + { { 0x00, 0x00, 0x00, 0x01, 0x67, 0x42, 0x00, 0x1E, 0x9A, 0x74, 0x0B, 0x0F, 0xC8 }, 13 }, + { { 0x00, 0x00, 0x00, 0x01, 0x67, 0x42, 0x00, 0x1E, 0x9A, 0x74, 0x05, 0x83, 0xF2 }, 13 }, + { { 0x00, 0x00, 0x00, 0x01, 0x67, 0x42, 0x00, 0x1E, 0x9A, 0x74, 0x05, 0x81, 0xEC, 0x80 }, 14 }, + { { 0x00, 0x00, 0x00, 0x01, 0x67, 0x42, 0x00, 0x1E, 0x9A, 0x74, 0x0B, 0x04, 0xB2 }, 13 }, + { { 0x00, 0x00, 0x00, 0x01, 0x67, 0x42, 0x00, 0x1E, 0x9A, 0x74, 0x05, 0x81, 0x2C, 0x80 }, 14 }, + { { 0x00, 0x00, 0x00, 0x01, 0x67, 0x42, 0x00, 0x1E, 0x9A, 0x74, 0x05, 0x80, 0x93, 0x20 }, 14 }, + { { 0x00, 0x00, 0x00, 0x01, 0x68, 0xDE, 0x3C, 0x80 }, 8 }, + { { 0x00, 0x00, 0x00, 0x01, 0x68, 0xCE, 0x32, 0x28 }, 8 }, +}; + static int h264_decode_frame(AVCodecContext *avctx, void *data, int *got_frame, AVPacket *avpkt) { @@ -968,6 +988,26 @@ static int h264_decode_frame(AVCodecContext *avctx, void *data, int buf_index; int ret; + if (avctx->codec_id == AV_CODEC_ID_IMM5) { + if (avpkt->size > 24) { + int index = avpkt->data[10]; + int offset; + + if (index < 1 || index > 12) + return AVERROR_INVALIDDATA; + index -= 1; + + av_fast_padded_malloc(&h->imm5_buffer, &h->imm5_buffer_size, buf_size); + memcpy(h->imm5_buffer, IMM5_units[index].bits, IMM5_units[index].len); + offset = IMM5_units[index].len; + memcpy(h->imm5_buffer + offset, IMM5_units[12].bits, IMM5_units[12].len); + offset += IMM5_units[12].len; + memcpy(h->imm5_buffer + offset, avpkt->data + 24, buf_size - 24); + buf = h->imm5_buffer; + buf_size = buf_size - 24 + offset; + } + } + h->flags = avctx->flags; h->setup_finished = 0; h->nb_slice_ctx_queued = 0; @@ -1090,3 +1130,19 @@ AVCodec ff_h264_decoder = { .profiles = NULL_IF_CONFIG_SMALL(ff_h264_profiles), .priv_class = &h264_class, }; + +AVCodec ff_imm5_decoder = { + .name = "imm5", + .long_name = NULL_IF_CONFIG_SMALL("Infinity IMM5"), + .type = AVMEDIA_TYPE_VIDEO, + .id = AV_CODEC_ID_IMM5, + .priv_data_size = sizeof(H264Context), + .init = h264_decode_init, + .close = h264_decode_end, + .decode = h264_decode_frame, + .capabilities = /*AV_CODEC_CAP_DRAW_HORIZ_BAND |*/ AV_CODEC_CAP_DR1 | + AV_CODEC_CAP_DELAY, + .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE | FF_CODEC_CAP_EXPORTS_CROPPING, + .flush = flush_dpb, + .profiles = NULL_IF_CONFIG_SMALL(ff_h264_profiles), +}; diff --git a/libavcodec/h264dec.h b/libavcodec/h264dec.h index 1d9723260d..1e72781b3f 100644 --- a/libavcodec/h264dec.h +++ b/libavcodec/h264dec.h @@ -353,6 +353,9 @@ typedef struct H264Context { H2645Packet pkt; + uint8_t *imm5_buffer; + int imm5_buffer_size; + int pixel_shift; ///< 0 for 8-bit H.264, 1 for high-bit-depth H.264 /* coded dimensions -- 16 * mb w/h */ diff --git a/libavformat/riff.c b/libavformat/riff.c index 3907e1a9f3..583c0158d8 100644 --- a/libavformat/riff.c +++ b/libavformat/riff.c @@ -475,6 +475,7 @@ const AVCodecTag ff_codec_bmp_tags[] = { { AV_CODEC_ID_MWSC, MKTAG('M', 'W', 'S', 'C') }, { AV_CODEC_ID_WCMV, MKTAG('W', 'C', 'M', 'V') }, { AV_CODEC_ID_RASC, MKTAG('R', 'A', 'S', 'C') }, + { AV_CODEC_ID_IMM5, MKTAG('I', 'M', 'M', '5') }, { AV_CODEC_ID_NONE, 0 } };