diff mbox

[FFmpeg-devel] avcodec/dca: add support for 20-bit XLL

Message ID 20170107092643.27112-1-foobaz86@gmail.com
State Accepted
Commit 000638431ccc206f280d8246855062afe0284f80
Headers show

Commit Message

foo86 Jan. 7, 2017, 9:26 a.m. UTC
Fixes ticket #6063.
---
 libavcodec/dca_xll.c | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

Comments

Paul B Mahol Jan. 7, 2017, 10:09 a.m. UTC | #1
On 1/7/17, foo86 <foobaz86@gmail.com> wrote:
> Fixes ticket #6063.
> ---
>  libavcodec/dca_xll.c | 6 ++++--
>  1 file changed, 4 insertions(+), 2 deletions(-)
>
> diff --git a/libavcodec/dca_xll.c b/libavcodec/dca_xll.c
> index 1d616c298c..1320aaf28f 100644
> --- a/libavcodec/dca_xll.c
> +++ b/libavcodec/dca_xll.c
> @@ -143,7 +143,7 @@ static int chs_parse_header(DCAXllDecoder *s,
> DCAXllChSet *c, DCAExssAsset *asse
>
>      // Storage unit width
>      c->storage_bit_res = get_bits(&s->gb, 5) + 1;
> -    if (c->storage_bit_res != 16 && c->storage_bit_res != 24) {
> +    if (c->storage_bit_res != 16 && c->storage_bit_res != 20 &&
> c->storage_bit_res != 24) {
>          avpriv_request_sample(s->avctx, "%d-bit XLL storage resolution",
> c->storage_bit_res);
>          return AVERROR_PATCHWELCOME;
>      }
> @@ -1415,9 +1415,12 @@ int ff_dca_xll_filter_frame(DCAXllDecoder *s, AVFrame
> *frame)
>      switch (p->storage_bit_res) {
>      case 16:
>          avctx->sample_fmt = AV_SAMPLE_FMT_S16P;
> +        shift = 16 - p->pcm_bit_res;
>          break;
> +    case 20:
>      case 24:
>          avctx->sample_fmt = AV_SAMPLE_FMT_S32P;
> +        shift = 24 - p->pcm_bit_res;
>          break;
>      default:
>          return AVERROR(EINVAL);
> @@ -1438,7 +1441,6 @@ int ff_dca_xll_filter_frame(DCAXllDecoder *s, AVFrame
> *frame)
>                                         s->output_mask);
>      }
>
> -    shift = p->storage_bit_res - p->pcm_bit_res;
>      for (i = 0; i < avctx->channels; i++) {
>          int32_t *samples = s->output_samples[ch_remap[i]];
>          if (frame->format == AV_SAMPLE_FMT_S16P) {
> --
> 2.11.0
>
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel@ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>

lgtm
James Almer Jan. 7, 2017, 2:39 p.m. UTC | #2
On 1/7/2017 6:26 AM, foo86 wrote:
> Fixes ticket #6063.
> ---
>  libavcodec/dca_xll.c | 6 ++++--
>  1 file changed, 4 insertions(+), 2 deletions(-)
> 
> diff --git a/libavcodec/dca_xll.c b/libavcodec/dca_xll.c
> index 1d616c298c..1320aaf28f 100644
> --- a/libavcodec/dca_xll.c
> +++ b/libavcodec/dca_xll.c
> @@ -143,7 +143,7 @@ static int chs_parse_header(DCAXllDecoder *s, DCAXllChSet *c, DCAExssAsset *asse
>  
>      // Storage unit width
>      c->storage_bit_res = get_bits(&s->gb, 5) + 1;
> -    if (c->storage_bit_res != 16 && c->storage_bit_res != 24) {
> +    if (c->storage_bit_res != 16 && c->storage_bit_res != 20 && c->storage_bit_res != 24) {
>          avpriv_request_sample(s->avctx, "%d-bit XLL storage resolution", c->storage_bit_res);
>          return AVERROR_PATCHWELCOME;
>      }
> @@ -1415,9 +1415,12 @@ int ff_dca_xll_filter_frame(DCAXllDecoder *s, AVFrame *frame)
>      switch (p->storage_bit_res) {
>      case 16:
>          avctx->sample_fmt = AV_SAMPLE_FMT_S16P;
> +        shift = 16 - p->pcm_bit_res;
>          break;
> +    case 20:
>      case 24:
>          avctx->sample_fmt = AV_SAMPLE_FMT_S32P;
> +        shift = 24 - p->pcm_bit_res;
>          break;
>      default:
>          return AVERROR(EINVAL);
> @@ -1438,7 +1441,6 @@ int ff_dca_xll_filter_frame(DCAXllDecoder *s, AVFrame *frame)
>                                         s->output_mask);
>      }
>  
> -    shift = p->storage_bit_res - p->pcm_bit_res;
>      for (i = 0; i < avctx->channels; i++) {
>          int32_t *samples = s->output_samples[ch_remap[i]];
>          if (frame->format == AV_SAMPLE_FMT_S16P) {

I think you still don't have git access, so pushed.

Poke Michael with your public key if that's the case and you want it.
Michael Niedermayer Jan. 7, 2017, 4:29 p.m. UTC | #3
On Sat, Jan 07, 2017 at 12:26:43PM +0300, foo86 wrote:
> Fixes ticket #6063.
> ---
>  libavcodec/dca_xll.c | 6 ++++--
>  1 file changed, 4 insertions(+), 2 deletions(-)

I think i suggested it before but
You are de facto maintaining dca, you should add yourself in a patch
to the MAINTAINERs file for dca

[...]
diff mbox

Patch

diff --git a/libavcodec/dca_xll.c b/libavcodec/dca_xll.c
index 1d616c298c..1320aaf28f 100644
--- a/libavcodec/dca_xll.c
+++ b/libavcodec/dca_xll.c
@@ -143,7 +143,7 @@  static int chs_parse_header(DCAXllDecoder *s, DCAXllChSet *c, DCAExssAsset *asse
 
     // Storage unit width
     c->storage_bit_res = get_bits(&s->gb, 5) + 1;
-    if (c->storage_bit_res != 16 && c->storage_bit_res != 24) {
+    if (c->storage_bit_res != 16 && c->storage_bit_res != 20 && c->storage_bit_res != 24) {
         avpriv_request_sample(s->avctx, "%d-bit XLL storage resolution", c->storage_bit_res);
         return AVERROR_PATCHWELCOME;
     }
@@ -1415,9 +1415,12 @@  int ff_dca_xll_filter_frame(DCAXllDecoder *s, AVFrame *frame)
     switch (p->storage_bit_res) {
     case 16:
         avctx->sample_fmt = AV_SAMPLE_FMT_S16P;
+        shift = 16 - p->pcm_bit_res;
         break;
+    case 20:
     case 24:
         avctx->sample_fmt = AV_SAMPLE_FMT_S32P;
+        shift = 24 - p->pcm_bit_res;
         break;
     default:
         return AVERROR(EINVAL);
@@ -1438,7 +1441,6 @@  int ff_dca_xll_filter_frame(DCAXllDecoder *s, AVFrame *frame)
                                        s->output_mask);
     }
 
-    shift = p->storage_bit_res - p->pcm_bit_res;
     for (i = 0; i < avctx->channels; i++) {
         int32_t *samples = s->output_samples[ch_remap[i]];
         if (frame->format == AV_SAMPLE_FMT_S16P) {