On Wed, Oct 03, 2012 at 07:37:29AM -0700, Ronald S. Bultje wrote:
> On Wed, Oct 3, 2012 at 4:02 AM, Diego Biurrun <di...@biurrun.de> wrote:
> > On Tue, Oct 02, 2012 at 05:48:26PM -0700, Ronald S. Bultje wrote:
> >> 2) a lot of ff_ symbols, and dsputil_init, are accessed from outside
> >> the library in which they exist. These are bugs and should be fixed (i.e.
> >> renamed).
> >
> > You seem to be working on the wrong tree.
> 
> This is Chrome's tree.

I suggest fixing our tree first and forward-porting it to Chrome's tree
afterwards; should be much quicker this way.

> >> --- a/configure
> >> +++ b/configure
> >> @@ -2616,7 +2616,7 @@ probe_cc(){
> >>          _flags_filter=msvc_flags
> >> -        _ld_lib='lib%.a'
> >> +        _ld_lib='%.lib'
> >>          _ld_path='-libpath:'
> >
> > Do static libs still work as expected?
> 
> Will test.
> 
> >> @@ -3078,11 +3078,13 @@ case $target_os in
> >>          shlibdir_default="$bindir_default"
> >>          SLIBPREF=""
> >>          SLIBSUF=".dll"
> >> +             LIBPREF=""
> >> +             LIBSUF=".lib"
> >
> > How does this affect normal gcc MinGW builds?
> 
> Haven't tested yet. It probably breaks it right now, I'll unbreak that later.

I don't mind RFC patches, but please mark them as such.

> >> --- a/libavcodec/golomb.h
> >> +++ b/libavcodec/golomb.h
> >> @@ -33,13 +33,14 @@
> >>
> >> -extern const uint8_t ff_golomb_vlc_len[512];
> >> -extern const uint8_t ff_ue_golomb_vlc_code[512];
> >> -extern const  int8_t ff_se_golomb_vlc_code[512];
> >> -extern const uint8_t ff_ue_golomb_len[256];
> >> +extern AVCODEC_SYMBOL const uint8_t ff_golomb_vlc_len[512];
> >> +extern AVCODEC_SYMBOL const uint8_t ff_ue_golomb_vlc_code[512];
> >> +extern AVCODEC_SYMBOL const  int8_t ff_se_golomb_vlc_code[512];
> >> +extern AVCODEC_SYMBOL const uint8_t ff_ue_golomb_len[256];
> >
> > I somehow doubt marking ff_-prefixed symbols is necessary.
> >
> >> --- a/libavcodec/raw.h
> >> +++ b/libavcodec/raw.h
> >> @@ -28,13 +28,14 @@
> >>
> >> -extern const PixelFormatTag ff_raw_pix_fmt_tags[];
> >> +extern AVCODEC_SYMBOL const PixelFormatTag ff_raw_pix_fmt_tags[];
> >
> > same
> 
> So, yes, but, these are used between libraries. E.g.
> ff_raw_pix_fmt_tags is used in libavformat:
> dhcp-172-31-81-183:ffmpeg rbultje$ grep ff_raw_pix_fmt_tags libavformat/*.c
> libavformat/utils.c:
> if(ff_find_pix_fmt(ff_raw_pix_fmt_tags, tag) == st->codec->pix_fmt)

No:

$ git grep -l ff_raw_pix_fmt_tags
libavcodec/raw.c
libavcodec/raw.h
libavcodec/rawdec.c

> and the golomb symbols are used by the golomb fate test. Maybe we can
> link in a bunch of other .c files from libavcodec instead of linking
> to avcodec.dll instead (I agree that it's ugly). Note that gcc/mingw
> shared lib build (see symbol list in libavcodec.v) also exports those
> symbols.

No:

biurrun@passion:/opt/biurrun/libav $ git grep ff_.e_golomb_
libavcodec/golomb.c:const uint8_t ff_ue_golomb_vlc_code[512]={
libavcodec/golomb.c:const int8_t ff_se_golomb_vlc_code[512]={
libavcodec/golomb.c:const uint8_t ff_ue_golomb_len[256]={
libavcodec/golomb.h:extern const uint8_t ff_ue_golomb_vlc_code[512];
libavcodec/golomb.h:extern const  int8_t ff_se_golomb_vlc_code[512];
libavcodec/golomb.h:extern const uint8_t ff_ue_golomb_len[256];
libavcodec/golomb.h:        return ff_ue_golomb_vlc_code[buf];
libavcodec/golomb.h:    return ff_ue_golomb_vlc_code[buf];
libavcodec/golomb.h:        return ff_se_golomb_vlc_code[buf];
libavcodec/golomb.h:        put_bits(pb, ff_ue_golomb_len[i], i+1);
biurrun@passion:/opt/biurrun/libav $ git grep ff_golomb_vlc
libavcodec/golomb.c:const uint8_t ff_golomb_vlc_len[512]={
libavcodec/golomb.h:extern const uint8_t ff_golomb_vlc_len[512];
libavcodec/golomb.h:        LAST_SKIP_BITS(re, gb, ff_golomb_vlc_len[buf]);
libavcodec/golomb.h:    LAST_SKIP_BITS(re, gb, ff_golomb_vlc_len[buf]);
libavcodec/golomb.h:        LAST_SKIP_BITS(re, gb, ff_golomb_vlc_len[buf]);

> >> +#ifndef AVCODEC_SYMBOLS_H
> >> +#define AVCODEC_SYMBOLS_H
> >> +
> >> +#include "libavutil/avconfig.h"
> >> +
> >> +#if AV_HAVE_SHARED_LIBS && defined(_MSC_VER) && 
> >> !defined(COMPILING_avcodec)
> >
> > What's AV_HAVE_SHARED_LIBS?  I'm not aware of it anywhere.
> > What do you need avconfig.h for?
> 
> These AVCODEC_SYMBOL things will be used in public headers, thus the
> definition needs t exist in a public header. Since I need to use
> __declspec(dllimport) only for .dll (shared) builds, not for .lib
> (static) builds, I need to know in a public header whether I'm a
> shared lib or not - hence AV_HAVE_SHARED_LIBS (I added that to
> configure, based on CONFIG_SHARED).

The configure change you speak about is missing then; nothing adds
that define to avconfig.h ...

> >> +#ifndef AVUTIL_SYMBOLS_H
> >> +#define AVUTIL_SYMBOLS_H
> >> +
> >> +#include "libavutil/avconfig.h"
> >
> > No need for the "libavutil/" prefix, it's the same directory.
> 
> It's generated, i.e. it lives in the build dir, not in the source dir,
> so if you don't have the libavutil prefix, it won't build, since the
> header isn't in the same dir (sourcedir vs. builddir) as the file that
> included it. See other files including specifically avconfig.h, they
> all use the libavutil/ prefix.

Yes, right, I forgot it is a generated header.

> >> --- a/library.mak
> >> +++ b/library.mak
> >> @@ -94,7 +95,7 @@ endef
> >>
> >> -$(EXAMPLES) $(TESTPROGS) $(TOOLS): $(THIS_LIB) $(DEP_LIBS)
> >> +#$(EXAMPLES) $(TESTPROGS) $(TOOLS): $(THIS_LIB) $(DEP_LIBS)
> >>  $(TESTPROGS): $(SUBDIR)$(LIBNAME)
> >
> > stray change
> 
> No, that's fully intentional, although it should be removed.

Please don't leave cruft behind.

> So, what this does, is that it adds DEP_LIBS (plus unrelated stuff)
> as a dependency to TESTPROGS, i.e. *.dll becomes a dep for e.g.
> dct-test.exe. If you look at the link rule for TESTPROGS, it uses
> $$< to link in all listed dependencies.

No, that rule uses $$^, which has different semantics.

> Now note that you shouldn't link
> against .dll files on Windows, you generate .lib files that contain
> the linker information to link against .dll files (but .lib without
> .dll is a static build, sorry if this is confusing). The .lib files
> are already part of FFEXTRALIBS. So what you end up getting is a
> linker that tries to link against .dll files directly (link
> -libpath:libavcodec -out:dct-test.exe dct-test.o [other object files]
> libavcodec/libavcodec.dll [other dlls] libavcodec.lib [other libs]
> [external lib dependencies]), which doesn't make any sense, and
> obviously fails. This change removes the dependency on the .dll as a
> listed dep, and thus instead it just links like "link
> -libpath:libavcodec -out:dct-test.exe dct-test.o [other object files]
> libavcodec.lib [other libs] [external lib dependencies]", which works
> as expected.

Does it pass "make check"?  I'm suspicious that you may have broken some
test programs - some of them need to directly link against the libs
because they access internal symbols...

Diego
_______________________________________________
libav-devel mailing list
libav-devel@libav.org
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to