Commit 7b0b10ce authored by Michael Niedermayer's avatar Michael Niedermayer

Merge remote-tracking branch 'qatar/master'

* qatar/master: (25 commits)
  rtpenc: Add support for G726 audio
  rtpdec: Interpret the different G726 names as bits_per_coded_sample
  rtpenc: Change rtp_send_samples to handle sample sizes other than even bytes
  rtpenc: Cast a rescaling parameter to int64_t
  h264: cap max has_b_frames at MAX_DELAYED_PIC_COUNT - 1.
  ARM: fix indentation in ff_dsputil_init_neon()
  ARM: NEON put/avg_pixels8/16 cosmetics
  ARM: add remaining NEON avg_pixels8/16 functions
  ARM: clean up NEON put/avg_pixels macros
  fate: split acodec-pcm into individual tests
  swscale: #include "libavutil/mathematics.h"
  pmpdec: don't use deprecated av_set_pts_info.
  rv34: align temporary block of "dct" coefs
  Add PlayStation Portable PMP format demuxer
  proto: Realign struct initializers
  proto: Use .priv_data_size to allocate the private context
  mmsh: Properly clean up if the second ffurl_alloc failed
  rtmp: Clean up properly if the handshake failed
  md5proto: Remove the get_file_handle function
  applehttpproto: Use the close function if the open function fails
  ...

Conflicts:
	libavcodec/vble.c
	libavformat/mmsh.c
	libavformat/pmpdec.c
	libavformat/udp.c
	tests/ref/acodec/pcm
