* [FFmpeg-devel] [PATCH 1/2] Revert "avcodec/apedec: fix decoding 24bit insane files with recent versions"
@ 2023-08-24 23:21 Michael Niedermayer
2023-08-24 23:21 ` [FFmpeg-devel] [PATCH 2/2] avcodec/apedec: Fix CRC for 24bps and bigendian Michael Niedermayer
2023-08-24 23:37 ` [FFmpeg-devel] [PATCH 1/2] Revert "avcodec/apedec: fix decoding 24bit insane files with recent versions" Paul B Mahol
0 siblings, 2 replies; 7+ messages in thread
From: Michael Niedermayer @ 2023-08-24 23:21 UTC (permalink / raw)
To: FFmpeg development discussions and patches
Fixes: Ticket9816
This reverts commit ed0001482a74b60f3d5bc5cd7e304c9d65b2fcd5.
---
libavcodec/apedec.c | 59 ++++++++++-----------------------------------
1 file changed, 13 insertions(+), 46 deletions(-)
diff --git a/libavcodec/apedec.c b/libavcodec/apedec.c
index 613c76df0b..cc0d7e2749 100644
--- a/libavcodec/apedec.c
+++ b/libavcodec/apedec.c
@@ -134,21 +134,6 @@ typedef struct APEPredictor {
unsigned int sample_pos;
} APEPredictor;
-typedef struct APEPredictor64 {
- int64_t *buf;
-
- int64_t lastA[2];
-
- int64_t filterA[2];
- int64_t filterB[2];
-
- uint64_t coeffsA[2][4]; ///< adaption coefficients
- uint64_t coeffsB[2][5]; ///< adaption coefficients
- int64_t historybuffer[HISTORY_SIZE + PREDICTOR_SIZE];
-
- unsigned int sample_pos;
-} APEPredictor64;
-
/** Decoder context */
typedef struct APEContext {
AVClass *class; ///< class for AVOptions
@@ -168,7 +153,6 @@ typedef struct APEContext {
uint32_t CRC_state; ///< accumulated CRC
int frameflags; ///< frame flags
APEPredictor predictor; ///< predictor used for final reconstruction
- APEPredictor64 predictor64; ///< 64bit predictor used for final reconstruction
int32_t *decoded_buffer;
int decoded_size;
@@ -808,20 +792,13 @@ static const int32_t initial_coeffs_3930[4] = {
360, 317, -109, 98
};
-static const int64_t initial_coeffs_3930_64bit[4] = {
- 360, 317, -109, 98
-};
-
static void init_predictor_decoder(APEContext *ctx)
{
APEPredictor *p = &ctx->predictor;
- APEPredictor64 *p64 = &ctx->predictor64;
/* Zero the history buffers */
memset(p->historybuffer, 0, PREDICTOR_SIZE * sizeof(*p->historybuffer));
- memset(p64->historybuffer, 0, PREDICTOR_SIZE * sizeof(*p64->historybuffer));
p->buf = p->historybuffer;
- p64->buf = p64->historybuffer;
/* Initialize and zero the coefficients */
if (ctx->fileversion < 3930) {
@@ -839,11 +816,8 @@ static void init_predictor_decoder(APEContext *ctx)
} else {
memcpy(p->coeffsA[0], initial_coeffs_3930, sizeof(initial_coeffs_3930));
memcpy(p->coeffsA[1], initial_coeffs_3930, sizeof(initial_coeffs_3930));
- memcpy(p64->coeffsA[0], initial_coeffs_3930_64bit, sizeof(initial_coeffs_3930_64bit));
- memcpy(p64->coeffsA[1], initial_coeffs_3930_64bit, sizeof(initial_coeffs_3930_64bit));
}
memset(p->coeffsB, 0, sizeof(p->coeffsB));
- memset(p64->coeffsB, 0, sizeof(p64->coeffsB));
if (ctx->fileversion < 3930) {
memcpy(p->coeffsB[0], initial_coeffs_b_3800,
sizeof(initial_coeffs_b_3800));
@@ -855,13 +829,7 @@ static void init_predictor_decoder(APEContext *ctx)
p->filterB[0] = p->filterB[1] = 0;
p->lastA[0] = p->lastA[1] = 0;
- p64->filterA[0] = p64->filterA[1] = 0;
- p64->filterB[0] = p64->filterB[1] = 0;
- p64->lastA[0] = p64->lastA[1] = 0;
-
p->sample_pos = 0;
-
- p64->sample_pos = 0;
}
/** Get inverse sign of integer (-1 for positive, 1 for negative and 0 for zero) */
@@ -1181,17 +1149,16 @@ static void predictor_decode_mono_3930(APEContext *ctx, int count)
}
}
-static av_always_inline int predictor_update_filter(APEPredictor64 *p,
+static av_always_inline int predictor_update_filter(APEPredictor *p,
const int decoded, const int filter,
const int delayA, const int delayB,
const int adaptA, const int adaptB)
{
- int64_t predictionA, predictionB;
- int32_t sign;
+ int32_t predictionA, predictionB, sign;
p->buf[delayA] = p->lastA[filter];
p->buf[adaptA] = APESIGN(p->buf[delayA]);
- p->buf[delayA - 1] = p->buf[delayA] - (uint64_t)p->buf[delayA - 1];
+ p->buf[delayA - 1] = p->buf[delayA] - (unsigned)p->buf[delayA - 1];
p->buf[adaptA - 1] = APESIGN(p->buf[delayA - 1]);
predictionA = p->buf[delayA ] * p->coeffsA[filter][0] +
@@ -1200,9 +1167,9 @@ static av_always_inline int predictor_update_filter(APEPredictor64 *p,
p->buf[delayA - 3] * p->coeffsA[filter][3];
/* Apply a scaled first-order filter compression */
- p->buf[delayB] = p->filterA[filter ^ 1] - ((int64_t)(p->filterB[filter] * 31ULL) >> 5);
+ p->buf[delayB] = p->filterA[filter ^ 1] - ((int)(p->filterB[filter] * 31U) >> 5);
p->buf[adaptB] = APESIGN(p->buf[delayB]);
- p->buf[delayB - 1] = p->buf[delayB] - (uint64_t)p->buf[delayB - 1];
+ p->buf[delayB - 1] = p->buf[delayB] - (unsigned)p->buf[delayB - 1];
p->buf[adaptB - 1] = APESIGN(p->buf[delayB - 1]);
p->filterB[filter] = p->filterA[filter ^ 1];
@@ -1212,8 +1179,8 @@ static av_always_inline int predictor_update_filter(APEPredictor64 *p,
p->buf[delayB - 3] * p->coeffsB[filter][3] +
p->buf[delayB - 4] * p->coeffsB[filter][4];
- p->lastA[filter] = decoded + ((int64_t)((uint64_t)predictionA + (predictionB >> 1)) >> 10);
- p->filterA[filter] = p->lastA[filter] + ((int64_t)(p->filterA[filter] * 31ULL) >> 5);
+ p->lastA[filter] = decoded + ((int)((unsigned)predictionA + (predictionB >> 1)) >> 10);
+ p->filterA[filter] = p->lastA[filter] + ((int)(p->filterA[filter] * 31U) >> 5);
sign = APESIGN(decoded);
p->coeffsA[filter][0] += p->buf[adaptA ] * sign;
@@ -1231,7 +1198,7 @@ static av_always_inline int predictor_update_filter(APEPredictor64 *p,
static void predictor_decode_stereo_3950(APEContext *ctx, int count)
{
- APEPredictor64 *p = &ctx->predictor64;
+ APEPredictor *p = &ctx->predictor;
int32_t *decoded0 = ctx->decoded[0];
int32_t *decoded1 = ctx->decoded[1];
@@ -1260,7 +1227,7 @@ static void predictor_decode_stereo_3950(APEContext *ctx, int count)
static void predictor_decode_mono_3950(APEContext *ctx, int count)
{
- APEPredictor64 *p = &ctx->predictor64;
+ APEPredictor *p = &ctx->predictor;
int32_t *decoded0 = ctx->decoded[0];
int32_t predictionA, currentA, A, sign;
@@ -1272,14 +1239,14 @@ static void predictor_decode_mono_3950(APEContext *ctx, int count)
A = *decoded0;
p->buf[YDELAYA] = currentA;
- p->buf[YDELAYA - 1] = p->buf[YDELAYA] - (uint64_t)p->buf[YDELAYA - 1];
+ p->buf[YDELAYA - 1] = p->buf[YDELAYA] - (unsigned)p->buf[YDELAYA - 1];
predictionA = p->buf[YDELAYA ] * p->coeffsA[0][0] +
p->buf[YDELAYA - 1] * p->coeffsA[0][1] +
p->buf[YDELAYA - 2] * p->coeffsA[0][2] +
p->buf[YDELAYA - 3] * p->coeffsA[0][3];
- currentA = A + (uint64_t)(predictionA >> 10);
+ currentA = A + (unsigned)(predictionA >> 10);
p->buf[YADAPTCOEFFSA] = APESIGN(p->buf[YDELAYA ]);
p->buf[YADAPTCOEFFSA - 1] = APESIGN(p->buf[YDELAYA - 1]);
@@ -1299,7 +1266,7 @@ static void predictor_decode_mono_3950(APEContext *ctx, int count)
p->buf = p->historybuffer;
}
- p->filterA[0] = currentA + (uint64_t)((int64_t)(p->filterA[0] * 31U) >> 5);
+ p->filterA[0] = currentA + (unsigned)((int)(p->filterA[0] * 31U) >> 5);
*(decoded0++) = p->filterA[0];
}
@@ -1336,7 +1303,7 @@ static void do_apply_filter(APEContext *ctx, int version, APEFilter *f,
f->delay - order,
f->adaptcoeffs - order,
order, APESIGN(*data));
- res = (int64_t)(res + (1LL << (fracbits - 1))) >> fracbits;
+ res = (int)(res + (1U << (fracbits - 1))) >> fracbits;
res += (unsigned)*data;
*data++ = res;
--
2.17.1
_______________________________________________
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".
^ permalink raw reply [flat|nested] 7+ messages in thread
* [FFmpeg-devel] [PATCH 2/2] avcodec/apedec: Fix CRC for 24bps and bigendian
2023-08-24 23:21 [FFmpeg-devel] [PATCH 1/2] Revert "avcodec/apedec: fix decoding 24bit insane files with recent versions" Michael Niedermayer
@ 2023-08-24 23:21 ` Michael Niedermayer
2023-08-24 23:37 ` [FFmpeg-devel] [PATCH 1/2] Revert "avcodec/apedec: fix decoding 24bit insane files with recent versions" Paul B Mahol
1 sibling, 0 replies; 7+ messages in thread
From: Michael Niedermayer @ 2023-08-24 23:21 UTC (permalink / raw)
To: FFmpeg development discussions and patches
Fixes CRC for vlc.ape and APE_48K_24bit_2CH_02_01.ape
Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
---
libavcodec/apedec.c | 17 ++++++++++++++---
1 file changed, 14 insertions(+), 3 deletions(-)
diff --git a/libavcodec/apedec.c b/libavcodec/apedec.c
index cc0d7e2749..d48d3a676d 100644
--- a/libavcodec/apedec.c
+++ b/libavcodec/apedec.c
@@ -1592,13 +1592,24 @@ static int ape_decode_frame(AVCodecContext *avctx, AVFrame *frame,
s->samples -= blockstodecode;
if (avctx->err_recognition & AV_EF_CRCCHECK &&
- s->fileversion >= 3900 && s->bps < 24) {
+ s->fileversion >= 3900) {
uint32_t crc = s->CRC_state;
const AVCRC *crc_tab = av_crc_get_table(AV_CRC_32_IEEE_LE);
+ int stride = s->bps == 24 ? 4 : (s->bps>>3);
+ int offset = s->bps == 24;
+ int bytes = s->bps >> 3;
+
for (i = 0; i < blockstodecode; i++) {
for (ch = 0; ch < s->channels; ch++) {
- uint8_t *smp = frame->data[ch] + (i*(s->bps >> 3));
- crc = av_crc(crc_tab, crc, smp, s->bps >> 3);
+#if HAVE_BIGENDIAN
+ uint8_t *smp_native = frame->data[ch] + i*stride;
+ uint8_t smp[4];
+ for(int j = 0; j<stride; j++)
+ smp[j] = smp_native[stride-j-1];
+#else
+ uint8_t *smp = frame->data[ch] + i*stride;
+#endif
+ crc = av_crc(crc_tab, crc, smp+offset, bytes);
}
}
--
2.17.1
_______________________________________________
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".
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [FFmpeg-devel] [PATCH 1/2] Revert "avcodec/apedec: fix decoding 24bit insane files with recent versions"
2023-08-24 23:21 [FFmpeg-devel] [PATCH 1/2] Revert "avcodec/apedec: fix decoding 24bit insane files with recent versions" Michael Niedermayer
2023-08-24 23:21 ` [FFmpeg-devel] [PATCH 2/2] avcodec/apedec: Fix CRC for 24bps and bigendian Michael Niedermayer
@ 2023-08-24 23:37 ` Paul B Mahol
2023-08-25 0:01 ` Michael Niedermayer
1 sibling, 1 reply; 7+ messages in thread
From: Paul B Mahol @ 2023-08-24 23:37 UTC (permalink / raw)
To: FFmpeg development discussions and patches
NAK
Breaks decoding of another sample.
_______________________________________________
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".
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [FFmpeg-devel] [PATCH 1/2] Revert "avcodec/apedec: fix decoding 24bit insane files with recent versions"
2023-08-24 23:37 ` [FFmpeg-devel] [PATCH 1/2] Revert "avcodec/apedec: fix decoding 24bit insane files with recent versions" Paul B Mahol
@ 2023-08-25 0:01 ` Michael Niedermayer
2023-08-25 9:08 ` Paul B Mahol
0 siblings, 1 reply; 7+ messages in thread
From: Michael Niedermayer @ 2023-08-25 0:01 UTC (permalink / raw)
To: FFmpeg development discussions and patches
[-- Attachment #1.1: Type: text/plain, Size: 654 bytes --]
On Fri, Aug 25, 2023 at 01:37:27AM +0200, Paul B Mahol wrote:
> NAK
>
> Breaks decoding of another sample.
please provide the sample
if noone provides a sample, i will disregard this objection.
Also as a sidenote, iam in contact with Matt Ashland and he also
doesnt know what your commit was trying to fix
thx
[...]
--
Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB
If the United States is serious about tackling the national security threats
related to an insecure 5G network, it needs to rethink the extent to which it
values corporate profits and government espionage over security.-Bruce Schneier
[-- Attachment #1.2: signature.asc --]
[-- Type: application/pgp-signature, Size: 195 bytes --]
[-- Attachment #2: Type: text/plain, Size: 251 bytes --]
_______________________________________________
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".
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [FFmpeg-devel] [PATCH 1/2] Revert "avcodec/apedec: fix decoding 24bit insane files with recent versions"
2023-08-25 0:01 ` Michael Niedermayer
@ 2023-08-25 9:08 ` Paul B Mahol
2023-08-25 14:20 ` Michael Niedermayer
0 siblings, 1 reply; 7+ messages in thread
From: Paul B Mahol @ 2023-08-25 9:08 UTC (permalink / raw)
To: FFmpeg development discussions and patches
On Fri, Aug 25, 2023 at 2:01 AM Michael Niedermayer <michael@niedermayer.cc>
wrote:
> On Fri, Aug 25, 2023 at 01:37:27AM +0200, Paul B Mahol wrote:
> > NAK
> >
> > Breaks decoding of another sample.
>
> please provide the sample
>
> if noone provides a sample, i will disregard this objection.
> Also as a sidenote, iam in contact with Matt Ashland and he also
> doesnt know what your commit was trying to fix
>
What to say, monkey see - monkey do.
Just wasted too much time on running latest MAC converter software in
virtualbox to confirm
you break this ticket bellow with your patch set.
https://trac.ffmpeg.org/ticket/8918
My patience is lowering by each new day and each new patch(es) from you.
>
> thx
>
> [...]
> --
> Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB
>
> If the United States is serious about tackling the national security
> threats
> related to an insecure 5G network, it needs to rethink the extent to which
> it
> values corporate profits and government espionage over security.-Bruce
> Schneier
> _______________________________________________
> 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".
>
_______________________________________________
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".
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [FFmpeg-devel] [PATCH 1/2] Revert "avcodec/apedec: fix decoding 24bit insane files with recent versions"
2023-08-25 9:08 ` Paul B Mahol
@ 2023-08-25 14:20 ` Michael Niedermayer
2023-08-25 14:42 ` Paul B Mahol
0 siblings, 1 reply; 7+ messages in thread
From: Michael Niedermayer @ 2023-08-25 14:20 UTC (permalink / raw)
To: FFmpeg development discussions and patches
[-- Attachment #1.1: Type: text/plain, Size: 1191 bytes --]
On Fri, Aug 25, 2023 at 11:08:55AM +0200, Paul B Mahol wrote:
> On Fri, Aug 25, 2023 at 2:01 AM Michael Niedermayer <michael@niedermayer.cc>
> wrote:
>
> > On Fri, Aug 25, 2023 at 01:37:27AM +0200, Paul B Mahol wrote:
> > > NAK
> > >
> > > Breaks decoding of another sample.
> >
> > please provide the sample
> >
> > if noone provides a sample, i will disregard this objection.
> > Also as a sidenote, iam in contact with Matt Ashland and he also
> > doesnt know what your commit was trying to fix
> >
>
> What to say, monkey see - monkey do.
>
> Just wasted too much time on running latest MAC converter software in
> virtualbox to confirm
> you break this ticket bellow with your patch set.
you dont need virtualbox to run ffmpeg to test the samples
if you used virtualbox to generate more samples, please share them so
i can make sure there are no regressions on changes
>
> https://trac.ffmpeg.org/ticket/8918
thanks for the testcase, i will make sure my next pachset will not break that
[...]
--
Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB
What does censorship reveal? It reveals fear. -- Julian Assange
[-- Attachment #1.2: signature.asc --]
[-- Type: application/pgp-signature, Size: 195 bytes --]
[-- Attachment #2: Type: text/plain, Size: 251 bytes --]
_______________________________________________
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".
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [FFmpeg-devel] [PATCH 1/2] Revert "avcodec/apedec: fix decoding 24bit insane files with recent versions"
2023-08-25 14:20 ` Michael Niedermayer
@ 2023-08-25 14:42 ` Paul B Mahol
0 siblings, 0 replies; 7+ messages in thread
From: Paul B Mahol @ 2023-08-25 14:42 UTC (permalink / raw)
To: FFmpeg development discussions and patches
On Fri, Aug 25, 2023 at 4:21 PM Michael Niedermayer <michael@niedermayer.cc>
wrote:
> On Fri, Aug 25, 2023 at 11:08:55AM +0200, Paul B Mahol wrote:
> > On Fri, Aug 25, 2023 at 2:01 AM Michael Niedermayer <
> michael@niedermayer.cc>
> > wrote:
> >
> > > On Fri, Aug 25, 2023 at 01:37:27AM +0200, Paul B Mahol wrote:
> > > > NAK
> > > >
> > > > Breaks decoding of another sample.
> > >
> > > please provide the sample
> > >
> > > if noone provides a sample, i will disregard this objection.
> > > Also as a sidenote, iam in contact with Matt Ashland and he also
> > > doesnt know what your commit was trying to fix
> > >
> >
> > What to say, monkey see - monkey do.
> >
>
> > Just wasted too much time on running latest MAC converter software in
> > virtualbox to confirm
> > you break this ticket bellow with your patch set.
>
> you dont need virtualbox to run ffmpeg to test the samples
> if you used virtualbox to generate more samples, please share them so
> i can make sure there are no regressions on changes
>
>
MAC is reference Monkey's APEs encoder/decoder Windows only utility.
Just make sure that its not also MAC regression somehow...
> >
> > https://trac.ffmpeg.org/ticket/8918
>
> thanks for the testcase, i will make sure my next pachset will not break
> that
>
>
> [...]
> --
> Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB
>
> What does censorship reveal? It reveals fear. -- Julian Assange
> _______________________________________________
> 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".
>
_______________________________________________
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".
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2023-08-25 14:35 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-08-24 23:21 [FFmpeg-devel] [PATCH 1/2] Revert "avcodec/apedec: fix decoding 24bit insane files with recent versions" Michael Niedermayer
2023-08-24 23:21 ` [FFmpeg-devel] [PATCH 2/2] avcodec/apedec: Fix CRC for 24bps and bigendian Michael Niedermayer
2023-08-24 23:37 ` [FFmpeg-devel] [PATCH 1/2] Revert "avcodec/apedec: fix decoding 24bit insane files with recent versions" Paul B Mahol
2023-08-25 0:01 ` Michael Niedermayer
2023-08-25 9:08 ` Paul B Mahol
2023-08-25 14:20 ` Michael Niedermayer
2023-08-25 14:42 ` Paul B Mahol
Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
This inbox may be cloned and mirrored by anyone:
git clone --mirror https://master.gitmailbox.com/ffmpegdev/0 ffmpegdev/git/0.git
# If you have public-inbox 1.1+ installed, you may
# initialize and index your mirror using the following commands:
public-inbox-init -V2 ffmpegdev ffmpegdev/ https://master.gitmailbox.com/ffmpegdev \
ffmpegdev@gitmailbox.com
public-inbox-index ffmpegdev
Example config snippet for mirrors.
AGPL code for this site: git clone https://public-inbox.org/public-inbox.git