Merged-by: 's avatarMichael Niedermayer <michaelni@gmx.at>
parents 8b08f819 04403ec2
...@@ -126,6 +126,7 @@ easier to use. The changes are: ...@@ -126,6 +126,7 @@ easier to use. The changes are:
- IFF Amiga Continuous Bitmap (ACBM) decoder - IFF Amiga Continuous Bitmap (ACBM) decoder
- ass filter - ass filter
- CRI ADX audio format demuxer - CRI ADX audio format demuxer
- Playstation Portable PMP format demuxer
version 0.8: version 0.8:
......
...@@ -53,7 +53,19 @@ void ff_put_pixels8_y2_no_rnd_neon(uint8_t *, const uint8_t *, int, int); ...@@ -53,7 +53,19 @@ void ff_put_pixels8_y2_no_rnd_neon(uint8_t *, const uint8_t *, int, int);
void ff_put_pixels8_xy2_no_rnd_neon(uint8_t *, const uint8_t *, int, int); void ff_put_pixels8_xy2_no_rnd_neon(uint8_t *, const uint8_t *, int, int);
void ff_avg_pixels16_neon(uint8_t *, const uint8_t *, int, int); void ff_avg_pixels16_neon(uint8_t *, const uint8_t *, int, int);
void ff_avg_pixels16_x2_neon(uint8_t *, const uint8_t *, int, int);
void ff_avg_pixels16_y2_neon(uint8_t *, const uint8_t *, int, int);
void ff_avg_pixels16_xy2_neon(uint8_t *, const uint8_t *, int, int);
void ff_avg_pixels8_neon(uint8_t *, const uint8_t *, int, int); void ff_avg_pixels8_neon(uint8_t *, const uint8_t *, int, int);
void ff_avg_pixels8_x2_neon(uint8_t *, const uint8_t *, int, int);
void ff_avg_pixels8_y2_neon(uint8_t *, const uint8_t *, int, int);
void ff_avg_pixels8_xy2_neon(uint8_t *, const uint8_t *, int, int);
void ff_avg_pixels16_x2_no_rnd_neon(uint8_t *, const uint8_t *, int, int);
void ff_avg_pixels16_y2_no_rnd_neon(uint8_t *, const uint8_t *, int, int);
void ff_avg_pixels16_xy2_no_rnd_neon(uint8_t *, const uint8_t *, int, int);
void ff_avg_pixels8_x2_no_rnd_neon(uint8_t *, const uint8_t *, int, int);
void ff_avg_pixels8_y2_no_rnd_neon(uint8_t *, const uint8_t *, int, int);
void ff_avg_pixels8_xy2_no_rnd_neon(uint8_t *, const uint8_t *, int, int);
void ff_add_pixels_clamped_neon(const DCTELEM *, uint8_t *, int); void ff_add_pixels_clamped_neon(const DCTELEM *, uint8_t *, int);
void ff_put_pixels_clamped_neon(const DCTELEM *, uint8_t *, int); void ff_put_pixels_clamped_neon(const DCTELEM *, uint8_t *, int);
...@@ -189,37 +201,51 @@ void ff_dsputil_init_neon(DSPContext *c, AVCodecContext *avctx) ...@@ -189,37 +201,51 @@ void ff_dsputil_init_neon(DSPContext *c, AVCodecContext *avctx)
} }
if (!high_bit_depth) { if (!high_bit_depth) {
c->clear_block = ff_clear_block_neon; c->clear_block = ff_clear_block_neon;
c->clear_blocks = ff_clear_blocks_neon; c->clear_blocks = ff_clear_blocks_neon;
c->put_pixels_tab[0][0] = ff_put_pixels16_neon; c->put_pixels_tab[0][0] = ff_put_pixels16_neon;
c->put_pixels_tab[0][1] = ff_put_pixels16_x2_neon; c->put_pixels_tab[0][1] = ff_put_pixels16_x2_neon;
c->put_pixels_tab[0][2] = ff_put_pixels16_y2_neon; c->put_pixels_tab[0][2] = ff_put_pixels16_y2_neon;
c->put_pixels_tab[0][3] = ff_put_pixels16_xy2_neon; c->put_pixels_tab[0][3] = ff_put_pixels16_xy2_neon;
c->put_pixels_tab[1][0] = ff_put_pixels8_neon; c->put_pixels_tab[1][0] = ff_put_pixels8_neon;
c->put_pixels_tab[1][1] = ff_put_pixels8_x2_neon; c->put_pixels_tab[1][1] = ff_put_pixels8_x2_neon;
c->put_pixels_tab[1][2] = ff_put_pixels8_y2_neon; c->put_pixels_tab[1][2] = ff_put_pixels8_y2_neon;
c->put_pixels_tab[1][3] = ff_put_pixels8_xy2_neon; c->put_pixels_tab[1][3] = ff_put_pixels8_xy2_neon;
c->put_no_rnd_pixels_tab[0][0] = ff_put_pixels16_neon; c->put_no_rnd_pixels_tab[0][0] = ff_put_pixels16_neon;
c->put_no_rnd_pixels_tab[0][1] = ff_put_pixels16_x2_no_rnd_neon; c->put_no_rnd_pixels_tab[0][1] = ff_put_pixels16_x2_no_rnd_neon;
c->put_no_rnd_pixels_tab[0][2] = ff_put_pixels16_y2_no_rnd_neon; c->put_no_rnd_pixels_tab[0][2] = ff_put_pixels16_y2_no_rnd_neon;
c->put_no_rnd_pixels_tab[0][3] = ff_put_pixels16_xy2_no_rnd_neon; c->put_no_rnd_pixels_tab[0][3] = ff_put_pixels16_xy2_no_rnd_neon;
c->put_no_rnd_pixels_tab[1][0] = ff_put_pixels8_neon; c->put_no_rnd_pixels_tab[1][0] = ff_put_pixels8_neon;
c->put_no_rnd_pixels_tab[1][1] = ff_put_pixels8_x2_no_rnd_neon; c->put_no_rnd_pixels_tab[1][1] = ff_put_pixels8_x2_no_rnd_neon;
c->put_no_rnd_pixels_tab[1][2] = ff_put_pixels8_y2_no_rnd_neon; c->put_no_rnd_pixels_tab[1][2] = ff_put_pixels8_y2_no_rnd_neon;
c->put_no_rnd_pixels_tab[1][3] = ff_put_pixels8_xy2_no_rnd_neon; c->put_no_rnd_pixels_tab[1][3] = ff_put_pixels8_xy2_no_rnd_neon;
c->avg_pixels_tab[0][0] = ff_avg_pixels16_neon; c->avg_pixels_tab[0][0] = ff_avg_pixels16_neon;
c->avg_pixels_tab[1][0] = ff_avg_pixels8_neon; c->avg_pixels_tab[0][1] = ff_avg_pixels16_x2_neon;
c->avg_pixels_tab[0][2] = ff_avg_pixels16_y2_neon;
c->avg_pixels_tab[0][3] = ff_avg_pixels16_xy2_neon;
c->avg_pixels_tab[1][0] = ff_avg_pixels8_neon;
c->avg_pixels_tab[1][1] = ff_avg_pixels8_x2_neon;
c->avg_pixels_tab[1][2] = ff_avg_pixels8_y2_neon;
c->avg_pixels_tab[1][3] = ff_avg_pixels8_xy2_neon;
c->avg_no_rnd_pixels_tab[0][0] = ff_avg_pixels16_neon;
c->avg_no_rnd_pixels_tab[0][1] = ff_avg_pixels16_x2_no_rnd_neon;
c->avg_no_rnd_pixels_tab[0][2] = ff_avg_pixels16_y2_no_rnd_neon;
c->avg_no_rnd_pixels_tab[0][3] = ff_avg_pixels16_xy2_no_rnd_neon;
c->avg_no_rnd_pixels_tab[1][0] = ff_avg_pixels8_neon;
c->avg_no_rnd_pixels_tab[1][1] = ff_avg_pixels8_x2_no_rnd_neon;
c->avg_no_rnd_pixels_tab[1][2] = ff_avg_pixels8_y2_no_rnd_neon;
c->avg_no_rnd_pixels_tab[1][3] = ff_avg_pixels8_xy2_no_rnd_neon;
} }
c->add_pixels_clamped = ff_add_pixels_clamped_neon; c->add_pixels_clamped = ff_add_pixels_clamped_neon;
c->put_pixels_clamped = ff_put_pixels_clamped_neon; c->put_pixels_clamped = ff_put_pixels_clamped_neon;
c->put_signed_pixels_clamped = ff_put_signed_pixels_clamped_neon; c->put_signed_pixels_clamped = ff_put_signed_pixels_clamped_neon;
if (CONFIG_H264_DECODER) { if (CONFIG_H264_DECODER && !high_bit_depth) {
if (!high_bit_depth) {
c->put_h264_chroma_pixels_tab[0] = ff_put_h264_chroma_mc8_neon; c->put_h264_chroma_pixels_tab[0] = ff_put_h264_chroma_mc8_neon;
c->put_h264_chroma_pixels_tab[1] = ff_put_h264_chroma_mc4_neon; c->put_h264_chroma_pixels_tab[1] = ff_put_h264_chroma_mc4_neon;
c->put_h264_chroma_pixels_tab[2] = ff_put_h264_chroma_mc2_neon; c->put_h264_chroma_pixels_tab[2] = ff_put_h264_chroma_mc2_neon;
...@@ -295,7 +321,6 @@ void ff_dsputil_init_neon(DSPContext *c, AVCodecContext *avctx) ...@@ -295,7 +321,6 @@ void ff_dsputil_init_neon(DSPContext *c, AVCodecContext *avctx)
c->avg_h264_qpel_pixels_tab[1][13] = ff_avg_h264_qpel8_mc13_neon; c->avg_h264_qpel_pixels_tab[1][13] = ff_avg_h264_qpel8_mc13_neon;
c->avg_h264_qpel_pixels_tab[1][14] = ff_avg_h264_qpel8_mc23_neon; c->avg_h264_qpel_pixels_tab[1][14] = ff_avg_h264_qpel8_mc23_neon;
c->avg_h264_qpel_pixels_tab[1][15] = ff_avg_h264_qpel8_mc33_neon; c->avg_h264_qpel_pixels_tab[1][15] = ff_avg_h264_qpel8_mc33_neon;
}
} }
if (CONFIG_VP3_DECODER) { if (CONFIG_VP3_DECODER) {
......
...@@ -40,75 +40,89 @@ function ff_clear_blocks_neon, export=1 ...@@ -40,75 +40,89 @@ function ff_clear_blocks_neon, export=1
bx lr bx lr
endfunc endfunc
.macro pixels16 avg=0 .macro pixels16 rnd=1, avg=0
.if \avg .if \avg
mov ip, r0 mov r12, r0
.endif .endif
1: vld1.64 {d0, d1}, [r1], r2 1: vld1.64 {q0}, [r1], r2
vld1.64 {d2, d3}, [r1], r2 vld1.64 {q1}, [r1], r2
vld1.64 {d4, d5}, [r1], r2 vld1.64 {q2}, [r1], r2
pld [r1, r2, lsl #2] pld [r1, r2, lsl #2]
vld1.64 {d6, d7}, [r1], r2 vld1.64 {q3}, [r1], r2
pld [r1] pld [r1]
pld [r1, r2] pld [r1, r2]
pld [r1, r2, lsl #1] pld [r1, r2, lsl #1]
.if \avg .if \avg
vld1.64 {d16,d17}, [ip,:128], r2 vld1.64 {q8}, [r12,:128], r2
vrhadd.u8 q0, q0, q8 vrhadd.u8 q0, q0, q8
vld1.64 {d18,d19}, [ip,:128], r2 vld1.64 {q9}, [r12,:128], r2
vrhadd.u8 q1, q1, q9 vrhadd.u8 q1, q1, q9
vld1.64 {d20,d21}, [ip,:128], r2 vld1.64 {q10}, [r12,:128], r2
vrhadd.u8 q2, q2, q10 vrhadd.u8 q2, q2, q10
vld1.64 {d22,d23}, [ip,:128], r2 vld1.64 {q11}, [r12,:128], r2
vrhadd.u8 q3, q3, q11 vrhadd.u8 q3, q3, q11
.endif .endif
subs r3, r3, #4 subs r3, r3, #4
vst1.64 {d0, d1}, [r0,:128], r2 vst1.64 {q0}, [r0,:128], r2
vst1.64 {d2, d3}, [r0,:128], r2 vst1.64 {q1}, [r0,:128], r2
vst1.64 {d4, d5}, [r0,:128], r2 vst1.64 {q2}, [r0,:128], r2
vst1.64 {d6, d7}, [r0,:128], r2 vst1.64 {q3}, [r0,:128], r2
bne 1b bne 1b
bx lr bx lr
.endm .endm
.macro pixels16_x2 vhadd=vrhadd.u8 .macro pixels16_x2 rnd=1, avg=0
1: vld1.64 {d0-d2}, [r1], r2 1: vld1.64 {d0-d2}, [r1], r2
vld1.64 {d4-d6}, [r1], r2 vld1.64 {d4-d6}, [r1], r2
pld [r1] pld [r1]
pld [r1, r2] pld [r1, r2]
subs r3, r3, #2 subs r3, r3, #2
vext.8 q1, q0, q1, #1 vext.8 q1, q0, q1, #1
\vhadd q0, q0, q1 avg q0, q0, q1
vext.8 q3, q2, q3, #1 vext.8 q3, q2, q3, #1
\vhadd q2, q2, q3 avg q2, q2, q3
vst1.64 {d0, d1}, [r0,:128], r2 .if \avg
vst1.64 {d4, d5}, [r0,:128], r2 vld1.8 {q1}, [r0,:128], r2
vld1.8 {q3}, [r0,:128]
vrhadd.u8 q0, q0, q1
vrhadd.u8 q2, q2, q3
sub r0, r0, r2
.endif
vst1.64 {q0}, [r0,:128], r2
vst1.64 {q2}, [r0,:128], r2
bne 1b bne 1b
bx lr bx lr
.endm .endm
.macro pixels16_y2 vhadd=vrhadd.u8 .macro pixels16_y2 rnd=1, avg=0
vld1.64 {d0, d1}, [r1], r2 vld1.64 {q0}, [r1], r2
vld1.64 {d2, d3}, [r1], r2 vld1.64 {q1}, [r1], r2
1: subs r3, r3, #2 1: subs r3, r3, #2
\vhadd q2, q0, q1 avg q2, q0, q1
vld1.64 {d0, d1}, [r1], r2 vld1.64 {q0}, [r1], r2
\vhadd q3, q0, q1 avg q3, q0, q1
vld1.64 {d2, d3}, [r1], r2 vld1.64 {q1}, [r1], r2
pld [r1] pld [r1]
pld [r1, r2] pld [r1, r2]
vst1.64 {d4, d5}, [r0,:128], r2 .if \avg
vst1.64 {d6, d7}, [r0,:128], r2 vld1.8 {q8}, [r0,:128], r2
vld1.8 {q9}, [r0,:128]
vrhadd.u8 q2, q2, q8
vrhadd.u8 q3, q3, q9
sub r0, r0, r2
.endif
vst1.64 {q2}, [r0,:128], r2
vst1.64 {q3}, [r0,:128], r2
bne 1b bne 1b
bx lr bx lr
.endm .endm
.macro pixels16_xy2 vshrn=vrshrn.u16 no_rnd=0 .macro pixels16_xy2 rnd=1, avg=0
vld1.64 {d0-d2}, [r1], r2 vld1.64 {d0-d2}, [r1], r2
vld1.64 {d4-d6}, [r1], r2 vld1.64 {d4-d6}, [r1], r2
.if \no_rnd .ifeq \rnd
vmov.i16 q13, #1 vmov.i16 q13, #1
.endif .endif
pld [r1] pld [r1]
pld [r1, r2] pld [r1, r2]
vext.8 q1, q0, q1, #1 vext.8 q1, q0, q1, #1
...@@ -118,109 +132,129 @@ endfunc ...@@ -118,109 +132,129 @@ endfunc
vaddl.u8 q9, d4, d6 vaddl.u8 q9, d4, d6
vaddl.u8 q11, d5, d7 vaddl.u8 q11, d5, d7
1: subs r3, r3, #2 1: subs r3, r3, #2
vld1.64 {d0-d2}, [r1], r2 vld1.64 {d0-d2}, [r1], r2
vadd.u16 q12, q8, q9 vadd.u16 q12, q8, q9
pld [r1] pld [r1]
.if \no_rnd .ifeq \rnd
vadd.u16 q12, q12, q13 vadd.u16 q12, q12, q13
.endif .endif
vext.8 q15, q0, q1, #1 vext.8 q15, q0, q1, #1
vadd.u16 q1 , q10, q11 vadd.u16 q1 , q10, q11
\vshrn d28, q12, #2 shrn d28, q12, #2
.if \no_rnd .ifeq \rnd
vadd.u16 q1, q1, q13 vadd.u16 q1, q1, q13
.endif .endif
\vshrn d29, q1, #2 shrn d29, q1, #2
.if \avg
vld1.8 {q8}, [r0,:128]
vrhadd.u8 q14, q14, q8
.endif
vaddl.u8 q8, d0, d30 vaddl.u8 q8, d0, d30
vld1.64 {d2-d4}, [r1], r2 vld1.64 {d2-d4}, [r1], r2
vaddl.u8 q10, d1, d31 vaddl.u8 q10, d1, d31
vst1.64 {d28,d29}, [r0,:128], r2 vst1.64 {q14}, [r0,:128], r2
vadd.u16 q12, q8, q9 vadd.u16 q12, q8, q9
pld [r1, r2] pld [r1, r2]
.if \no_rnd .ifeq \rnd
vadd.u16 q12, q12, q13 vadd.u16 q12, q12, q13
.endif .endif
vext.8 q2, q1, q2, #1 vext.8 q2, q1, q2, #1
vadd.u16 q0, q10, q11 vadd.u16 q0, q10, q11
\vshrn d30, q12, #2 shrn d30, q12, #2
.if \no_rnd .ifeq \rnd
vadd.u16 q0, q0, q13 vadd.u16 q0, q0, q13
.endif .endif
\vshrn d31, q0, #2 shrn d31, q0, #2
.if \avg
vld1.8 {q9}, [r0,:128]
vrhadd.u8 q15, q15, q9
.endif
vaddl.u8 q9, d2, d4 vaddl.u8 q9, d2, d4
vaddl.u8 q11, d3, d5 vaddl.u8 q11, d3, d5
vst1.64 {d30,d31}, [r0,:128], r2 vst1.64 {q15}, [r0,:128], r2
bgt 1b bgt 1b
bx lr bx lr
.endm .endm
.macro pixels8 avg=0 .macro pixels8 rnd=1, avg=0
1: vld1.64 {d0}, [r1], r2 1: vld1.64 {d0}, [r1], r2
vld1.64 {d1}, [r1], r2 vld1.64 {d1}, [r1], r2
vld1.64 {d2}, [r1], r2 vld1.64 {d2}, [r1], r2
pld [r1, r2, lsl #2] pld [r1, r2, lsl #2]
vld1.64 {d3}, [r1], r2 vld1.64 {d3}, [r1], r2
pld [r1] pld [r1]
pld [r1, r2] pld [r1, r2]
pld [r1, r2, lsl #1] pld [r1, r2, lsl #1]
.if \avg .if \avg
vld1.64 {d4}, [r0,:64], r2 vld1.64 {d4}, [r0,:64], r2
vrhadd.u8 d0, d0, d4 vrhadd.u8 d0, d0, d4
vld1.64 {d5}, [r0,:64], r2 vld1.64 {d5}, [r0,:64], r2
vrhadd.u8 d1, d1, d5 vrhadd.u8 d1, d1, d5
vld1.64 {d6}, [r0,:64], r2 vld1.64 {d6}, [r0,:64], r2
vrhadd.u8 d2, d2, d6 vrhadd.u8 d2, d2, d6
vld1.64 {d7}, [r0,:64], r2 vld1.64 {d7}, [r0,:64], r2
vrhadd.u8 d3, d3, d7 vrhadd.u8 d3, d3, d7
sub r0, r0, r2, lsl #2 sub r0, r0, r2, lsl #2
.endif .endif
subs r3, r3, #4 subs r3, r3, #4
vst1.64 {d0}, [r0,:64], r2 vst1.64 {d0}, [r0,:64], r2
vst1.64 {d1}, [r0,:64], r2 vst1.64 {d1}, [r0,:64], r2
vst1.64 {d2}, [r0,:64], r2 vst1.64 {d2}, [r0,:64], r2
vst1.64 {d3}, [r0,:64], r2 vst1.64 {d3}, [r0,:64], r2
bne 1b bne 1b
bx lr bx lr
.endm .endm
.macro pixels8_x2 vhadd=vrhadd.u8 .macro pixels8_x2 rnd=1, avg=0
1: vld1.64 {d0, d1}, [r1], r2 1: vld1.64 {q0}, [r1], r2
vext.8 d1, d0, d1, #1 vext.8 d1, d0, d1, #1
vld1.64 {d2, d3}, [r1], r2 vld1.64 {q1}, [r1], r2
vext.8 d3, d2, d3, #1 vext.8 d3, d2, d3, #1
pld [r1] pld [r1]
pld [r1, r2] pld [r1, r2]
subs r3, r3, #2 subs r3, r3, #2
vswp d1, d2 vswp d1, d2
\vhadd q0, q0, q1 avg q0, q0, q1
vst1.64 {d0}, [r0,:64], r2 .if \avg
vst1.64 {d1}, [r0,:64], r2 vld1.8 {d4}, [r0,:64], r2
vld1.8 {d5}, [r0,:64]
vrhadd.u8 q0, q0, q2
sub r0, r0, r2
.endif
vst1.64 {d0}, [r0,:64], r2
vst1.64 {d1}, [r0,:64], r2
bne 1b bne 1b
bx lr bx lr
.endm .endm
.macro pixels8_y2 vhadd=vrhadd.u8 .macro pixels8_y2 rnd=1, avg=0
vld1.64 {d0}, [r1], r2 vld1.64 {d0}, [r1], r2
vld1.64 {d1}, [r1], r2 vld1.64 {d1}, [r1], r2
1: subs r3, r3, #2 1: subs r3, r3, #2
\vhadd d4, d0, d1 avg d4, d0, d1
vld1.64 {d0}, [r1], r2 vld1.64 {d0}, [r1], r2
\vhadd d5, d0, d1 avg d5, d0, d1
vld1.64 {d1}, [r1], r2 vld1.64 {d1}, [r1], r2
pld [r1] pld [r1]
pld [r1, r2] pld [r1, r2]
vst1.64 {d4}, [r0,:64], r2 .if \avg
vst1.64 {d5}, [r0,:64], r2 vld1.8 {d2}, [r0,:64], r2
vld1.8 {d3}, [r0,:64]
vrhadd.u8 q2, q2, q1
sub r0, r0, r2
.endif
vst1.64 {d4}, [r0,:64], r2
vst1.64 {d5}, [r0,:64], r2
bne 1b bne 1b
bx lr bx lr
.endm .endm
.macro pixels8_xy2 vshrn=vrshrn.u16 no_rnd=0 .macro pixels8_xy2 rnd=1, avg=0
vld1.64 {d0, d1}, [r1], r2 vld1.64 {q0}, [r1], r2
vld1.64 {d2, d3}, [r1], r2 vld1.64 {q1}, [r1], r2
.if \no_rnd .ifeq \rnd
vmov.i16 q11, #1 vmov.i16 q11, #1
.endif .endif
pld [r1] pld [r1]
pld [r1, r2] pld [r1, r2]
vext.8 d4, d0, d1, #1 vext.8 d4, d0, d1, #1
...@@ -228,70 +262,101 @@ endfunc ...@@ -228,70 +262,101 @@ endfunc
vaddl.u8 q8, d0, d4 vaddl.u8 q8, d0, d4
vaddl.u8 q9, d2, d6 vaddl.u8 q9, d2, d6
1: subs r3, r3, #2 1: subs r3, r3, #2
vld1.64 {d0, d1}, [r1], r2 vld1.64 {q0}, [r1], r2
pld [r1] pld [r1]
vadd.u16 q10, q8, q9 vadd.u16 q10, q8, q9
vext.8 d4, d0, d1, #1 vext.8 d4, d0, d1, #1
.if \no_rnd .ifeq \rnd
vadd.u16 q10, q10, q11 vadd.u16 q10, q10, q11
.endif .endif
vaddl.u8 q8, d0, d4 vaddl.u8 q8, d0, d4
\vshrn d5, q10, #2 shrn d5, q10, #2
vld1.64 {d2, d3}, [r1], r2 vld1.64 {q1}, [r1], r2
vadd.u16 q10, q8, q9 vadd.u16 q10, q8, q9
pld [r1, r2] pld [r1, r2]
.if \no_rnd .if \avg
vld1.8 {d7}, [r0,:64]
vrhadd.u8 d5, d5, d7
.endif
.ifeq \rnd
vadd.u16 q10, q10, q11 vadd.u16 q10, q10, q11
.endif .endif
vst1.64 {d5}, [r0,:64], r2 vst1.64 {d5}, [r0,:64], r2
\vshrn d7, q10, #2 shrn d7, q10, #2
.if \avg
vld1.8 {d5}, [r0,:64]
vrhadd.u8 d7, d7, d5
.endif
vext.8 d6, d2, d3, #1 vext.8 d6, d2, d3, #1
vaddl.u8 q9, d2, d6 vaddl.u8 q9, d2, d6
vst1.64 {d7}, [r0,:64], r2 vst1.64 {d7}, [r0,:64], r2
bgt 1b bgt 1b
bx lr bx lr
.endm .endm
.macro pixfunc pfx name suf rnd_op args:vararg .macro pixfunc pfx, name, suf, rnd=1, avg=0
.if \rnd
.macro avg rd, rn, rm
vrhadd.u8 \rd, \rn, \rm
.endm
.macro shrn rd, rn, rm
vrshrn.u16 \rd, \rn, \rm
.endm
.else
.macro avg rd, rn, rm
vhadd.u8 \rd, \rn, \rm
.endm
.macro shrn rd, rn, rm
vshrn.u16 \rd, \rn, \rm
.endm
.endif
function ff_\pfx\name\suf\()_neon, export=1 function ff_\pfx\name\suf\()_neon, export=1
\name \rnd_op \args \name \rnd, \avg
endfunc endfunc
.endm .purgem avg
.purgem shrn
.endm
.macro pixfunc2 pfx name args:vararg .macro pixfunc2 pfx, name, avg=0
pixfunc \pfx \name pixfunc \pfx, \name, rnd=1, avg=\avg
pixfunc \pfx \name \args pixfunc \pfx, \name, _no_rnd, rnd=0, avg=\avg
.endm .endm
function ff_put_h264_qpel16_mc00_neon, export=1 function ff_put_h264_qpel16_mc00_neon, export=1
mov r3, #16 mov r3, #16
endfunc endfunc
pixfunc put_ pixels16 pixfunc put_, pixels16, avg=0
pixfunc2 put_ pixels16_x2, _no_rnd, vhadd.u8 pixfunc2 put_, pixels16_x2, avg=0
pixfunc2 put_ pixels16_y2, _no_rnd, vhadd.u8 pixfunc2 put_, pixels16_y2, avg=0
pixfunc2 put_ pixels16_xy2, _no_rnd, vshrn.u16, 1 pixfunc2 put_, pixels16_xy2, avg=0
function ff_avg_h264_qpel16_mc00_neon, export=1 function ff_avg_h264_qpel16_mc00_neon, export=1
mov r3, #16 mov r3, #16
endfunc endfunc
pixfunc avg_ pixels16,, 1 pixfunc avg_, pixels16, avg=1
pixfunc2 avg_, pixels16_x2, avg=1
pixfunc2 avg_, pixels16_y2, avg=1
pixfunc2 avg_, pixels16_xy2, avg=1
function ff_put_h264_qpel8_mc00_neon, export=1 function ff_put_h264_qpel8_mc00_neon, export=1
mov r3, #8 mov r3, #8
endfunc endfunc
pixfunc put_ pixels8 pixfunc put_, pixels8, avg=0
pixfunc2 put_ pixels8_x2, _no_rnd, vhadd.u8 pixfunc2 put_, pixels8_x2, avg=0
pixfunc2 put_ pixels8_y2, _no_rnd, vhadd.u8 pixfunc2 put_, pixels8_y2, avg=0
pixfunc2 put_ pixels8_xy2, _no_rnd, vshrn.u16, 1 pixfunc2 put_, pixels8_xy2, avg=0
function ff_avg_h264_qpel8_mc00_neon, export=1 function ff_avg_h264_qpel8_mc00_neon, export=1
mov r3, #8 mov r3, #8
endfunc endfunc
pixfunc avg_ pixels8,, 1 pixfunc avg_, pixels8, avg=1
pixfunc2 avg_, pixels8_x2, avg=1
pixfunc2 avg_, pixels8_y2, avg=1
pixfunc2 avg_, pixels8_xy2, avg=1
function ff_put_pixels_clamped_neon, export=1 function ff_put_pixels_clamped_neon, export=1
vld1.64 {d16-d19}, [r0,:128]! vld1.64 {d16-d19}, [r0,:128]!
......
...@@ -1471,7 +1471,7 @@ static void decode_postinit(H264Context *h, int setup_finished){ ...@@ -1471,7 +1471,7 @@ static void decode_postinit(H264Context *h, int setup_finished){
if( s->avctx->strict_std_compliance >= FF_COMPLIANCE_STRICT if( s->avctx->strict_std_compliance >= FF_COMPLIANCE_STRICT
&& !h->sps.bitstream_restriction_flag){ && !h->sps.bitstream_restriction_flag){
s->avctx->has_b_frames= MAX_DELAYED_PIC_COUNT; s->avctx->has_b_frames = MAX_DELAYED_PIC_COUNT - 1;
s->low_delay= 0; s->low_delay= 0;
} }
......
...@@ -1112,7 +1112,7 @@ static int rv34_decode_macroblock(RV34DecContext *r, int8_t *intra_types) ...@@ -1112,7 +1112,7 @@ static int rv34_decode_macroblock(RV34DecContext *r, int8_t *intra_types)
GetBitContext *gb = &s->gb; GetBitContext *gb = &s->gb;
int cbp, cbp2; int cbp, cbp2;
int i, blknum, blkoff; int i, blknum, blkoff;
DCTELEM block16[64]; LOCAL_ALIGNED_16(DCTELEM, block16, [64]);
int luma_dc_quant; int luma_dc_quant;
int dist; int dist;
int mb_pos = s->mb_x + s->mb_y * s->mb_stride; int mb_pos = s->mb_x + s->mb_y * s->mb_stride;
...@@ -1147,7 +1147,7 @@ static int rv34_decode_macroblock(RV34DecContext *r, int8_t *intra_types) ...@@ -1147,7 +1147,7 @@ static int rv34_decode_macroblock(RV34DecContext *r, int8_t *intra_types)
luma_dc_quant = r->block_type == RV34_MB_P_MIX16x16 ? r->luma_dc_quant_p[s->qscale] : r->luma_dc_quant_i[s->qscale]; luma_dc_quant = r->block_type == RV34_MB_P_MIX16x16 ? r->luma_dc_quant_p[s->qscale] : r->luma_dc_quant_i[s->qscale];
if(r->is16){ if(r->is16){
memset(block16, 0, sizeof(block16)); memset(block16, 0, 64 * sizeof(*block16));
rv34_decode_block(block16, gb, r->cur_vlcs, 3, 0); rv34_decode_block(block16, gb, r->cur_vlcs, 3, 0);
rv34_dequant4x4_16x16(block16, rv34_qscale_tab[luma_dc_quant],rv34_qscale_tab[s->qscale]); rv34_dequant4x4_16x16(block16, rv34_qscale_tab[luma_dc_quant],rv34_qscale_tab[s->qscale]);
r->rdsp.rv34_inv_transform_tab[1](block16); r->rdsp.rv34_inv_transform_tab[1](block16);
......
...@@ -174,19 +174,25 @@ fail: ...@@ -174,19 +174,25 @@ fail:
return ret; return ret;
} }
static int applehttp_close(URLContext *h)
{
AppleHTTPContext *s = h->priv_data;
free_segment_list(s);
free_variant_list(s);
ffurl_close(s->seg_hd);
return 0;
}
static int applehttp_open(URLContext *h, const char *uri, int flags) static int applehttp_open(URLContext *h, const char *uri, int flags)
{ {
AppleHTTPContext *s; AppleHTTPContext *s = h->priv_data;
int ret, i; int ret, i;
const char *nested_url; const char *nested_url;
if (flags & AVIO_FLAG_WRITE) if (flags & AVIO_FLAG_WRITE)
return AVERROR(ENOSYS); return AVERROR(ENOSYS);
s = av_mallocz(sizeof(AppleHTTPContext));
if (!s)
return AVERROR(ENOMEM);
h->priv_data = s;
h->is_streamed = 1; h->is_streamed = 1;
if (av_strstart(uri, "applehttp+", &nested_url)) { if (av_strstart(uri, "applehttp+", &nested_url)) {
...@@ -229,7 +235,7 @@ static int applehttp_open(URLContext *h, const char *uri, int flags) ...@@ -229,7 +235,7 @@ static int applehttp_open(URLContext *h, const char *uri, int flags)
return 0; return 0;
fail: fail:
av_free(s); applehttp_close(h);
return ret; return ret;
} }
...@@ -287,21 +293,11 @@ retry: ...@@ -287,21 +293,11 @@ retry:
goto start; goto start;
} }
static int applehttp_close(URLContext *h)
{
AppleHTTPContext *s = h->priv_data;
free_segment_list(s);
free_variant_list(s);
ffurl_close(s->seg_hd);
av_free(s);
return 0;
}
URLProtocol ff_applehttp_protocol = { URLProtocol ff_applehttp_protocol = {
.name = "applehttp", .name = "applehttp",
.url_open = applehttp_open, .url_open = applehttp_open,
.url_read = applehttp_read, .url_read = applehttp_read,
.url_close = applehttp_close, .url_close = applehttp_close,
.flags = URL_PROTOCOL_FLAG_NESTED_SCHEME, .flags = URL_PROTOCOL_FLAG_NESTED_SCHEME,
.priv_data_size = sizeof(AppleHTTPContext),
}; };
...@@ -53,13 +53,7 @@ static int cache_open(URLContext *h, const char *arg, int flags) ...@@ -53,13 +53,7 @@ static int cache_open(URLContext *h, const char *arg, int flags)
{ {
int access; int access;
const char *buffername; const char *buffername;
Context *c; Context *c= h->priv_data;
c = av_mallocz(sizeof(Context));
if (!c) {
return AVERROR(ENOMEM);
}
h->priv_data = c;
av_strstart(arg, "cache:", &arg); av_strstart(arg, "cache:", &arg);
...@@ -130,8 +124,6 @@ static int cache_close(URLContext *h) ...@@ -130,8 +124,6 @@ static int cache_close(URLContext *h)
close(c->fd); close(c->fd);
ffurl_close(c->inner); ffurl_close(c->inner);
av_freep(&h->priv_data);
return 0; return 0;
} }
...@@ -141,4 +133,5 @@ URLProtocol ff_cache_protocol = { ...@@ -141,4 +133,5 @@ URLProtocol ff_cache_protocol = {
.url_read = cache_read, .url_read = cache_read,
.url_seek = cache_seek, .url_seek = cache_seek,
.url_close = cache_close, .url_close = cache_close,
.priv_data_size = sizeof(Context),
}; };
...@@ -50,7 +50,6 @@ static av_cold int concat_close(URLContext *h) ...@@ -50,7 +50,6 @@ static av_cold int concat_close(URLContext *h)
err |= ffurl_close(nodes[i].uc); err |= ffurl_close(nodes[i].uc);
av_freep(&data->nodes); av_freep(&data->nodes);
av_freep(&h->priv_data);
return err < 0 ? -1 : 0; return err < 0 ? -1 : 0;
} }
...@@ -62,16 +61,11 @@ static av_cold int concat_open(URLContext *h, const char *uri, int flags) ...@@ -62,16 +61,11 @@ static av_cold int concat_open(URLContext *h, const char *uri, int flags)
int64_t size; int64_t size;
size_t len, i; size_t len, i;
URLContext *uc; URLContext *uc;
struct concat_data *data; struct concat_data *data = h->priv_data;
struct concat_nodes *nodes; struct concat_nodes *nodes;
av_strstart(uri, "concat:", &uri); av_strstart(uri, "concat:", &uri);
/* creating data */
if (!(data = av_mallocz(sizeof(*data))))
return AVERROR(ENOMEM);
h->priv_data = data;
for (i = 0, len = 1; uri[i]; i++) for (i = 0, len = 1; uri[i]; i++)
if (uri[i] == *AV_CAT_SEPARATOR) if (uri[i] == *AV_CAT_SEPARATOR)
/* integer overflow */ /* integer overflow */
...@@ -81,7 +75,6 @@ static av_cold int concat_open(URLContext *h, const char *uri, int flags) ...@@ -81,7 +75,6 @@ static av_cold int concat_open(URLContext *h, const char *uri, int flags)
} }
if (!(nodes = av_malloc(sizeof(*nodes) * len))) { if (!(nodes = av_malloc(sizeof(*nodes) * len))) {
av_freep(&h->priv_data);
return AVERROR(ENOMEM); return AVERROR(ENOMEM);
} else } else
data->nodes = nodes; data->nodes = nodes;
...@@ -191,9 +184,10 @@ static int64_t concat_seek(URLContext *h, int64_t pos, int whence) ...@@ -191,9 +184,10 @@ static int64_t concat_seek(URLContext *h, int64_t pos, int whence)
} }
URLProtocol ff_concat_protocol = { URLProtocol ff_concat_protocol = {
.name = "concat", .name = "concat",
.url_open = concat_open, .url_open = concat_open,
.url_read = concat_read, .url_read = concat_read,
.url_seek = concat_seek, .url_seek = concat_seek,
.url_close = concat_close, .url_close = concat_close,
.priv_data_size = sizeof(struct concat_data),
}; };
...@@ -72,24 +72,17 @@ static int gopher_close(URLContext *h) ...@@ -72,24 +72,17 @@ static int gopher_close(URLContext *h)
ffurl_close(s->hd); ffurl_close(s->hd);
s->hd = NULL; s->hd = NULL;
} }
av_freep(&h->priv_data);
return 0; return 0;
} }
static int gopher_open(URLContext *h, const char *uri, int flags) static int gopher_open(URLContext *h, const char *uri, int flags)
{ {
GopherContext *s; GopherContext *s = h->priv_data;
char hostname[1024], auth[1024], path[1024], buf[1024]; char hostname[1024], auth[1024], path[1024], buf[1024];
int port, err; int port, err;
h->is_streamed = 1; h->is_streamed = 1;
s = av_malloc(sizeof(GopherContext));
if (!s) {
return AVERROR(ENOMEM);
}
h->priv_data = s;
/* needed in any case to build the host string */ /* needed in any case to build the host string */
av_url_split(NULL, 0, auth, sizeof(auth), hostname, sizeof(hostname), &port, av_url_split(NULL, 0, auth, sizeof(auth), hostname, sizeof(hostname), &port,
path, sizeof(path), uri); path, sizeof(path), uri);
...@@ -122,9 +115,10 @@ static int gopher_read(URLContext *h, uint8_t *buf, int size) ...@@ -122,9 +115,10 @@ static int gopher_read(URLContext *h, uint8_t *buf, int size)
URLProtocol ff_gopher_protocol = { URLProtocol ff_gopher_protocol = {
.name = "gopher", .name = "gopher",
.url_open = gopher_open, .url_open = gopher_open,
.url_read = gopher_read, .url_read = gopher_read,
.url_write = gopher_write, .url_write = gopher_write,
.url_close = gopher_close, .url_close = gopher_close,
.priv_data_size = sizeof(GopherContext),
}; };
...@@ -93,7 +93,7 @@ static int http_open_cnx(URLContext *h) ...@@ -93,7 +93,7 @@ static int http_open_cnx(URLContext *h)
{ {
const char *path, *proxy_path, *lower_proto = "tcp", *local_path; const char *path, *proxy_path, *lower_proto = "tcp", *local_path;
char hostname[1024], hoststr[1024], proto[10]; char hostname[1024], hoststr[1024], proto[10];
char auth[1024], proxyauth[1024]; char auth[1024], proxyauth[1024] = "";
char path1[1024]; char path1[1024];
char buf[1024], urlbuf[1024]; char buf[1024], urlbuf[1024];
int port, use_proxy, err, location_changed = 0, redirects = 0; int port, use_proxy, err, location_changed = 0, redirects = 0;
......
...@@ -52,7 +52,6 @@ static int rtmp_close(URLContext *s) ...@@ -52,7 +52,6 @@ static int rtmp_close(URLContext *s)
RTMP *r = s->priv_data; RTMP *r = s->priv_data;
RTMP_Close(r); RTMP_Close(r);
av_free(r);
return 0; return 0;
} }
...@@ -70,13 +69,9 @@ static int rtmp_close(URLContext *s) ...@@ -70,13 +69,9 @@ static int rtmp_close(URLContext *s)
*/ */
static int rtmp_open(URLContext *s, const char *uri, int flags) static int rtmp_open(URLContext *s, const char *uri, int flags)
{ {
RTMP *r; RTMP *r = s->priv_data;
int rc; int rc;
r = av_mallocz(sizeof(RTMP));
if (!r)
return AVERROR(ENOMEM);
switch (av_log_get_level()) { switch (av_log_get_level()) {
default: default:
case AV_LOG_FATAL: rc = RTMP_LOGCRIT; break; case AV_LOG_FATAL: rc = RTMP_LOGCRIT; break;
...@@ -103,11 +98,9 @@ static int rtmp_open(URLContext *s, const char *uri, int flags) ...@@ -103,11 +98,9 @@ static int rtmp_open(URLContext *s, const char *uri, int flags)
goto fail; goto fail;
} }
s->priv_data = r;
s->is_streamed = 1; s->is_streamed = 1;
return 0; return 0;
fail: fail:
av_free(r);
return rc; return rc;
} }
...@@ -167,7 +160,8 @@ URLProtocol ff_rtmp_protocol = { ...@@ -167,7 +160,8 @@ URLProtocol ff_rtmp_protocol = {
.url_close = rtmp_close, .url_close = rtmp_close,
.url_read_pause = rtmp_read_pause, .url_read_pause = rtmp_read_pause,
.url_read_seek = rtmp_read_seek, .url_read_seek = rtmp_read_seek,
.url_get_file_handle = rtmp_get_file_handle .url_get_file_handle = rtmp_get_file_handle,
.priv_data_size = sizeof(RTMP),
}; };
URLProtocol ff_rtmpt_protocol = { URLProtocol ff_rtmpt_protocol = {
...@@ -178,7 +172,8 @@ URLProtocol ff_rtmpt_protocol = { ...@@ -178,7 +172,8 @@ URLProtocol ff_rtmpt_protocol = {
.url_close = rtmp_close, .url_close = rtmp_close,
.url_read_pause = rtmp_read_pause, .url_read_pause = rtmp_read_pause,
.url_read_seek = rtmp_read_seek, .url_read_seek = rtmp_read_seek,
.url_get_file_handle = rtmp_get_file_handle .url_get_file_handle = rtmp_get_file_handle,
.priv_data_size = sizeof(RTMP),
}; };
URLProtocol ff_rtmpe_protocol = { URLProtocol ff_rtmpe_protocol = {
...@@ -189,7 +184,8 @@ URLProtocol ff_rtmpe_protocol = { ...@@ -189,7 +184,8 @@ URLProtocol ff_rtmpe_protocol = {
.url_close = rtmp_close, .url_close = rtmp_close,
.url_read_pause = rtmp_read_pause, .url_read_pause = rtmp_read_pause,
.url_read_seek = rtmp_read_seek, .url_read_seek = rtmp_read_seek,
.url_get_file_handle = rtmp_get_file_handle .url_get_file_handle = rtmp_get_file_handle,
.priv_data_size = sizeof(RTMP),
}; };
URLProtocol ff_rtmpte_protocol = { URLProtocol ff_rtmpte_protocol = {
...@@ -200,7 +196,8 @@ URLProtocol ff_rtmpte_protocol = { ...@@ -200,7 +196,8 @@ URLProtocol ff_rtmpte_protocol = {
.url_close = rtmp_close, .url_close = rtmp_close,
.url_read_pause = rtmp_read_pause, .url_read_pause = rtmp_read_pause,
.url_read_seek = rtmp_read_seek, .url_read_seek = rtmp_read_seek,
.url_get_file_handle = rtmp_get_file_handle .url_get_file_handle = rtmp_get_file_handle,
.priv_data_size = sizeof(RTMP),
}; };
URLProtocol ff_rtmps_protocol = { URLProtocol ff_rtmps_protocol = {
...@@ -211,5 +208,6 @@ URLProtocol ff_rtmps_protocol = { ...@@ -211,5 +208,6 @@ URLProtocol ff_rtmps_protocol = {
.url_close = rtmp_close, .url_close = rtmp_close,
.url_read_pause = rtmp_read_pause, .url_read_pause = rtmp_read_pause,
.url_read_seek = rtmp_read_seek, .url_read_seek = rtmp_read_seek,
.url_get_file_handle = rtmp_get_file_handle .url_get_file_handle = rtmp_get_file_handle,
.priv_data_size = sizeof(RTMP),
}; };
...@@ -79,16 +79,11 @@ static int md5_close(URLContext *h) ...@@ -79,16 +79,11 @@ static int md5_close(URLContext *h)
return err; return err;
} }
static int md5_get_handle(URLContext *h)
{
return (intptr_t)h->priv_data;
}
URLProtocol ff_md5_protocol = { URLProtocol ff_md5_protocol = {
.name = "md5", .name = "md5",
.url_open = md5_open, .url_open = md5_open,
.url_write = md5_write, .url_write = md5_write,
.url_close = md5_close, .url_close = md5_close,
.url_get_file_handle = md5_get_handle,
.priv_data_size = PRIV_SIZE, .priv_data_size = PRIV_SIZE,
}; };
...@@ -69,7 +69,6 @@ static int mmsh_close(URLContext *h) ...@@ -69,7 +69,6 @@ static int mmsh_close(URLContext *h)
ffurl_close(mms->mms_hd); ffurl_close(mms->mms_hd);
av_free(mms->streams); av_free(mms->streams);
av_free(mms->asf_header); av_free(mms->asf_header);
av_freep(&h->priv_data);
return 0; return 0;
} }
...@@ -218,12 +217,9 @@ static int mmsh_open_internal(URLContext *h, const char *uri, int flags, int tim ...@@ -218,12 +217,9 @@ static int mmsh_open_internal(URLContext *h, const char *uri, int flags, int tim
char httpname[256], path[256], host[128]; char httpname[256], path[256], host[128];
char *stream_selection = NULL; char *stream_selection = NULL;
char headers[1024]; char headers[1024];
MMSHContext *mmsh; MMSHContext *mmsh = h->priv_data;
MMSContext *mms; MMSContext *mms;
mmsh = h->priv_data = av_mallocz(sizeof(MMSHContext));
if (!h->priv_data)
return AVERROR(ENOMEM);
mmsh->request_seq = h->is_streamed = 1; mmsh->request_seq = h->is_streamed = 1;
mms = &mmsh->mms; mms = &mmsh->mms;
av_strlcpy(mmsh->location, uri, sizeof(mmsh->location)); av_strlcpy(mmsh->location, uri, sizeof(mmsh->location));
...@@ -263,9 +259,9 @@ static int mmsh_open_internal(URLContext *h, const char *uri, int flags, int tim ...@@ -263,9 +259,9 @@ static int mmsh_open_internal(URLContext *h, const char *uri, int flags, int tim
// close the socket and then reopen it for sending the second play request. // close the socket and then reopen it for sending the second play request.
ffurl_close(mms->mms_hd); ffurl_close(mms->mms_hd);
memset(headers, 0, sizeof(headers)); memset(headers, 0, sizeof(headers));
if (ffurl_alloc(&mms->mms_hd, httpname, AVIO_FLAG_READ, if ((err = ffurl_alloc(&mms->mms_hd, httpname, AVIO_FLAG_READ,
&h->interrupt_callback) < 0) { &h->interrupt_callback)) < 0) {
return AVERROR(EIO); goto fail;
} }
stream_selection = av_mallocz(mms->stream_num * 19 + 1); stream_selection = av_mallocz(mms->stream_num * 19 + 1);
if (!stream_selection) if (!stream_selection)
...@@ -403,10 +399,11 @@ static int64_t mmsh_seek(URLContext *h, int64_t pos, int whence) ...@@ -403,10 +399,11 @@ static int64_t mmsh_seek(URLContext *h, int64_t pos, int whence)
} }
URLProtocol ff_mmsh_protocol = { URLProtocol ff_mmsh_protocol = {
.name = "mmsh", .name = "mmsh",
.url_open = mmsh_open, .url_open = mmsh_open,
.url_read = mmsh_read, .url_read = mmsh_read,
.url_seek = mmsh_seek, .url_seek = mmsh_seek,
.url_close = mmsh_close, .url_close = mmsh_close,
.url_read_seek = mmsh_read_seek, .url_read_seek = mmsh_read_seek,
.priv_data_size = sizeof(MMSHContext),
}; };
...@@ -470,7 +470,6 @@ static int mms_close(URLContext *h) ...@@ -470,7 +470,6 @@ static int mms_close(URLContext *h)
/* free all separately allocated pointers in mms */ /* free all separately allocated pointers in mms */
av_free(mms->streams); av_free(mms->streams);
av_free(mms->asf_header); av_free(mms->asf_header);
av_freep(&h->priv_data);
return 0; return 0;
} }
...@@ -502,15 +501,12 @@ static void clear_stream_buffers(MMSContext *mms) ...@@ -502,15 +501,12 @@ static void clear_stream_buffers(MMSContext *mms)
static int mms_open(URLContext *h, const char *uri, int flags) static int mms_open(URLContext *h, const char *uri, int flags)
{ {
MMSTContext *mmst; MMSTContext *mmst = h->priv_data;
MMSContext *mms; MMSContext *mms;
int port, err; int port, err;
char tcpname[256]; char tcpname[256];
h->is_streamed = 1; h->is_streamed = 1;
mmst = h->priv_data = av_mallocz(sizeof(MMSTContext));
if (!h->priv_data)
return AVERROR(ENOMEM);
mms = &mmst->mms; mms = &mmst->mms;
// only for MMS over TCP, so set proto = NULL // only for MMS over TCP, so set proto = NULL
...@@ -624,8 +620,9 @@ static int mms_read(URLContext *h, uint8_t *buf, int size) ...@@ -624,8 +620,9 @@ static int mms_read(URLContext *h, uint8_t *buf, int size)
} }
URLProtocol ff_mmst_protocol = { URLProtocol ff_mmst_protocol = {
.name = "mmst", .name = "mmst",
.url_open = mms_open, .url_open = mms_open,
.url_read = mms_read, .url_read = mms_read,
.url_close = mms_close, .url_close = mms_close,
.priv_data_size = sizeof(MMSTContext),
}; };
...@@ -38,7 +38,8 @@ static int pmp_probe(AVProbeData *p) { ...@@ -38,7 +38,8 @@ static int pmp_probe(AVProbeData *p) {
return 0; return 0;
} }
static int pmp_header(AVFormatContext *s, AVFormatParameters *ap) { static int pmp_header(AVFormatContext *s, AVFormatParameters *ap)
{
PMPContext *pmp = s->priv_data; PMPContext *pmp = s->priv_data;
AVIOContext *pb = s->pb; AVIOContext *pb = s->pb;
int tb_num, tb_den; int tb_num, tb_den;
...@@ -93,7 +94,6 @@ static int pmp_header(AVFormatContext *s, AVFormatParameters *ap) { ...@@ -93,7 +94,6 @@ static int pmp_header(AVFormatContext *s, AVFormatParameters *ap) {
AVStream *ast = avformat_new_stream(s, NULL); AVStream *ast = avformat_new_stream(s, NULL);
if (!ast) if (!ast)
return AVERROR(ENOMEM); return AVERROR(ENOMEM);
ast->id = i;
ast->codec->codec_type = AVMEDIA_TYPE_AUDIO; ast->codec->codec_type = AVMEDIA_TYPE_AUDIO;
ast->codec->codec_id = audio_codec_id; ast->codec->codec_id = audio_codec_id;
ast->codec->channels = channels; ast->codec->channels = channels;
...@@ -111,7 +111,8 @@ static int pmp_header(AVFormatContext *s, AVFormatParameters *ap) { ...@@ -111,7 +111,8 @@ static int pmp_header(AVFormatContext *s, AVFormatParameters *ap) {
return 0; return 0;
} }
static int pmp_packet(AVFormatContext *s, AVPacket *pkt) { static int pmp_packet(AVFormatContext *s, AVPacket *pkt)
{
PMPContext *pmp = s->priv_data; PMPContext *pmp = s->priv_data;
AVIOContext *pb = s->pb; AVIOContext *pb = s->pb;
int ret = 0; int ret = 0;
...@@ -128,14 +129,18 @@ static int pmp_packet(AVFormatContext *s, AVPacket *pkt) { ...@@ -128,14 +129,18 @@ static int pmp_packet(AVFormatContext *s, AVPacket *pkt) {
av_fast_malloc(&pmp->packet_sizes, av_fast_malloc(&pmp->packet_sizes,
&pmp->packet_sizes_alloc, &pmp->packet_sizes_alloc,
num_packets * sizeof(*pmp->packet_sizes)); num_packets * sizeof(*pmp->packet_sizes));
if (!pmp->packet_sizes_alloc) {
av_log(s, AV_LOG_ERROR, "Cannot (re)allocate packet buffer\n");
return AVERROR(ENOMEM);
}
for (i = 0; i < num_packets; i++) for (i = 0; i < num_packets; i++)
pmp->packet_sizes[i] = avio_rl32(pb); pmp->packet_sizes[i] = avio_rl32(pb);
} }
ret = av_get_packet(pb, pkt, pmp->packet_sizes[pmp->current_packet]); ret = av_get_packet(pb, pkt, pmp->packet_sizes[pmp->current_packet]);
if (ret >= 0) { if (ret >= 0) {
ret = 0; ret = 0;
// FIXME: this is a hack that should be remove once // FIXME: this is a hack that should be removed once
// compute_pkt_fields can handle // compute_pkt_fields() can handle timestamps properly
if (pmp->cur_stream == 0) if (pmp->cur_stream == 0)
pkt->dts = s->streams[0]->cur_dts++; pkt->dts = s->streams[0]->cur_dts++;
pkt->stream_index = pmp->cur_stream; pkt->stream_index = pmp->cur_stream;
...@@ -146,8 +151,8 @@ static int pmp_packet(AVFormatContext *s, AVPacket *pkt) { ...@@ -146,8 +151,8 @@ static int pmp_packet(AVFormatContext *s, AVPacket *pkt) {
return ret; return ret;
} }
static int pmp_seek(AVFormatContext *s, int stream_index, static int pmp_seek(AVFormatContext *s, int stream_index, int64_t ts, int flags)
int64_t ts, int flags) { {
PMPContext *pmp = s->priv_data; PMPContext *pmp = s->priv_data;
pmp->cur_stream = 0; pmp->cur_stream = 0;
// fallback to default seek now // fallback to default seek now
......
...@@ -784,7 +784,6 @@ static int rtmp_close(URLContext *h) ...@@ -784,7 +784,6 @@ static int rtmp_close(URLContext *h)
av_freep(&rt->flv_data); av_freep(&rt->flv_data);
ffurl_close(rt->stream); ffurl_close(rt->stream);
av_free(rt);
return 0; return 0;
} }
...@@ -799,16 +798,12 @@ static int rtmp_close(URLContext *h) ...@@ -799,16 +798,12 @@ static int rtmp_close(URLContext *h)
*/ */
static int rtmp_open(URLContext *s, const char *uri, int flags) static int rtmp_open(URLContext *s, const char *uri, int flags)
{ {
RTMPContext *rt; RTMPContext *rt = s->priv_data;
char proto[8], hostname[256], path[1024], *fname; char proto[8], hostname[256], path[1024], *fname;
uint8_t buf[2048]; uint8_t buf[2048];
int port; int port;
int ret; int ret;
rt = av_mallocz(sizeof(RTMPContext));
if (!rt)
return AVERROR(ENOMEM);
s->priv_data = rt;
rt->is_input = !(flags & AVIO_FLAG_WRITE); rt->is_input = !(flags & AVIO_FLAG_WRITE);
av_url_split(proto, sizeof(proto), NULL, 0, hostname, sizeof(hostname), &port, av_url_split(proto, sizeof(proto), NULL, 0, hostname, sizeof(hostname), &port,
...@@ -826,7 +821,7 @@ static int rtmp_open(URLContext *s, const char *uri, int flags) ...@@ -826,7 +821,7 @@ static int rtmp_open(URLContext *s, const char *uri, int flags)
rt->state = STATE_START; rt->state = STATE_START;
if (rtmp_handshake(s, rt)) if (rtmp_handshake(s, rt))
return -1; goto fail;
rt->chunk_size = 128; rt->chunk_size = 128;
rt->state = STATE_HANDSHAKED; rt->state = STATE_HANDSHAKED;
...@@ -997,9 +992,10 @@ static int rtmp_write(URLContext *s, const uint8_t *buf, int size) ...@@ -997,9 +992,10 @@ static int rtmp_write(URLContext *s, const uint8_t *buf, int size)
} }
URLProtocol ff_rtmp_protocol = { URLProtocol ff_rtmp_protocol = {
.name = "rtmp", .name = "rtmp",
.url_open = rtmp_open, .url_open = rtmp_open,
.url_read = rtmp_read, .url_read = rtmp_read,
.url_write = rtmp_write, .url_write = rtmp_write,
.url_close = rtmp_close, .url_close = rtmp_close,
.priv_data_size = sizeof(RTMPContext),
}; };
...@@ -27,10 +27,8 @@ static int g726_ ## bitrate ##_init(AVFormatContext *s, int st_index, PayloadCon ...@@ -27,10 +27,8 @@ static int g726_ ## bitrate ##_init(AVFormatContext *s, int st_index, PayloadCon
AVStream *stream = s->streams[st_index]; \ AVStream *stream = s->streams[st_index]; \
AVCodecContext *codec = stream->codec; \ AVCodecContext *codec = stream->codec; \
\ \
codec->bit_rate = bitrate*1000; \ codec->bits_per_coded_sample = bitrate/8; \
if (codec->sample_rate) \ codec->bit_rate = codec->bits_per_coded_sample * codec->sample_rate; \
codec->bits_per_coded_sample = \
av_clip((codec->bit_rate + codec->sample_rate/2) / codec->sample_rate, 2, 5); \
\ \
return 0; \ return 0; \
} \ } \
......
...@@ -72,6 +72,7 @@ static int is_supported(enum CodecID id) ...@@ -72,6 +72,7 @@ static int is_supported(enum CodecID id)
case CODEC_ID_THEORA: case CODEC_ID_THEORA:
case CODEC_ID_VP8: case CODEC_ID_VP8:
case CODEC_ID_ADPCM_G722: case CODEC_ID_ADPCM_G722:
case CODEC_ID_ADPCM_G726:
return 1; return 1;
default: default:
return 0; return 0;
...@@ -121,7 +122,7 @@ static int rtp_write_header(AVFormatContext *s1) ...@@ -121,7 +122,7 @@ static int rtp_write_header(AVFormatContext *s1)
if (st->codec->frame_size == 0) { if (st->codec->frame_size == 0) {
av_log(s1, AV_LOG_ERROR, "Cannot respect max delay: frame size = 0\n"); av_log(s1, AV_LOG_ERROR, "Cannot respect max delay: frame size = 0\n");
} else { } else {
s->max_frames_per_packet = av_rescale_rnd(s1->max_delay, st->codec->sample_rate, AV_TIME_BASE * st->codec->frame_size, AV_ROUND_DOWN); s->max_frames_per_packet = av_rescale_rnd(s1->max_delay, st->codec->sample_rate, AV_TIME_BASE * (int64_t)st->codec->frame_size, AV_ROUND_DOWN);
} }
} }
if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) { if (st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
...@@ -248,14 +249,16 @@ void ff_rtp_send_data(AVFormatContext *s1, const uint8_t *buf1, int len, int m) ...@@ -248,14 +249,16 @@ void ff_rtp_send_data(AVFormatContext *s1, const uint8_t *buf1, int len, int m)
/* send an integer number of samples and compute time stamp and fill /* send an integer number of samples and compute time stamp and fill
the rtp send buffer before sending. */ the rtp send buffer before sending. */
static void rtp_send_samples(AVFormatContext *s1, static void rtp_send_samples(AVFormatContext *s1,
const uint8_t *buf1, int size, int sample_size) const uint8_t *buf1, int size, int sample_size_bits)
{ {
RTPMuxContext *s = s1->priv_data; RTPMuxContext *s = s1->priv_data;
int len, max_packet_size, n; int len, max_packet_size, n;
/* Calculate the number of bytes to get samples aligned on a byte border */
int aligned_samples_size = sample_size_bits/av_gcd(sample_size_bits, 8);
max_packet_size = (s->max_payload_size / sample_size) * sample_size; max_packet_size = (s->max_payload_size / aligned_samples_size) * aligned_samples_size;
/* not needed, but who nows */ /* Not needed, but who knows. Don't check if samples aren't an even number of bytes. */
if ((size % sample_size) != 0) if ((sample_size_bits % 8) == 0 && ((8 * size) % sample_size_bits) != 0)
av_abort(); av_abort();
n = 0; n = 0;
while (size > 0) { while (size > 0) {
...@@ -267,7 +270,7 @@ static void rtp_send_samples(AVFormatContext *s1, ...@@ -267,7 +270,7 @@ static void rtp_send_samples(AVFormatContext *s1,
s->buf_ptr += len; s->buf_ptr += len;
buf1 += len; buf1 += len;
size -= len; size -= len;
s->timestamp = s->cur_timestamp + n / sample_size; s->timestamp = s->cur_timestamp + n * 8 / sample_size_bits;
ff_rtp_send_data(s1, s->buf, s->buf_ptr - s->buf, 0); ff_rtp_send_data(s1, s->buf, s->buf_ptr - s->buf, 0);
n += (s->buf_ptr - s->buf); n += (s->buf_ptr - s->buf);
} }
...@@ -394,19 +397,24 @@ static int rtp_write_packet(AVFormatContext *s1, AVPacket *pkt) ...@@ -394,19 +397,24 @@ static int rtp_write_packet(AVFormatContext *s1, AVPacket *pkt)
case CODEC_ID_PCM_ALAW: case CODEC_ID_PCM_ALAW:
case CODEC_ID_PCM_U8: case CODEC_ID_PCM_U8:
case CODEC_ID_PCM_S8: case CODEC_ID_PCM_S8:
rtp_send_samples(s1, pkt->data, size, 1 * st->codec->channels); rtp_send_samples(s1, pkt->data, size, 8 * st->codec->channels);
break; break;
case CODEC_ID_PCM_U16BE: case CODEC_ID_PCM_U16BE:
case CODEC_ID_PCM_U16LE: case CODEC_ID_PCM_U16LE:
case CODEC_ID_PCM_S16BE: case CODEC_ID_PCM_S16BE:
case CODEC_ID_PCM_S16LE: case CODEC_ID_PCM_S16LE:
rtp_send_samples(s1, pkt->data, size, 2 * st->codec->channels); rtp_send_samples(s1, pkt->data, size, 16 * st->codec->channels);
break; break;
case CODEC_ID_ADPCM_G722: case CODEC_ID_ADPCM_G722:
/* The actual sample size is half a byte per sample, but since the /* The actual sample size is half a byte per sample, but since the
* stream clock rate is 8000 Hz while the sample rate is 16000 Hz, * stream clock rate is 8000 Hz while the sample rate is 16000 Hz,
* the correct parameter for send_samples is 1 byte per stream clock. */ * the correct parameter for send_samples_bits is 8 bits per stream
rtp_send_samples(s1, pkt->data, size, 1 * st->codec->channels); * clock. */
rtp_send_samples(s1, pkt->data, size, 8 * st->codec->channels);
break;
case CODEC_ID_ADPCM_G726:
rtp_send_samples(s1, pkt->data, size,
st->codec->bits_per_coded_sample * st->codec->channels);
break; break;
case CODEC_ID_MP2: case CODEC_ID_MP2:
case CODEC_ID_MP3: case CODEC_ID_MP3:
......
...@@ -137,7 +137,7 @@ static void build_udp_url(char *buf, int buf_size, ...@@ -137,7 +137,7 @@ static void build_udp_url(char *buf, int buf_size,
static int rtp_open(URLContext *h, const char *uri, int flags) static int rtp_open(URLContext *h, const char *uri, int flags)
{ {
RTPContext *s; RTPContext *s = h->priv_data;
int rtp_port, rtcp_port, int rtp_port, rtcp_port,
ttl, connect, ttl, connect,
local_rtp_port, local_rtcp_port, max_packet_size; local_rtp_port, local_rtcp_port, max_packet_size;
...@@ -146,11 +146,6 @@ static int rtp_open(URLContext *h, const char *uri, int flags) ...@@ -146,11 +146,6 @@ static int rtp_open(URLContext *h, const char *uri, int flags)
char path[1024]; char path[1024];
const char *p; const char *p;
s = av_mallocz(sizeof(RTPContext));
if (!s)
return AVERROR(ENOMEM);
h->priv_data = s;
av_url_split(NULL, 0, NULL, 0, hostname, sizeof(hostname), &rtp_port, av_url_split(NULL, 0, NULL, 0, hostname, sizeof(hostname), &rtp_port,
path, sizeof(path), uri); path, sizeof(path), uri);
/* extract parameters */ /* extract parameters */
...@@ -214,7 +209,6 @@ static int rtp_open(URLContext *h, const char *uri, int flags) ...@@ -214,7 +209,6 @@ static int rtp_open(URLContext *h, const char *uri, int flags)
ffurl_close(s->rtp_hd); ffurl_close(s->rtp_hd);
if (s->rtcp_hd) if (s->rtcp_hd)
ffurl_close(s->rtcp_hd); ffurl_close(s->rtcp_hd);
av_free(s);
return AVERROR(EIO); return AVERROR(EIO);
} }
...@@ -291,7 +285,6 @@ static int rtp_close(URLContext *h) ...@@ -291,7 +285,6 @@ static int rtp_close(URLContext *h)
ffurl_close(s->rtp_hd); ffurl_close(s->rtp_hd);
ffurl_close(s->rtcp_hd); ffurl_close(s->rtcp_hd);
av_free(s);
return 0; return 0;
} }
...@@ -337,4 +330,5 @@ URLProtocol ff_rtp_protocol = { ...@@ -337,4 +330,5 @@ URLProtocol ff_rtp_protocol = {
.url_write = rtp_write, .url_write = rtp_write,
.url_close = rtp_close, .url_close = rtp_close,
.url_get_file_handle = rtp_get_file_handle, .url_get_file_handle = rtp_get_file_handle,
.priv_data_size = sizeof(RTPContext),
}; };
...@@ -517,6 +517,14 @@ static char *sdp_write_media_attributes(char *buff, int size, AVCodecContext *c, ...@@ -517,6 +517,14 @@ static char *sdp_write_media_attributes(char *buff, int size, AVCodecContext *c,
payload_type, payload_type,
8000, c->channels); 8000, c->channels);
break; break;
case CODEC_ID_ADPCM_G726: {
if (payload_type >= RTP_PT_PRIVATE)
av_strlcatf(buff, size, "a=rtpmap:%d G726-%d/%d\r\n",
payload_type,
c->bits_per_coded_sample*8,
c->sample_rate);
break;
}
default: default:
/* Nothing special to do here... */ /* Nothing special to do here... */
break; break;
......
...@@ -39,7 +39,7 @@ static int tcp_open(URLContext *h, const char *uri, int flags) ...@@ -39,7 +39,7 @@ static int tcp_open(URLContext *h, const char *uri, int flags)
{ {
struct addrinfo hints, *ai, *cur_ai; struct addrinfo hints, *ai, *cur_ai;
int port, fd = -1; int port, fd = -1;
TCPContext *s = NULL; TCPContext *s = h->priv_data;
int listen_socket = 0; int listen_socket = 0;
const char *p; const char *p;
char buf[256]; char buf[256];
...@@ -135,12 +135,6 @@ static int tcp_open(URLContext *h, const char *uri, int flags) ...@@ -135,12 +135,6 @@ static int tcp_open(URLContext *h, const char *uri, int flags)
goto fail; goto fail;
} }
} }
s = av_malloc(sizeof(TCPContext));
if (!s) {
freeaddrinfo(ai);
return AVERROR(ENOMEM);
}
h->priv_data = s;
h->is_streamed = 1; h->is_streamed = 1;
s->fd = fd; s->fd = fd;
freeaddrinfo(ai); freeaddrinfo(ai);
...@@ -193,7 +187,6 @@ static int tcp_close(URLContext *h) ...@@ -193,7 +187,6 @@ static int tcp_close(URLContext *h)
{ {
TCPContext *s = h->priv_data; TCPContext *s = h->priv_data;
closesocket(s->fd); closesocket(s->fd);
av_free(s);
return 0; return 0;
} }
...@@ -210,4 +203,5 @@ URLProtocol ff_tcp_protocol = { ...@@ -210,4 +203,5 @@ URLProtocol ff_tcp_protocol = {
.url_write = tcp_write, .url_write = tcp_write,
.url_close = tcp_close, .url_close = tcp_close,
.url_get_file_handle = tcp_get_file_handle, .url_get_file_handle = tcp_get_file_handle,
.priv_data_size = sizeof(TCPContext),
}; };
...@@ -381,7 +381,7 @@ static int udp_open(URLContext *h, const char *uri, int flags) ...@@ -381,7 +381,7 @@ static int udp_open(URLContext *h, const char *uri, int flags)
{ {
char hostname[1024], localaddr[1024] = ""; char hostname[1024], localaddr[1024] = "";
int port, udp_fd = -1, tmp, bind_ret = -1; int port, udp_fd = -1, tmp, bind_ret = -1;
UDPContext *s = NULL; UDPContext *s = h->priv_data;
int is_output; int is_output;
const char *p; const char *p;
char buf[256]; char buf[256];
...@@ -394,11 +394,6 @@ static int udp_open(URLContext *h, const char *uri, int flags) ...@@ -394,11 +394,6 @@ static int udp_open(URLContext *h, const char *uri, int flags)
is_output = !(flags & AVIO_FLAG_READ); is_output = !(flags & AVIO_FLAG_READ);
s = av_mallocz(sizeof(UDPContext));
if (!s)
return AVERROR(ENOMEM);
h->priv_data = s;
s->ttl = 16; s->ttl = 16;
s->buffer_size = is_output ? UDP_TX_BUF_SIZE : UDP_MAX_PKT_SIZE; s->buffer_size = is_output ? UDP_TX_BUF_SIZE : UDP_MAX_PKT_SIZE;
...@@ -533,7 +528,6 @@ static int udp_open(URLContext *h, const char *uri, int flags) ...@@ -533,7 +528,6 @@ static int udp_open(URLContext *h, const char *uri, int flags)
if (udp_fd >= 0) if (udp_fd >= 0)
closesocket(udp_fd); closesocket(udp_fd);
av_fifo_free(s->fifo); av_fifo_free(s->fifo);
av_free(s);
return AVERROR(EIO); return AVERROR(EIO);
} }
...@@ -614,7 +608,6 @@ static int udp_close(URLContext *h) ...@@ -614,7 +608,6 @@ static int udp_close(URLContext *h)
udp_leave_multicast_group(s->udp_fd, (struct sockaddr *)&s->dest_addr); udp_leave_multicast_group(s->udp_fd, (struct sockaddr *)&s->dest_addr);
closesocket(s->udp_fd); closesocket(s->udp_fd);
av_fifo_free(s->fifo); av_fifo_free(s->fifo);
av_free(s);
return 0; return 0;
} }
...@@ -625,4 +618,5 @@ URLProtocol ff_udp_protocol = { ...@@ -625,4 +618,5 @@ URLProtocol ff_udp_protocol = {
.url_write = udp_write, .url_write = udp_write,
.url_close = udp_close, .url_close = udp_close,
.url_get_file_handle = udp_get_file_handle, .url_get_file_handle = udp_get_file_handle,
.priv_data_size = sizeof(UDPContext),
}; };
...@@ -44,6 +44,7 @@ ...@@ -44,6 +44,7 @@
#include "libavutil/cpu.h" #include "libavutil/cpu.h"
#include "libavutil/avutil.h" #include "libavutil/avutil.h"
#include "libavutil/bswap.h" #include "libavutil/bswap.h"
#include "libavutil/mathematics.h"
#include "libavutil/opt.h" #include "libavutil/opt.h"
#include "libavutil/pixdesc.h" #include "libavutil/pixdesc.h"
#include "libavutil/avassert.h" #include "libavutil/avassert.h"
......
...@@ -395,26 +395,62 @@ do_audio_enc_dec() { ...@@ -395,26 +395,62 @@ do_audio_enc_dec() {
do_audio_decoding do_audio_decoding
} }
if [ -n "$do_pcm" ] ; then if [ -n "$do_pcm_alaw" ] ; then
do_audio_enc_dec wav s16 pcm_alaw do_audio_enc_dec wav s16 pcm_alaw
fi
if [ -n "$do_pcm_mulaw" ] ; then
do_audio_enc_dec wav s16 pcm_mulaw do_audio_enc_dec wav s16 pcm_mulaw
fi
if [ -n "$do_pcm_s8" ] ; then
do_audio_enc_dec mov u8 pcm_s8 do_audio_enc_dec mov u8 pcm_s8
fi
if [ -n "$do_pcm_u8" ] ; then
do_audio_enc_dec wav u8 pcm_u8 do_audio_enc_dec wav u8 pcm_u8
fi
if [ -n "$do_pcm_s16be" ] ; then
do_audio_enc_dec mov s16 pcm_s16be do_audio_enc_dec mov s16 pcm_s16be
fi
if [ -n "$do_pcm_s16le" ] ; then
do_audio_enc_dec wav s16 pcm_s16le do_audio_enc_dec wav s16 pcm_s16le
do_audio_enc_dec mkv s16 pcm_s16be fi
do_audio_enc_dec mkv s16 pcm_s16le if [ -n "$do_pcm_s24be" ] ; then
do_audio_enc_dec mov s32 pcm_s24be do_audio_enc_dec mov s32 pcm_s24be
fi
if [ -n "$do_pcm_s24le" ] ; then
do_audio_enc_dec wav s32 pcm_s24le do_audio_enc_dec wav s32 pcm_s24le
#do_audio_enc_dec ??? s32 pcm_u24be #no compatible muxer or demuxer fi
#do_audio_enc_dec ??? s32 pcm_u24le #no compatible muxer or demuxer # no compatible muxer or demuxer
# if [ -n "$do_pcm_u24be" ] ; then
# do_audio_enc_dec ??? u32 pcm_u24be
# fi
# if [ -n "$do_pcm_u24le" ] ; then
# do_audio_enc_dec ??? u32 pcm_u24le
# fi
if [ -n "$do_pcm_s32be" ] ; then
do_audio_enc_dec mov s32 pcm_s32be do_audio_enc_dec mov s32 pcm_s32be
fi
if [ -n "$do_pcm_s32le" ] ; then
do_audio_enc_dec wav s32 pcm_s32le do_audio_enc_dec wav s32 pcm_s32le
#do_audio_enc_dec ??? s32 pcm_u32be #no compatible muxer or demuxer fi
#do_audio_enc_dec ??? s32 pcm_u32le #no compatible muxer or demuxer # no compatible muxer or demuxer
# if [ -n "$do_pcm_u32be" ] ; then
# do_audio_enc_dec ??? u32 pcm_u32be
# fi
# if [ -n "$do_pcm_u32le" ] ; then
# do_audio_enc_dec ??? u32 pcm_u32le
# fi
if [ -n "$do_pcm_f32be" ] ; then
do_audio_enc_dec au flt pcm_f32be do_audio_enc_dec au flt pcm_f32be
fi
if [ -n "$do_pcm_f32le" ] ; then
do_audio_enc_dec wav flt pcm_f32le do_audio_enc_dec wav flt pcm_f32le
fi
if [ -n "$do_pcm_f64be" ] ; then
do_audio_enc_dec au dbl pcm_f64be do_audio_enc_dec au dbl pcm_f64be
fi
if [ -n "$do_pcm_f64le" ] ; then
do_audio_enc_dec wav dbl pcm_f64le do_audio_enc_dec wav dbl pcm_f64le
fi
if [ -n "$do_pcm_s24daud" ] ; then
do_audio_enc_dec 302 s16 pcm_s24daud "-ac 6 -ar 96000" do_audio_enc_dec 302 s16 pcm_s24daud "-ac 6 -ar 96000"
fi fi
ede2da07839a00c255a43129922f2c7b *./tests/data/acodec/pcm_alaw.wav
529258 ./tests/data/acodec/pcm_alaw.wav
f323f7551ffad91de8613f44dcb198b6 *./tests/data/pcm.acodec.out.wav
stddev: 101.67 PSNR: 56.19 MAXDIFF: 515 bytes: 1058400/ 1058400
0c2a55850fb46ad5385a69b15b271f10 *./tests/data/acodec/pcm_mulaw.wav
529258 ./tests/data/acodec/pcm_mulaw.wav
7ae8c3fc804bd574006fd547fe28980c *./tests/data/pcm.acodec.out.wav
stddev: 103.38 PSNR: 56.04 MAXDIFF: 644 bytes: 1058400/ 1058400
b78d2a30df75af08ecf86f201281fec2 *./tests/data/acodec/pcm_s8.mov
529793 ./tests/data/acodec/pcm_s8.mov
651d4eb8d98dfcdda96ae6c43d8f156b *./tests/data/pcm.acodec.out.wav
stddev: 147.89 PSNR: 52.93 MAXDIFF: 255 bytes: 1058400/ 1058400
70fecbae732f81143a560c7315eda49a *./tests/data/acodec/pcm_u8.wav
529246 ./tests/data/acodec/pcm_u8.wav
651d4eb8d98dfcdda96ae6c43d8f156b *./tests/data/pcm.acodec.out.wav
stddev: 147.89 PSNR: 52.93 MAXDIFF: 255 bytes: 1058400/ 1058400
9686b93d1439fc2df991a004ab0298f4 *./tests/data/acodec/pcm_s16be.mov
1058993 ./tests/data/acodec/pcm_s16be.mov
64151e4bcc2b717aa5a8454d424d6a1f *./tests/data/pcm.acodec.out.wav
stddev: 0.00 PSNR:999.99 MAXDIFF: 0 bytes: 1058400/ 1058400
64151e4bcc2b717aa5a8454d424d6a1f *./tests/data/acodec/pcm_s16le.wav
1058446 ./tests/data/acodec/pcm_s16le.wav
64151e4bcc2b717aa5a8454d424d6a1f *./tests/data/pcm.acodec.out.wav
stddev: 0.00 PSNR:999.99 MAXDIFF: 0 bytes: 1058400/ 1058400
af717ca95eaca310772eb1238c745d1b *./tests/data/acodec/pcm_s16be.mkv
1060638 ./tests/data/acodec/pcm_s16be.mkv
64151e4bcc2b717aa5a8454d424d6a1f *./tests/data/pcm.acodec.out.wav
stddev: 0.00 PSNR:999.99 MAXDIFF: 0 bytes: 1058400/ 1058400
c4f51bf32fad2f7af8ea5beedb56168b *./tests/data/acodec/pcm_s16le.mkv
1060638 ./tests/data/acodec/pcm_s16le.mkv
64151e4bcc2b717aa5a8454d424d6a1f *./tests/data/pcm.acodec.out.wav
stddev: 0.00 PSNR:999.99 MAXDIFF: 0 bytes: 1058400/ 1058400
22c5c3df0a4765e28c205a4fb95b3cdc *./tests/data/acodec/pcm_s24be.mov
1588193 ./tests/data/acodec/pcm_s24be.mov
64151e4bcc2b717aa5a8454d424d6a1f *./tests/data/pcm.acodec.out.wav
stddev: 0.00 PSNR:999.99 MAXDIFF: 0 bytes: 1058400/ 1058400
a85380fb79b0d4fff38e24ac1e34bb94 *./tests/data/acodec/pcm_s24le.wav
1587668 ./tests/data/acodec/pcm_s24le.wav
64151e4bcc2b717aa5a8454d424d6a1f *./tests/data/pcm.acodec.out.wav
stddev: 0.00 PSNR:999.99 MAXDIFF: 0 bytes: 1058400/ 1058400
b36ac7a1b4fc28248a565a676e555bd1 *./tests/data/acodec/pcm_s32be.mov
2117393 ./tests/data/acodec/pcm_s32be.mov
64151e4bcc2b717aa5a8454d424d6a1f *./tests/data/pcm.acodec.out.wav
stddev: 0.00 PSNR:999.99 MAXDIFF: 0 bytes: 1058400/ 1058400
da6ed80f4f40f0082577dea80827e014 *./tests/data/acodec/pcm_s32le.wav
2116868 ./tests/data/acodec/pcm_s32le.wav
64151e4bcc2b717aa5a8454d424d6a1f *./tests/data/pcm.acodec.out.wav
stddev: 0.00 PSNR:999.99 MAXDIFF: 0 bytes: 1058400/ 1058400
118ff3dc83c62ce9ce669eef57e55bb2 *./tests/data/acodec/pcm_f32be.au
2116824 ./tests/data/acodec/pcm_f32be.au
64151e4bcc2b717aa5a8454d424d6a1f *./tests/data/pcm.acodec.out.wav
stddev: 0.00 PSNR:999.99 MAXDIFF: 0 bytes: 1058400/ 1058400
46f44f86a18984a832206ab9e29a79f2 *./tests/data/acodec/pcm_f32le.wav
2116880 ./tests/data/acodec/pcm_f32le.wav
64151e4bcc2b717aa5a8454d424d6a1f *./tests/data/pcm.acodec.out.wav
stddev: 0.00 PSNR:999.99 MAXDIFF: 0 bytes: 1058400/ 1058400
8112296b1ed94f72f20d04b1a54850a7 *./tests/data/acodec/pcm_f64be.au
4233624 ./tests/data/acodec/pcm_f64be.au
64151e4bcc2b717aa5a8454d424d6a1f *./tests/data/pcm.acodec.out.wav
stddev: 0.00 PSNR:999.99 MAXDIFF: 0 bytes: 1058400/ 1058400
ba17c6d1a270e1333e981f239bf7eb45 *./tests/data/acodec/pcm_f64le.wav
4233680 ./tests/data/acodec/pcm_f64le.wav
64151e4bcc2b717aa5a8454d424d6a1f *./tests/data/pcm.acodec.out.wav
stddev: 0.00 PSNR:999.99 MAXDIFF: 0 bytes: 1058400/ 1058400
1b75d5198ae789ab3c48f7024e08f4a9 *./tests/data/acodec/pcm_s24daud.302
10368730 ./tests/data/acodec/pcm_s24daud.302
4708f86529c594e29404603c64bb208c *./tests/data/pcm.acodec.out.wav
stddev: 8967.92 PSNR: 17.28 MAXDIFF:42548 bytes: 6911796/ 1058400
ede2da07839a00c255a43129922f2c7b *./tests/data/acodec/pcm_alaw.wav
529258 ./tests/data/acodec/pcm_alaw.wav
f323f7551ffad91de8613f44dcb198b6 *./tests/data/pcm_alaw.acodec.out.wav
stddev: 101.67 PSNR: 56.19 MAXDIFF: 515 bytes: 1058400/ 1058400
118ff3dc83c62ce9ce669eef57e55bb2 *./tests/data/acodec/pcm_f32be.au
2116824 ./tests/data/acodec/pcm_f32be.au
64151e4bcc2b717aa5a8454d424d6a1f *./tests/data/pcm_f32be.acodec.out.wav
stddev: 0.00 PSNR:999.99 MAXDIFF: 0 bytes: 1058400/ 1058400
46f44f86a18984a832206ab9e29a79f2 *./tests/data/acodec/pcm_f32le.wav
2116880 ./tests/data/acodec/pcm_f32le.wav
64151e4bcc2b717aa5a8454d424d6a1f *./tests/data/pcm_f32le.acodec.out.wav
stddev: 0.00 PSNR:999.99 MAXDIFF: 0 bytes: 1058400/ 1058400
8112296b1ed94f72f20d04b1a54850a7 *./tests/data/acodec/pcm_f64be.au
4233624 ./tests/data/acodec/pcm_f64be.au
64151e4bcc2b717aa5a8454d424d6a1f *./tests/data/pcm_f64be.acodec.out.wav
stddev: 0.00 PSNR:999.99 MAXDIFF: 0 bytes: 1058400/ 1058400
ba17c6d1a270e1333e981f239bf7eb45 *./tests/data/acodec/pcm_f64le.wav
4233680 ./tests/data/acodec/pcm_f64le.wav
64151e4bcc2b717aa5a8454d424d6a1f *./tests/data/pcm_f64le.acodec.out.wav
stddev: 0.00 PSNR:999.99 MAXDIFF: 0 bytes: 1058400/ 1058400
0c2a55850fb46ad5385a69b15b271f10 *./tests/data/acodec/pcm_mulaw.wav
529258 ./tests/data/acodec/pcm_mulaw.wav
7ae8c3fc804bd574006fd547fe28980c *./tests/data/pcm_mulaw.acodec.out.wav
stddev: 103.38 PSNR: 56.04 MAXDIFF: 644 bytes: 1058400/ 1058400
9686b93d1439fc2df991a004ab0298f4 *./tests/data/acodec/pcm_s16be.mov
1058993 ./tests/data/acodec/pcm_s16be.mov
64151e4bcc2b717aa5a8454d424d6a1f *./tests/data/pcm_s16be.acodec.out.wav
stddev: 0.00 PSNR:999.99 MAXDIFF: 0 bytes: 1058400/ 1058400
64151e4bcc2b717aa5a8454d424d6a1f *./tests/data/acodec/pcm_s16le.wav
1058446 ./tests/data/acodec/pcm_s16le.wav
64151e4bcc2b717aa5a8454d424d6a1f *./tests/data/pcm_s16le.acodec.out.wav
stddev: 0.00 PSNR:999.99 MAXDIFF: 0 bytes: 1058400/ 1058400
22c5c3df0a4765e28c205a4fb95b3cdc *./tests/data/acodec/pcm_s24be.mov
1588193 ./tests/data/acodec/pcm_s24be.mov
64151e4bcc2b717aa5a8454d424d6a1f *./tests/data/pcm_s24be.acodec.out.wav
stddev: 0.00 PSNR:999.99 MAXDIFF: 0 bytes: 1058400/ 1058400
1b75d5198ae789ab3c48f7024e08f4a9 *./tests/data/acodec/pcm_s24daud.302
10368730 ./tests/data/acodec/pcm_s24daud.302
4708f86529c594e29404603c64bb208c *./tests/data/pcm_s24daud.acodec.out.wav
stddev: 8967.92 PSNR: 17.28 MAXDIFF:42548 bytes: 6911796/ 1058400
a85380fb79b0d4fff38e24ac1e34bb94 *./tests/data/acodec/pcm_s24le.wav
1587668 ./tests/data/acodec/pcm_s24le.wav
64151e4bcc2b717aa5a8454d424d6a1f *./tests/data/pcm_s24le.acodec.out.wav
stddev: 0.00 PSNR:999.99 MAXDIFF: 0 bytes: 1058400/ 1058400
b36ac7a1b4fc28248a565a676e555bd1 *./tests/data/acodec/pcm_s32be.mov
2117393 ./tests/data/acodec/pcm_s32be.mov
64151e4bcc2b717aa5a8454d424d6a1f *./tests/data/pcm_s32be.acodec.out.wav
stddev: 0.00 PSNR:999.99 MAXDIFF: 0 bytes: 1058400/ 1058400
da6ed80f4f40f0082577dea80827e014 *./tests/data/acodec/pcm_s32le.wav
2116868 ./tests/data/acodec/pcm_s32le.wav
64151e4bcc2b717aa5a8454d424d6a1f *./tests/data/pcm_s32le.acodec.out.wav
stddev: 0.00 PSNR:999.99 MAXDIFF: 0 bytes: 1058400/ 1058400
b78d2a30df75af08ecf86f201281fec2 *./tests/data/acodec/pcm_s8.mov
529793 ./tests/data/acodec/pcm_s8.mov
651d4eb8d98dfcdda96ae6c43d8f156b *./tests/data/pcm_s8.acodec.out.wav
stddev: 147.89 PSNR: 52.93 MAXDIFF: 255 bytes: 1058400/ 1058400
70fecbae732f81143a560c7315eda49a *./tests/data/acodec/pcm_u8.wav
529246 ./tests/data/acodec/pcm_u8.wav
651d4eb8d98dfcdda96ae6c43d8f156b *./tests/data/pcm_u8.acodec.out.wav
stddev: 147.89 PSNR: 52.93 MAXDIFF: 255 bytes: 1058400/ 1058400
ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 412 size: 4096
ret: 0 st:-1 flags:0 ts:-1.000000
ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 412 size: 4096
ret: 0 st:-1 flags:1 ts: 1.894167
ret: 0 st: 0 flags:1 dts: 1.881000 pts: 1.881000 pos: 332755 size: 4096
ret: 0 st: 0 flags:0 ts: 0.788000
ret: 0 st: 0 flags:1 dts: 0.789000 pts: 0.789000 pos: 139914 size: 4096
ret: 0 st: 0 flags:1 ts:-0.317000
ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 412 size: 4096
ret: 0 st:-1 flags:0 ts: 2.576668
ret: 0 st: 0 flags:1 dts: 2.577000 pts: 2.577000 pos: 455845 size: 4096
ret: 0 st:-1 flags:1 ts: 1.470835
ret: 0 st: 0 flags:1 dts: 1.463000 pts: 1.463000 pos: 258901 size: 4096
ret: 0 st: 0 flags:0 ts: 0.365000
ret: 0 st: 0 flags:1 dts: 0.372000 pts: 0.372000 pos: 66060 size: 4096
ret: 0 st: 0 flags:1 ts:-0.741000
ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 412 size: 4096
ret: 0 st:-1 flags:0 ts: 2.153336
ret: 0 st: 0 flags:1 dts: 2.159000 pts: 2.159000 pos: 381991 size: 4096
ret: 0 st:-1 flags:1 ts: 1.047503
ret: 0 st: 0 flags:1 dts: 1.045000 pts: 1.045000 pos: 185047 size: 4096
ret: 0 st: 0 flags:0 ts:-0.058000
ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 412 size: 4096
ret: 0 st: 0 flags:1 ts: 2.836000
ret: 0 st: 0 flags:1 dts: 2.833000 pts: 2.833000 pos: 500978 size: 4096
ret: 0 st:-1 flags:0 ts: 1.730004
ret: 0 st: 0 flags:1 dts: 1.741000 pts: 1.741000 pos: 308137 size: 4096
ret: 0 st:-1 flags:1 ts: 0.624171
ret: 0 st: 0 flags:1 dts: 0.604000 pts: 0.604000 pos: 107090 size: 4096
ret: 0 st: 0 flags:0 ts:-0.482000
ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 412 size: 4096
ret: 0 st: 0 flags:1 ts: 2.413000
ret: 0 st: 0 flags:1 dts: 2.392000 pts: 2.392000 pos: 423021 size: 4096
ret: 0 st:-1 flags:0 ts: 1.306672
ret: 0 st: 0 flags:1 dts: 1.324000 pts: 1.324000 pos: 234283 size: 4096
ret: 0 st:-1 flags:1 ts: 0.200839
ret: 0 st: 0 flags:1 dts: 0.186000 pts: 0.186000 pos: 33236 size: 4096
ret: 0 st: 0 flags:0 ts:-0.905000
ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 412 size: 4096
ret: 0 st: 0 flags:1 ts: 1.989000
ret: 0 st: 0 flags:1 dts: 1.974000 pts: 1.974000 pos: 349167 size: 4096
ret: 0 st:-1 flags:0 ts: 0.883340
ret: 0 st: 0 flags:1 dts: 0.906000 pts: 0.906000 pos: 160429 size: 4096
ret: 0 st:-1 flags:1 ts:-0.222493
ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 412 size: 4096
ret: 0 st: 0 flags:0 ts: 2.672000
ret: 0 st: 0 flags:1 dts: 2.694000 pts: 2.694000 pos: 476360 size: 4096
ret: 0 st: 0 flags:1 ts: 1.566000
ret: 0 st: 0 flags:1 dts: 1.556000 pts: 1.556000 pos: 275313 size: 4096
ret: 0 st:-1 flags:0 ts: 0.460008
ret: 0 st: 0 flags:1 dts: 0.464000 pts: 0.464000 pos: 82472 size: 4096
ret: 0 st:-1 flags:1 ts:-0.645825
ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 412 size: 4096
ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 412 size: 4096
ret: 0 st:-1 flags:0 ts:-1.000000
ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 412 size: 4096
ret: 0 st:-1 flags:1 ts: 1.894167
ret: 0 st: 0 flags:1 dts: 1.881000 pts: 1.881000 pos: 332755 size: 4096
ret: 0 st: 0 flags:0 ts: 0.788000
ret: 0 st: 0 flags:1 dts: 0.789000 pts: 0.789000 pos: 139914 size: 4096
ret: 0 st: 0 flags:1 ts:-0.317000
ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 412 size: 4096
ret: 0 st:-1 flags:0 ts: 2.576668
ret: 0 st: 0 flags:1 dts: 2.577000 pts: 2.577000 pos: 455845 size: 4096
ret: 0 st:-1 flags:1 ts: 1.470835
ret: 0 st: 0 flags:1 dts: 1.463000 pts: 1.463000 pos: 258901 size: 4096
ret: 0 st: 0 flags:0 ts: 0.365000
ret: 0 st: 0 flags:1 dts: 0.372000 pts: 0.372000 pos: 66060 size: 4096
ret: 0 st: 0 flags:1 ts:-0.741000
ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 412 size: 4096
ret: 0 st:-1 flags:0 ts: 2.153336
ret: 0 st: 0 flags:1 dts: 2.159000 pts: 2.159000 pos: 381991 size: 4096
ret: 0 st:-1 flags:1 ts: 1.047503
ret: 0 st: 0 flags:1 dts: 1.045000 pts: 1.045000 pos: 185047 size: 4096
ret: 0 st: 0 flags:0 ts:-0.058000
ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 412 size: 4096
ret: 0 st: 0 flags:1 ts: 2.836000
ret: 0 st: 0 flags:1 dts: 2.833000 pts: 2.833000 pos: 500978 size: 4096
ret: 0 st:-1 flags:0 ts: 1.730004
ret: 0 st: 0 flags:1 dts: 1.741000 pts: 1.741000 pos: 308137 size: 4096
ret: 0 st:-1 flags:1 ts: 0.624171
ret: 0 st: 0 flags:1 dts: 0.604000 pts: 0.604000 pos: 107090 size: 4096
ret: 0 st: 0 flags:0 ts:-0.482000
ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 412 size: 4096
ret: 0 st: 0 flags:1 ts: 2.413000
ret: 0 st: 0 flags:1 dts: 2.392000 pts: 2.392000 pos: 423021 size: 4096
ret: 0 st:-1 flags:0 ts: 1.306672
ret: 0 st: 0 flags:1 dts: 1.324000 pts: 1.324000 pos: 234283 size: 4096
ret: 0 st:-1 flags:1 ts: 0.200839
ret: 0 st: 0 flags:1 dts: 0.186000 pts: 0.186000 pos: 33236 size: 4096
ret: 0 st: 0 flags:0 ts:-0.905000
ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 412 size: 4096
ret: 0 st: 0 flags:1 ts: 1.989000
ret: 0 st: 0 flags:1 dts: 1.974000 pts: 1.974000 pos: 349167 size: 4096
ret: 0 st:-1 flags:0 ts: 0.883340
ret: 0 st: 0 flags:1 dts: 0.906000 pts: 0.906000 pos: 160429 size: 4096
ret: 0 st:-1 flags:1 ts:-0.222493
ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 412 size: 4096
ret: 0 st: 0 flags:0 ts: 2.672000
ret: 0 st: 0 flags:1 dts: 2.694000 pts: 2.694000 pos: 476360 size: 4096
ret: 0 st: 0 flags:1 ts: 1.566000
ret: 0 st: 0 flags:1 dts: 1.556000 pts: 1.556000 pos: 275313 size: 4096
ret: 0 st:-1 flags:0 ts: 0.460008
ret: 0 st: 0 flags:1 dts: 0.464000 pts: 0.464000 pos: 82472 size: 4096
ret: 0 st:-1 flags:1 ts:-0.645825
ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 412 size: 4096
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment