Multiple endpoints using CXF and Spring Boot

I recently ran into a problem while porting a couple of old SOAP services that currently run on JBoss into a Spring Boot application. As a start https://blog.codecentric.de/en/2016/02/spring-boot-apache-cxf/  provided a good introduction on how use CXF and Spring Boot, but the example only shows one endpoint.

For some reason I couldn’t find any good resources on how to create two independent endpoints using CXF and Spring Boot so I’m writing it down in case somebody else stumbles into the same problem.

The solution is quite simple: In order to get multiple independent endpoints it is important to create one SpringBus and ServletRegistrationBean for each base URL.

As an example, say you want to have two versions of an API:

/api/v1/orders/get
/api/v1/orders/create
/api/v2/orders/get
/api/v2/orders/create

Using Spring Boot we can define the two following configuration classes.

@Configuration
public class SomeApiV1Config {

    @Bean
    public SpringBus springBusV1() {
        SpringBus bus = new SpringBus();
        bus.setId("v1");
        return bus;
    }

    @Bean
    public ServletRegistrationBean v1Servlet() {
        CXFServlet cxfServlet = new CXFServlet();
        cxfServlet.setBus(springBusV1());

        ServletRegistrationBean servletBean = new ServletRegistrationBean(cxfServlet, "/api/v1/*");
        servletBean.setName("v1");
        return servletBean;
    }

    @Bean
    public EndpointImpl getOrderV1(GetOrderServiceV1 service) {
        EndpointImpl endpoint = new EndpointImpl(springBusV1(), service);
        endpoint.publish("/orders/get");
        return endpoint;
    }

    @Bean
    public EndpointImpl createOrderV1(CreateOrderServiceV1 service) {
        EndpointImpl endpoint = new EndpointImpl(springBusV1(), service);
        endpoint.publish("/orders/create");
        return endpoint;
    }
}
@Configuration
public class SomeApiV2Config {

    @Bean
    public SpringBus springBusV2() {
        SpringBus bus = new SpringBus();
        bus.setId("v2");
        return bus;
    }

    @Bean
    public ServletRegistrationBean v2Servlet() {
        CXFServlet cxfServlet = new CXFServlet();
        cxfServlet.setBus(springBusV2());

        ServletRegistrationBean servletBean = new ServletRegistrationBean(cxfServlet, "/api/v2/*");
        servletBean.setName("v2");
        return servletBean;
    }

    @Bean
    public EndpointImpl getOrderV2(GetOrderServiceV2 service) {
        EndpointImpl endpoint = new EndpointImpl(springBusV2(), service);
        endpoint.publish("/orders/get");
        return endpoint;
    }

    @Bean
    public EndpointImpl createOrderV2(CreateOrderServiceV2 service) {
        EndpointImpl endpoint = new EndpointImpl(springBusV2(), service);
        endpoint.publish("/orders/create");
        return endpoint;
    }

}

Tuning the Logstash multiline filter

I’m currently working on a project were we are using Apache Mesos and Marathon as our platform to run and provision our applications. We use the ELK stack to receive, store and analyze our logs. On each of the nodes in the cluster we have Filebeat (the successor of Logstash) installed which sends the logs to Logstash.

At first everything looked fine; all our tasks log showed up in Kibana. However as we added more and more applications to the cluster we started seeing a problem were log from one task would show up on the same event as another task in Kibana.

At first we suspected problems with how we had configured the Filebeat prospector path which contained multiple wildcards:

/tmp/mesos/slaves/*/frameworks/*/executors/*/runs/latest/stdout

The source field contained multiple paths, indicating that this message came from two different tasks. A log message should never have more than one path, so how could this be?

It turned out that the problem was being caused by the multiline filter we were using to collapse multiline message into one Logstash event.

Looking through the documentation of the multiline filter we found the stream_identity setting which determines which stream an event belongs to. By default the stream identity is configured to be %{host}.%{path}.%{type}, but for some reason this was not enough in our case. After appending %{source} to the stream identity the problem disappeared. This is what we added to our multiline filter:

 stream_identity => "%{host}.%{path}.%{type}.%{source}"

With that fixed we now noticed a different problem. Some messages were sometimes being tagged with  _grokparsefailure, indicating that the log parsing failed. Looking closer this happened when the log message contained long output like the stack traces from Java exceptions. The start of a message would be parsed correctly with timestamp and everything, but the message would be cut off. The following message would not contain a timestamp and would continue where the previous stopped.

This seemed strange as the job of the multiline filter is exactly this. It should collapse message into one message as long as it does not match the specified pattern, in our case wait until it matches a timestamp indicating a new message.

More reading of the documentation revealed that there is a periodic_flush setting which by default is true. That is, the multiline filter will periodically flush based on the max_age setting which by default is 5 seconds. Our theory is that due to processing delay and load on the ELK server we hit this timeout causing our messages to split.

By increasing the max_age to 60 seconds the problem seems to have disappeared.

max_age => 60

Being a time based setting this isn’t boom proof as the results will strongly vary based on the load of the server, but for now it seems to do the trick. Another option would be to disable periodic flush, but this means potentially needing to wait very long for messages from tasks that don’t log that often.

The problems mentioned in this post are some of the things being adressed by the new multiline-codec which aims to be the successor of the now deprecated multiline filter. Unfortunately changing from the filter to to the codec is not trivial in all cases, but I’ll leave that for another post.

C++ to Java: Value semantics

About a year ago I changed jobs. I went from writing modern C++11 on an embedded Linux platform to work as a consultant where to primary language is Java. I though it might be interesting to write about how this transitions has been, the differences between C++ and Java and what I miss and don’t miss.

I plan to make it a series titled “C++ to Java” and will assume the reader to have some knowledge about both C++ and Java.

In C++, when doing an assignment or calling a function, values are copied by default. This makes it possible to reason about parameters as data and not the specific instance of an object which holds the data. This is known as value semantics.

In Java however, when excluding primitive types like int, char, etc., there are no value types. Every variable or parameter is a reference to object which means we need to be aware of which instance of an object we are working on all the time.

A couple of months before I started in my job I spent some time writing a toy game engine in Java. Part of the code dealt with updating the position of the mouse cursor while moving it around. I had a mouse object which was updated with information like its position, if it were being pressed, dragged etc.

In the code for the game logic I was using this mouse object to implement something like “if mouse was pressed, move to the position were it was pressed”. While testing my code I clicked around on the screen and my objects moved as expected. However, I suddenly realized that my objects were following my cursor regardless of me clicking.

At first I could not understand what was wrong. The code had a clear if statement that only would update the position of the objects if the mouse was being pressed. How could this be? Well, it turns I though I lived in the C++ world where objects are passed as values. Instead of passing the actual position of the mouse as data, I was passing along a reference to the data which was updated each game tick. First lesson in Java: create new instances!

Lets look at some code examples.

Below is some C++ code that shows that when doing an assignment the data is copied by default:

struct Position
{
    int x;
    int y;
};

int main()
{
    Position p1{10, 20};
    Position p2 = p1;
    p2.x = 0;

    // p1: (x=10, y=20)
    // p2: (x= 0, y=20)
}

The Java code is very similar, but acts differently.

public class Position
{
    public int x;
    public int y;

    public Position(int x, int y) {
        this.x = x;
        this.y = y;
    }

    public static void main(String[] args) {
        Position p1 = new Position(10, 20);
        Position p2 = p1;
        p2.x = 0;

        // p1: (x=0, y=20)
        // p2: (x=0, y=20)
    }
};

As shown, in C++, we have an actual copy of the data, we don’t modify p1 by modifying p2 like we do in Java. In C++ references must be declared explicitly using &. The following code is equivalent to the Java code:

int main()
{
    Position p1{10, 20};
    Position& p2 = p1;
    p2.x = 0;

    // p1: (x=0, y=20)
    // p2: (x=0, y=20)
}

This also applies when calling functions. In C++, when taking an object as an argument to a function, the whole object is copied onto the stack. This is called “pass by value”, and the object that is passed in to the function will remain unchanged. Basically the same thing happens here, only that the objects default constructor is called instead of the default assignment operator.

void modify(Position p) {
    // p is a copy and only exist in this stack frame
}

In Java there is a subtle difference in how this works compared to assignmenet of variables. A classic example is the following code:

public void foo(Position p) {
    p = new Position(5,5);
}

Position p1 = new Position(0,0);
foo(p1);
// what is p.x and p.y?

It turns out that p1 is (0,0) which might surprise someone as “in Java everything is references”, but this is not entirely true. In Java references are passed as values which makes p in foo a copy of the reference to p1 that only exists during the stack frame of the function.

For a more in-depth discussion on this topic, see http://javadude.com/articles/passbyvalue.htm.

Undefined symbols for architecture x86_64

I recently upgraded from Mac OS Mavericks to Yosemite and in the process broke GCC. Suddenly all I got when trying to compile with g++ was this error message:

~/dev/tmp$ g++ asdf.cpp
Undefined symbols for architecture x86_64:
"start", referenced from:
implicit entry/start for main executable
ld: symbol(s) not found for architecture x86_64
collect2: error: ld returned 1 exit status

Just to be clear, the code I was trying to compile was nothing fancy:

int main()
{
    return 0;
}

In reality it wasn’t really the compilation that was the problem, but rather the linking. After spending hours on google without finding any similar cases I nearly gave up.

Before the upgrade I had installed GCC with Homebrew, and it was working fine. On my system g++ is symlinked to /usr/local/Cellar/gcc/4.9.2/bin/g++-4.9. I  tried reinstalling GCC, recompile from source and upgrade Xcode, but nothing worked. It was driving me crazy. Then I  discovered the doctor option for Homebrew which gave me a break:

$ brew doctor
[...]
Warning: You have MacPorts or Fink installed:
  /opt/local/bin/port

This can cause trouble. You don't have to uninstall them, but you may want to
temporarily move them out of the way, e.g.

  sudo mv /opt/local ~/macports
[...]

I didn’t ever remember that I had Macports installed, but here it was, potentially causing problems. To uninstall I ran the following command from their website:

sudo port -fp uninstall installed

And what do you know. It turned out that there was another version of GCC installed with macports. After getting rid of that everything suddenly worked as expected!

I don’t know why this suddenly happened after upgrading to Yosemite or why it worked back in Mavericks, but at I can finally compile stuff again. If you encounter the same problem, hopefully this helps you out.

Using ffmpeg with C++

Recently I started on a project that is going to use FFmpeg. On my first attempt to write a minimal compiling code I was hit with a ton of linker errors. Turns out I forgot two things:

  1. FFmpeg is written in C99 and requires C linkage when using C++
  2. Include all needed libraries (z, m, bz2 and avutil)

Here is the minimal example (notice extern "C" { ... } for C linkage):

extern "C" {
#include <libavcodec/avcodec.h>
#include <libavformat/avformat.h>
}

#include <iostream>

int main()
{
    av_register_all();
    std::cout << "It works!" << std::endl;
}

Let’s compile it:

~/dev/tmp$ g++ -Wall ffmpeg.cpp -I/usr/local/include -lz -lm -lbz2 -lavcodec -lavformat -lavutil
~/dev/tmp$ ./a.out
It works!

On my first try I only linked in avcodec and avformat causing this beast to appear:

~/dev/tmp$ g++ -Wall ffmpeg.cpp -I/usr/local/include -lavcodec -lavformat 
Undefined symbols for architecture x86_64:
  "_BZ2_bzDecompress", referenced from:
      _matroska_decode_buffer.isra.4 in libavformat.a(matroskadec.o)
  "_BZ2_bzDecompressEnd", referenced from:
      _matroska_decode_buffer.isra.4 in libavformat.a(matroskadec.o)
  "_BZ2_bzDecompressInit", referenced from:
      _matroska_decode_buffer.isra.4 in libavformat.a(matroskadec.o)
  "_av_adler32_update", referenced from:
      _crc_write_packet in libavformat.a(crcenc.o)
      _framecrc_write_packet in libavformat.a(framecrcenc.o)
  "_av_aes_alloc", referenced from:
      _crypto_open2 in libavformat.a(crypto.o)
      _mxf_read_packet in libavformat.a(mxfdec.o)
      _ff_srtp_set_crypto in libavformat.a(srtp.o)
  "_av_aes_crypt", referenced from:
      _crypto_read in libavformat.a(crypto.o)
      _mxf_read_packet in libavformat.a(mxfdec.o)
      _derive_key in libavformat.a(srtp.o)
      _ff_srtp_decrypt in libavformat.a(srtp.o)
      _ff_srtp_encrypt in libavformat.a(srtp.o)
  "_av_aes_init", referenced from:
      _crypto_open2 in libavformat.a(crypto.o)
      _mxf_read_packet in libavformat.a(mxfdec.o)
      _ff_srtp_set_crypto in libavformat.a(srtp.o)
      _ff_srtp_decrypt in libavformat.a(srtp.o)
      _ff_srtp_encrypt in libavformat.a(srtp.o)
  "_av_asprintf", referenced from:
      _ff_ass_subtitle_header in libavcodec.a(ass.o)
      _ff_ass_subtitle_header_default in libavcodec.a(ass.o)
  "_av_base64_decode", referenced from:
      _rdt_parse_sdp_line in libavformat.a(rdt.o)
      _data_open in libavformat.a(data_uri.o)
      _sdp_parse_fmtp_config_h264 in libavformat.a(rtpdec_h264.o)
      _ff_wms_parse_sdp_a_line in libavformat.a(rtpdec_asf.o)
      _ff_srtp_set_crypto in libavformat.a(srtp.o)
      _xiph_parse_fmtp_pair in libavformat.a(rtpdec_xiph.o)
  "_av_base64_encode", referenced from:
      _matroska_read_header in libavformat.a(matroskadec.o)
      _handle_invoke_error.isra.11 in libavformat.a(rtmpproto.o)
      _ff_rtsp_send_cmd_with_content_async in libavformat.a(rtsp.o)
      _ff_rtsp_read_reply in libavformat.a(rtsp.o)
      _xiph_extradata2config in libavformat.a(sdp.o)
      _sdp_write_media_attributes in libavformat.a(sdp.o)
      _ff_http_auth_create_response in libavformat.a(httpauth.o)
      ...
  "_av_basename", referenced from:
      _hls_write_packet in libavformat.a(hlsenc.o)
      _hls_write_trailer in libavformat.a(hlsenc.o)
  "_av_bprint_chars", referenced from:
      _ass_read_header in libavformat.a(assdec.o)
      _parse_string in libavformat.a(tedcaptionsdec.o)
      _microdvd_decode_frame in libavcodec.a(microdvddec.o)
      _mov_text_decode_frame in libavcodec.a(movtextdec.o)
      _mpl2_decode_frame in libavcodec.a(mpl2dec.o)
      _text_decode_frame in libavcodec.a(textdec.o)
      _realtext_decode_frame in libavcodec.a(realtextdec.o)
      ...
  "_av_bprint_clear", referenced from:
      _ass_read_header in libavformat.a(assdec.o)
      _realtext_read_header in libavformat.a(realtextdec.o)
      _sami_read_header in libavformat.a(samidec.o)
      _microdvd_init in libavcodec.a(microdvddec.o)
      _sami_decode_frame in libavcodec.a(samidec.o)
      _ff_subtitles_read_chunk in libavformat.a(subtitles.o)
  "_av_bprint_finalize", referenced from:
      _ass_read_header in libavformat.a(assdec.o)
      _vobsub_read_header in libavformat.a(mpeg.o)
      _mpsub_read_header in libavformat.a(mpsubdec.o)
      _realtext_read_header in libavformat.a(realtextdec.o)
      _sami_read_header in libavformat.a(samidec.o)
      _srt_read_header in libavformat.a(srtdec.o)
      _subviewer_read_header in libavformat.a(subviewerdec.o)
      ...
  "_av_bprint_get_buffer", referenced from:
      _decode_text_chunk.isra.4 in libavcodec.a(pngdec.o)
  "_av_bprint_init", referenced from:
      _ass_read_header in libavformat.a(assdec.o)
      _jacosub_read_header in libavformat.a(jacosubdec.o)
      _vobsub_read_header in libavformat.a(mpeg.o)
      _mpsub_read_header in libavformat.a(mpsubdec.o)
      _realtext_read_header in libavformat.a(realtextdec.o)
      _sami_read_header in libavformat.a(samidec.o)
      _srt_read_header in libavformat.a(srtdec.o)
      ...
  "_av_bprintf", referenced from:
      _ass_read_header in libavformat.a(assdec.o)
      _jacosub_read_header in libavformat.a(jacosubdec.o)
      _vobsub_read_header in libavformat.a(mpeg.o)
      _sami_read_header in libavformat.a(samidec.o)
      _subviewer_read_header in libavformat.a(subviewerdec.o)
      _dvdsub_init in libavcodec.a(dvdsubenc.o)
      _insert_text in libavcodec.a(jacosubdec.o)
      ...
  "_av_buffer_alloc", referenced from:
      _asf_read_packet in libavformat.a(asfdec.o)
      _flac_read_header in libavformat.a(flacdec.o)
      _matroska_parse_block in libavformat.a(matroskadec.o)
      _mpegts_push_data in libavformat.a(mpegts.o)
      _av_grow_packet in libavcodec.a(avpacket.o)
      _av_packet_merge_side_data in libavcodec.a(avpacket.o)
      _raw_decode in libavcodec.a(rawdec.o)
      ...
  "_av_buffer_allocz", referenced from:
      _update_frame_pool in libavcodec.a(utils.o)
      _h264_frame_start in libavcodec.a(h264.o)
      _get_buffer in libavcodec.a(svq3.o)
      _vp8_decode_frame in libavcodec.a(vp8.o)
      _ff_alloc_picture in libavcodec.a(mpegvideo.o)
      _ff_er_frame_end in libavcodec.a(error_resilience.o)
  "_av_buffer_create", referenced from:
      _get_buffer_internal in libavcodec.a(utils.o)
      _av_packet_from_data in libavcodec.a(avpacket.o)
  "_av_buffer_default_free", referenced from:
      _av_packet_from_data in libavcodec.a(avpacket.o)
  "_av_buffer_get_ref_count", referenced from:
      _ff_h264_decode_ref_pic_list_reordering in libavcodec.a(h264_refs.o)
  "_av_buffer_make_writable", referenced from:
      _ff_alloc_picture in libavcodec.a(mpegvideo.o)
  "_av_buffer_pool_get", referenced from:
      _audio_get_buffer in libavcodec.a(utils.o)
      _video_get_buffer in libavcodec.a(utils.o)
      _h264_frame_start in libavcodec.a(h264.o)
  "_av_buffer_pool_init", referenced from:
      _update_frame_pool in libavcodec.a(utils.o)
      _h264_frame_start in libavcodec.a(h264.o)
  "_av_buffer_pool_uninit", referenced from:
      _update_frame_pool in libavcodec.a(utils.o)
      _avcodec_close in libavcodec.a(utils.o)
      _free_tables in libavcodec.a(h264.o)
      _h264_frame_start in libavcodec.a(h264.o)
      _h264_slice_header_init in libavcodec.a(h264.o)
  "_av_buffer_realloc", referenced from:
      _avcodec_encode_audio2 in libavcodec.a(utils.o)
      _avcodec_encode_video2 in libavcodec.a(utils.o)
      _copy_packet_data in libavcodec.a(avpacket.o)
      _av_new_packet in libavcodec.a(avpacket.o)
      _av_grow_packet in libavcodec.a(avpacket.o)
  "_av_buffer_ref", referenced from:
      _avformat_queue_attached_pictures in libavformat.a(utils.o)
      _mkv_write_packet in libavformat.a(matroskaenc.o)
      _mp3_write_packet in libavformat.a(mp3enc.o)
      _get_buffer_internal in libavcodec.a(utils.o)
      _ff_thread_ref_frame in libavcodec.a(utils.o)
      _copy_packet_data in libavcodec.a(avpacket.o)
      _raw_decode in libavcodec.a(rawdec.o)
      ...
  "_av_buffer_unref", referenced from:
      _asf_read_packet in libavformat.a(asfdec.o)
      _flac_read_header in libavformat.a(flacdec.o)
      _matroska_parse_block in libavformat.a(matroskadec.o)
      _handle_packets in libavformat.a(mpegts.o)
      _mpegts_read_close in libavformat.a(mpegts.o)
      _pat_cb in libavformat.a(mpegts.o)
      _ff_mpegts_parse_close in libavformat.a(mpegts.o)
      ...
  "_av_calloc", referenced from:
      _mxf_read_index_table_segment in libavformat.a(mxfdec.o)
      _mxf_read_primer_pack in libavformat.a(mxfdec.o)
      _mxf_read_generic_descriptor in libavformat.a(mxfdec.o)
      _mxf_read_sequence in libavformat.a(mxfdec.o)
      _mxf_read_material_package in libavformat.a(mxfdec.o)
      _mxf_read_source_package in libavformat.a(mxfdec.o)
      _mxf_read_content_storage in libavformat.a(mxfdec.o)
      ...
  "_av_compare_mod", referenced from:
      _av_read_frame in libavformat.a(utils.o)
  "_av_compare_ts", referenced from:
      _hls_read_packet in libavformat.a(hls.o)
      _hls_write_packet in libavformat.a(hlsenc.o)
      _nut_write_packet in libavformat.a(nutenc.o)
      _seg_write_packet in libavformat.a(segment.o)
      _ism_write_packet in libavformat.a(smoothstreamingenc.o)
      _ff_interleave_compare_dts in libavformat.a(mux.o)
  "_av_crc", referenced from:
      _ac3_eac3_probe.isra.0 in libavformat.a(ac3dec.o)
      _write_section_data.isra.11 in libavformat.a(mpegts.o)
      _mpegts_write_section in libavformat.a(mpegtsenc.o)
      _ff_crc04C11DB7_update in libavformat.a(aviobuf.o)
      _ff_flac_decode_frame_header in libavcodec.a(flac.o)
      _ff_tak_check_crc in libavcodec.a(tak.o)
      _ac3_decode_frame in libavcodec.a(ac3dec.o)
      ...
  "_av_crc_get_table", referenced from:
      _ac3_eac3_probe.isra.0 in libavformat.a(ac3dec.o)
      _write_section_data.isra.11 in libavformat.a(mpegts.o)
      _mpegts_write_section in libavformat.a(mpegtsenc.o)
      _ff_crc04C11DB7_update in libavformat.a(aviobuf.o)
      _ff_flac_decode_frame_header in libavcodec.a(flac.o)
      _ac3_decode_frame in libavcodec.a(ac3dec.o)
      _decode_init in libavcodec.a(alsdec.o)
      ...
  "_av_crc_init", referenced from:
      _ff_tak_init_crc in libavcodec.a(tak.o)
      _ff_mlp_init_crc in libavcodec.a(mlp.o)
  "_av_ctz", referenced from:
      _flac_encode_frame in libavcodec.a(flacenc.o)
  "_av_d2q", referenced from:
      _read_header in libavformat.a(mgsts.o)
      _microdvd_read_header in libavformat.a(microdvddec.o)
      _mov_read_tkhd in libavformat.a(mov.o)
      _mov_read_trak in libavformat.a(mov.o)
      _parse_video_var in libavformat.a(mvdec.o)
      _nuv_header in libavformat.a(nuv.o)
      _thp_read_header in libavformat.a(thp.o)
      ...
  "_av_default_item_name", referenced from:
      ___compound_literal.3 in libavformat.a(bintext.o)
      ___compound_literal.2 in libavformat.a(bintext.o)
      ___compound_literal.1 in libavformat.a(bintext.o)
      ___compound_literal.0 in libavformat.a(bintext.o)
      _aiff_muxer_class in libavformat.a(aiffenc.o)
      _aqt_class in libavformat.a(aqtitledec.o)
      _asf_class in libavformat.a(asfdec.o)
      ...
  "_av_des_crypt", referenced from:
      _oma_read_packet in libavformat.a(omadec.o)
      _rprobe.isra.1 in libavformat.a(omadec.o)
      _nprobe in libavformat.a(omadec.o)
      _oma_read_header in libavformat.a(omadec.o)
      _ff_asfcrypt_dec in libavformat.a(asfcrypt.o)
  "_av_des_init", referenced from:
      _rprobe.isra.1 in libavformat.a(omadec.o)
      _nprobe in libavformat.a(omadec.o)
      _oma_read_header in libavformat.a(omadec.o)
      _ff_asfcrypt_dec in libavformat.a(asfcrypt.o)
  "_av_des_mac", referenced from:
      _rprobe.isra.1 in libavformat.a(omadec.o)
  "_av_dict_copy", referenced from:
      _avformat_open_input in libavformat.a(utils.o)
      _segment_mux_init in libavformat.a(segment.o)
      _tee_write_header in libavformat.a(tee.o)
      _avcodec_open2 in libavcodec.a(utils.o)
      _avformat_write_header in libavformat.a(mux.o)
      _ff_wms_parse_sdp_a_line in libavformat.a(rtpdec_asf.o)
      _ff_frame_thread_encoder_init in libavcodec.a(frame_thread_encoder.o)
      ...
  "_av_dict_count", referenced from:
      _dump_stream_format in libavformat.a(utils.o)
      _av_dump_format in libavformat.a(utils.o)
      _asf_write_header1 in libavformat.a(asfenc.o)
      _caf_write_header in libavformat.a(cafenc.o)
  "_av_dict_free", referenced from:
      _try_decode_frame in libavformat.a(utils.o)
      _avformat_find_stream_info in libavformat.a(utils.o)
      _ff_free_stream in libavformat.a(utils.o)
      _avformat_free_context in libavformat.a(utils.o)
      _avformat_open_input in libavformat.a(utils.o)
      _open_input.isra.0 in libavformat.a(hls.o)
      _parse_playlist in libavformat.a(hls.o)
      ...
  "_av_dict_get", referenced from:
      _dump_metadata.part.8.constprop.29 in libavformat.a(utils.o)
      _dump_stream_format in libavformat.a(utils.o)
      _av_dump_format in libavformat.a(utils.o)
      _aiff_write_header in libavformat.a(aiffenc.o)
      _asf_write_header1 in libavformat.a(asfenc.o)
      _avi_write_header in libavformat.a(avienc.o)
      _caf_write_header in libavformat.a(cafenc.o)
      ...
  "_av_dict_set", referenced from:
      _try_decode_frame in libavformat.a(utils.o)
      _avformat_find_stream_info in libavformat.a(utils.o)
      _avpriv_new_chapter in libavformat.a(utils.o)
      _bintext_read_header in libavformat.a(bintext.o)
      _aiff_read_header in libavformat.a(aiffdec.o)
      _asf_read_picture in libavformat.a(asfdec.o)
      _asf_read_metadata.isra.9 in libavformat.a(asfdec.o)
      ...
  "_av_div_q", referenced from:
      _av_guess_frame_rate in libavformat.a(utils.o)
      _avi_read_header in libavformat.a(avidec.o)
      _nut_write_header in libavformat.a(nutenc.o)
      _decode_chunks in libavcodec.a(mpeg12dec.o)
  "_av_dynarray_add", referenced from:
      _av_new_program in libavformat.a(utils.o)
      _avpriv_new_chapter in libavformat.a(utils.o)
      _parse_playlist in libavformat.a(hls.o)
      _parse_playlist in libavformat.a(hlsproto.o)
      _matroska_parse_block in libavformat.a(matroskadec.o)
      _mpegts_write_header in libavformat.a(mpegtsenc.o)
      _ff_sdp_parse in libavformat.a(rtsp.o)
      ...
  "_av_escape", referenced from:
      _segment_list_print_entry in libavformat.a(segment.o)
  "_av_expr_eval", referenced from:
      _get_qscale in libavcodec.a(ratecontrol.o)
  "_av_expr_free", referenced from:
      _ff_rate_control_uninit in libavcodec.a(ratecontrol.o)
  "_av_expr_parse", referenced from:
      _ff_rate_control_init in libavcodec.a(ratecontrol.o)
  "_av_fifo_alloc", referenced from:
      _swf_write_header in libavformat.a(swfenc.o)
      _dv_write_header in libavformat.a(dvenc.o)
      _mpeg_mux_init in libavformat.a(mpegenc.o)
      _udp_open in libavformat.a(udp.o)
      _ff_audio_interleave_init in libavformat.a(audiointerleave.o)
      _flac_parse_init in libavcodec.a(flac_parser.o)
      _ff_frame_thread_encoder_init in libavcodec.a(frame_thread_encoder.o)
      ...
  "_av_fifo_drain", referenced from:
      _dv_write_packet in libavformat.a(dvenc.o)
      _udp_read in libavformat.a(udp.o)
      _flac_parse in libavcodec.a(flac_parser.o)
  "_av_fifo_free", referenced from:
      _swf_write_trailer in libavformat.a(swfenc.o)
      _dv_write_trailer in libavformat.a(dvenc.o)
      _dv_write_header in libavformat.a(dvenc.o)
      _mpeg_mux_end in libavformat.a(mpegenc.o)
      _udp_close in libavformat.a(udp.o)
      _udp_open in libavformat.a(udp.o)
      _ff_audio_interleave_close in libavformat.a(audiointerleave.o)
      ...
  "_av_fifo_generic_read", referenced from:
      _swf_write_video in libavformat.a(swfenc.o)
      _flush_packet in libavformat.a(mpegenc.o)
      _udp_read in libavformat.a(udp.o)
      _ff_audio_rechunk_interleave in libavformat.a(audiointerleave.o)
      _worker in libavcodec.a(frame_thread_encoder.o)
  "_av_fifo_generic_write", referenced from:
      _swf_write_packet in libavformat.a(swfenc.o)
      _dv_write_packet in libavformat.a(dvenc.o)
      _mpeg_mux_write_packet in libavformat.a(mpegenc.o)
      _circular_buffer_task in libavformat.a(udp.o)
      _ff_audio_rechunk_interleave in libavformat.a(audiointerleave.o)
      _flac_parse in libavcodec.a(flac_parser.o)
      _ff_thread_video_encode_frame in libavcodec.a(frame_thread_encoder.o)
      ...
  "_av_fifo_realloc2", referenced from:
      _mpeg_mux_write_packet in libavformat.a(mpegenc.o)
      _ff_audio_rechunk_interleave in libavformat.a(audiointerleave.o)
      _flac_parse in libavcodec.a(flac_parser.o)
  "_av_fifo_size", referenced from:
      _swf_write_video in libavformat.a(swfenc.o)
      _swf_write_packet in libavformat.a(swfenc.o)
      _dv_write_packet in libavformat.a(dvenc.o)
      _flush_packet in libavformat.a(mpegenc.o)
      _mpeg_mux_write_packet in libavformat.a(mpegenc.o)
      _mpeg_mux_end in libavformat.a(mpegenc.o)
      _udp_read in libavformat.a(udp.o)
      ...
  "_av_fifo_space", referenced from:
      _circular_buffer_task in libavformat.a(udp.o)
      _flac_parse in libavcodec.a(flac_parser.o)
  "_av_find_info_tag", referenced from:
      _rtp_open in libavformat.a(rtpproto.o)
      _sap_write_header in libavformat.a(sapenc.o)
      _tcp_open in libavformat.a(tcp.o)
      _ff_udp_set_remote_url in libavformat.a(udp.o)
      _udp_open in libavformat.a(udp.o)
      _av_sdp_create in libavformat.a(sdp.o)
  "_av_frame_alloc", referenced from:
      _aasc_decode_init in libavcodec.a(aasc.o)
      _decode_init in libavcodec.a(anm.o)
      _decode_init in libavcodec.a(ansi.o)
      _decode_init in libavcodec.a(bink.o)
      _decode_init in libavcodec.a(bintext.o)
      _cdg_decode_init in libavcodec.a(cdgraphics.o)
      _cinepak_decode_init in libavcodec.a(cinepak.o)
      ...
  "_av_frame_free", referenced from:
      _aasc_decode_end in libavcodec.a(aasc.o)
      _decode_end in libavcodec.a(anm.o)
      _decode_close in libavcodec.a(ansi.o)
      _decode_end in libavcodec.a(bink.o)
      _decode_end in libavcodec.a(bintext.o)
      _cdg_decode_end in libavcodec.a(cdgraphics.o)
      _cinepak_decode_end in libavcodec.a(cinepak.o)
      ...
  "_av_frame_get_channels", referenced from:
      _update_frame_pool in libavcodec.a(utils.o)
      _avcodec_decode_audio4 in libavcodec.a(utils.o)
  "_av_frame_get_pkt_duration", referenced from:
      _avcodec_decode_audio4 in libavcodec.a(utils.o)
  "_av_frame_is_writable", referenced from:
      _reget_buffer_internal in libavcodec.a(utils.o)
  "_av_frame_make_writable", referenced from:
      _ff_print_debug_info2 in libavcodec.a(mpegvideo.o)
  "_av_frame_move_ref", referenced from:
      _reget_buffer_internal in libavcodec.a(utils.o)
      _cavs_decode_frame in libavcodec.a(cavsdec.o)
      _dvvideo_decode_frame in libavcodec.a(dvdec.o)
      _cmv_decode_frame in libavcodec.a(eacmv.o)
      _decode_frame in libavcodec.a(qpeg.o)
      _decode_packet in libavcodec.a(wmalosslessdec.o)
      _ff_snow_frame_start in libavcodec.a(snow.o)
      ...
  "_av_frame_new_side_data", referenced from:
      _decode_chunks in libavcodec.a(mpeg12dec.o)
  "_av_frame_ref", referenced from:
      _ff_thread_ref_frame in libavcodec.a(utils.o)
      _decode_frame in libavcodec.a(h264.o)
      _aasc_decode_frame in libavcodec.a(aasc.o)
      _decode_frame in libavcodec.a(anm.o)
      _decode_frame in libavcodec.a(ansi.o)
      _avs_decode_frame in libavcodec.a(avs.o)
      _bethsoftvid_decode_frame in libavcodec.a(bethsoftvideo.o)
      ...
  "_av_frame_set_best_effort_timestamp", referenced from:
      _avcodec_get_frame_defaults in libavcodec.a(utils.o)
      _avcodec_alloc_frame in libavcodec.a(utils.o)
      _avcodec_encode_audio2 in libavcodec.a(utils.o)
      _avcodec_encode_audio in libavcodec.a(utils.o)
      _avcodec_decode_video2 in libavcodec.a(utils.o)
      _avcodec_decode_audio4 in libavcodec.a(utils.o)
  "_av_frame_set_channels", referenced from:
      _ff_init_buffer_info in libavcodec.a(utils.o)
      _avcodec_decode_audio4 in libavcodec.a(utils.o)
  "_av_frame_set_decode_error_flags", referenced from:
      _ac3_decode_frame in libavcodec.a(ac3dec.o)
      _cpia_decode_frame in libavcodec.a(cpia.o)
  "_av_frame_set_metadata", referenced from:
      _decode_frame in libavcodec.a(pngdec.o)
  "_av_frame_set_pkt_duration", referenced from:
      _ff_init_buffer_info in libavcodec.a(utils.o)
      _avcodec_get_frame_defaults in libavcodec.a(utils.o)
      _avcodec_alloc_frame in libavcodec.a(utils.o)
      _avcodec_encode_audio2 in libavcodec.a(utils.o)
      _avcodec_encode_audio in libavcodec.a(utils.o)
      _avcodec_decode_video2 in libavcodec.a(utils.o)
      _avcodec_decode_audio4 in libavcodec.a(utils.o)
      ...
  "_av_frame_set_pkt_pos", referenced from:
      _ff_init_buffer_info in libavcodec.a(utils.o)
      _avcodec_get_frame_defaults in libavcodec.a(utils.o)
      _avcodec_alloc_frame in libavcodec.a(utils.o)
      _avcodec_encode_audio2 in libavcodec.a(utils.o)
      _avcodec_encode_audio in libavcodec.a(utils.o)
      _avcodec_decode_video2 in libavcodec.a(utils.o)
      _avcodec_decode_audio4 in libavcodec.a(utils.o)
      ...
  "_av_frame_set_pkt_size", referenced from:
      _ff_init_buffer_info in libavcodec.a(utils.o)
      _avcodec_get_frame_defaults in libavcodec.a(utils.o)
      _avcodec_alloc_frame in libavcodec.a(utils.o)
      _avcodec_encode_audio2 in libavcodec.a(utils.o)
      _avcodec_encode_audio in libavcodec.a(utils.o)
      _avcodec_decode_video2 in libavcodec.a(utils.o)
      _avcodec_decode_audio4 in libavcodec.a(utils.o)
      ...
  "_av_frame_set_qp_table", referenced from:
      _ff_mjpeg_decode_frame in libavcodec.a(mjpegdec.o)
      _ff_mpv_export_qp_table in libavcodec.a(mpegvideo.o)
  "_av_frame_unref", referenced from:
      _audio_get_buffer in libavcodec.a(utils.o)
      _avcodec_default_release_buffer in libavcodec.a(utils.o)
      _video_get_buffer in libavcodec.a(utils.o)
      _get_buffer_internal in libavcodec.a(utils.o)
      _reget_buffer_internal in libavcodec.a(utils.o)
      _avcodec_decode_video2 in libavcodec.a(utils.o)
      _avcodec_decode_audio4 in libavcodec.a(utils.o)
      ...
  "_av_free", referenced from:
      _av_probe_input_buffer in libavformat.a(utils.o)
      _ff_read_packet in libavformat.a(utils.o)
      _avformat_free_context in libavformat.a(utils.o)
      _av_dump_format in libavformat.a(utils.o)
      _avformat_new_stream in libavformat.a(utils.o)
      _ff_http_match_no_proxy in libavformat.a(utils.o)
      _rdt_free_context in libavformat.a(rdt.o)
      ...
     (maybe you meant: _av_free_packet)
  "_av_freep", referenced from:
      _probe_codec.part.14 in libavformat.a(utils.o)
      _av_probe_input_buffer in libavformat.a(utils.o)
      _ff_read_frame_flush in libavformat.a(utils.o)
      _read_frame_internal in libavformat.a(utils.o)
      _av_read_frame in libavformat.a(utils.o)
      _seek_frame_internal in libavformat.a(utils.o)
      _avformat_seek_file in libavformat.a(utils.o)
      ...
  "_av_gcd", referenced from:
      _dump_stream_format in libavformat.a(utils.o)
      _avformat_find_stream_info in libavformat.a(utils.o)
      _nut_read_header in libavformat.a(nutdec.o)
      _rtp_send_samples in libavformat.a(rtpenc.o)
      _avcodec_string in libavcodec.a(utils.o)
      _ff_put_wav_header in libavformat.a(riff.o)
      _ff_parse_specific_params in libavformat.a(riff.o)
      ...
  "_av_get_bits_per_pixel", referenced from:
      _decode_frame in libavcodec.a(iff.o)
      _raw_init_encoder in libavcodec.a(rawenc.o)
      _targa_encode_frame in libavcodec.a(targaenc.o)
      _encode_frame in libavcodec.a(tiffenc.o)
      _xwd_encode_frame in libavcodec.a(xwdenc.o)
  "_av_get_bytes_per_sample", referenced from:
      _mkv_write_tracks in libavformat.a(matroskaenc.o)
      _write_element in libavcodec.a(alacenc.o)
      _decode_frame in libavcodec.a(alsdec.o)
      _decode_init in libavcodec.a(alsdec.o)
      _flac_decode_frame in libavcodec.a(flacdec.o)
      _flac_decode_init in libavcodec.a(flacdec.o)
      _flac_encode_frame in libavcodec.a(flacenc.o)
      ...
  "_av_get_channel_layout_channel_index", referenced from:
      _read_access_unit in libavcodec.a(mlpdec.o)
  "_av_get_channel_layout_nb_channels", referenced from:
      _mov_read_dec3 in libavformat.a(mov.o)
      _ff_init_buffer_info in libavcodec.a(utils.o)
      _avcodec_open2 in libavcodec.a(utils.o)
      _cook_decode_init in libavcodec.a(cook.o)
      _dca_decode_frame in libavcodec.a(dcadec.o)
      _read_access_unit in libavcodec.a(mlpdec.o)
      _ff_mov_get_channel_layout_tag in libavformat.a(mov_chan.o)
      ...
  "_av_get_channel_layout_string", referenced from:
      _avcodec_string in libavcodec.a(utils.o)
      _avcodec_open2 in libavcodec.a(utils.o)
  "_av_get_cpu_flags", referenced from:
      _avcodec_encode_video2 in libavcodec.a(utils.o)
      _avcodec_decode_video2 in libavcodec.a(utils.o)
      _field_end in libavcodec.a(h264.o)
      _ff_h264_draw_horiz_band in libavcodec.a(h264.o)
      _ape_decode_frame in libavcodec.a(apedec.o)
      _decode_frame in libavcodec.a(asvdec.o)
      _encode_frame in libavcodec.a(asvenc.o)
      ...
  "_av_get_default_channel_layout", referenced from:
      _encode_init in libavcodec.a(dcaenc.o)
      _ff_ac3_encode_init in libavcodec.a(ac3enc.o)
  "_av_get_media_type_string", referenced from:
      _avi_write_header in libavformat.a(avienc.o)
      _flv_write_header in libavformat.a(flvenc.o)
      _seg_write_header in libavformat.a(segment.o)
      _avcodec_string in libavcodec.a(utils.o)
  "_av_get_padded_bits_per_pixel", referenced from:
      _avcodec_find_best_pix_fmt_of_2 in libavcodec.a(imgconvert.o)
  "_av_get_picture_type_char", referenced from:
      _decode_slice_header in libavcodec.a(h264.o)
      _ff_flv_decode_picture_header in libavcodec.a(flvdec.o)
      _svq3_decode_frame in libavcodec.a(svq3.o)
      _vc1_decode_frame in libavcodec.a(vc1dec.o)
      _ff_print_debug_info2 in libavcodec.a(mpegvideo.o)
      _ff_er_frame_end in libavcodec.a(error_resilience.o)
      _ff_rate_estimate_qscale in libavcodec.a(ratecontrol.o)
      ...
  "_av_get_pix_fmt", referenced from:
      _img_read_header in libavformat.a(img2dec.o)
      _rawvideo_read_header in libavformat.a(rawvideodec.o)
  "_av_get_pix_fmt_name", referenced from:
      _yuv4_write_header in libavformat.a(yuv4mpeg.o)
      _yuv4_write_packet in libavformat.a(yuv4mpeg.o)
      _reget_buffer_internal in libavcodec.a(utils.o)
      _avcodec_string in libavcodec.a(utils.o)
      _avcodec_open2 in libavcodec.a(utils.o)
      _ff_dv_print_profiles in libavcodec.a(dv_profile.o)
      _dvvideo_init_encoder in libavcodec.a(dv.o)
      ...
  "_av_get_planar_sample_fmt", referenced from:
      _avcodec_open2 in libavcodec.a(utils.o)
  "_av_get_random_seed", referenced from:
      _mkv_write_header in libavformat.a(matroskaenc.o)
      _mxf_write_header in libavformat.a(mxfenc.o)
      _ogg_write_header in libavformat.a(oggenc.o)
      _handle_invoke_error.isra.11 in libavformat.a(rtmpproto.o)
      _rtmp_open in libavformat.a(rtmpproto.o)
      _ff_rtsp_make_setup_request in libavformat.a(rtsp.o)
      _ff_rtsp_connect in libavformat.a(rtsp.o)
      ...
  "_av_get_sample_fmt_name", referenced from:
      _avcodec_string in libavcodec.a(utils.o)
      _avcodec_open2 in libavcodec.a(utils.o)
  "_av_get_token", referenced from:
      _concat_read_header in libavformat.a(concatdec.o)
      _tee_write_header in libavformat.a(tee.o)
  "_av_gettime", referenced from:
      _ff_read_packet in libavformat.a(utils.o)
      _ff_ntp_time in libavformat.a(utils.o)
      _ff_rtp_check_and_send_back_rr in libavformat.a(rtpdec.o)
      _ff_rtp_send_rtcp_feedback in libavformat.a(rtpdec.o)
      _ff_rtp_parse_packet in libavformat.a(rtpdec.o)
      _parse_playlist in libavformat.a(hls.o)
      _read_data in libavformat.a(hls.o)
      ...
  "_av_hmac_alloc", referenced from:
      _ff_srtp_set_crypto in libavformat.a(srtp.o)
  "_av_hmac_final", referenced from:
      _ff_srtp_decrypt in libavformat.a(srtp.o)
      _ff_srtp_encrypt in libavformat.a(srtp.o)
  "_av_hmac_free", referenced from:
      _ff_srtp_free in libavformat.a(srtp.o)
      _ff_srtp_set_crypto in libavformat.a(srtp.o)
  "_av_hmac_init", referenced from:
      _ff_srtp_decrypt in libavformat.a(srtp.o)
      _ff_srtp_encrypt in libavformat.a(srtp.o)
  "_av_hmac_update", referenced from:
      _ff_srtp_decrypt in libavformat.a(srtp.o)
      _ff_srtp_encrypt in libavformat.a(srtp.o)
  "_av_image_alloc", referenced from:
      _avpicture_alloc in libavcodec.a(avpicture.o)
  "_av_image_check_size", referenced from:
      _idcin_read_header in libavformat.a(idcin.o)
      _swf_read_packet in libavformat.a(swfdec.o)
      _get_buffer_internal in libavcodec.a(utils.o)
      _avcodec_encode_video2 in libavcodec.a(utils.o)
      _avcodec_decode_video2 in libavcodec.a(utils.o)
      _avcodec_open2 in libavcodec.a(utils.o)
      _raw_decode in libavcodec.a(rawdec.o)
      ...
  "_av_image_copy", referenced from:
      _reget_buffer_internal in libavcodec.a(utils.o)
      _av_picture_copy in libavcodec.a(avpicture.o)
      _decode_slice_header in libavcodec.a(h264.o)
      _decode_frame in libavcodec.a(ffv1dec.o)
      _ff_thread_video_encode_frame in libavcodec.a(frame_thread_encoder.o)
  "_av_image_copy_plane", referenced from:
      _brpix_decode_frame in libavcodec.a(brender_pix.o)
      _ff_dsputil_init in libavcodec.a(dsputil.o)
  "_av_image_copy_to_buffer", referenced from:
      _avpicture_layout in libavcodec.a(avpicture.o)
  "_av_image_fill_arrays", referenced from:
      _avpicture_fill in libavcodec.a(avpicture.o)
  "_av_image_fill_linesizes", referenced from:
      _update_frame_pool in libavcodec.a(utils.o)
  "_av_image_fill_pointers", referenced from:
      _update_frame_pool in libavcodec.a(utils.o)
  "_av_image_get_buffer_size", referenced from:
      _avpicture_get_size in libavcodec.a(avpicture.o)
  "_av_isdigit", referenced from:
      _av_get_frame_filename in libavformat.a(utils.o)
  "_av_isspace", referenced from:
      _ff_parse_key_value in libavformat.a(utils.o)
      _rtmp_http_open in libavformat.a(rtmphttp.o)
      _parse_playlist in libavformat.a(hls.o)
      _parse_playlist in libavformat.a(hlsproto.o)
      _http_read_header in libavformat.a(http.o)
      _dvdsub_init in libavcodec.a(dvdsubdec.o)
      _ff_http_auth_handle_header in libavformat.a(httpauth.o)
      ...
  "_av_isxdigit", referenced from:
      _xbm_decode_frame in libavcodec.a(xbmdec.o)
      _ff_urldecode in libavformat.a(urldecode.o)
  "_av_lfg_init", referenced from:
      _mkv_write_header in libavformat.a(matroskaenc.o)
      _rtmp_open in libavformat.a(rtmpproto.o)
      _a64multi_init_encoder in libavcodec.a(a64multienc.o)
      _ac3_decode_init in libavcodec.a(ac3dec.o)
      _amrwb_decode_init in libavcodec.a(amrwbdec.o)
      _cng_decode_init in libavcodec.a(cngdec.o)
      _cook_decode_init in libavcodec.a(cook.o)
      ...
  "_av_log", referenced from:
      _hex_dump_internal.constprop.20 in libavformat.a(utils.o)
      _hex_dump_internal.constprop.21 in libavformat.a(utils.o)
      _dump_metadata.part.8.constprop.29 in libavformat.a(utils.o)
      _update_stream_timings in libavformat.a(utils.o)
      _append_packet_chunked in libavformat.a(utils.o)
      _dump_stream_format in libavformat.a(utils.o)
      _ffio_limit in libavformat.a(utils.o)
      ...
     (maybe you meant: _av_log_missing_feature, _av_log_ask_for_sample )
  "_av_log_get_level", referenced from:
      _oma_read_header in libavformat.a(omadec.o)
      _avcodec_string in libavcodec.a(utils.o)
  "_av_lzo1x_decode", referenced from:
      _matroska_decode_buffer.isra.4 in libavformat.a(matroskadec.o)
      _decode_frame in libavcodec.a(cscd.o)
      _decode_frame in libavcodec.a(nuv.o)
  "_av_malloc", referenced from:
      _avformat_find_stream_info in libavformat.a(utils.o)
      _ff_parse_fmtp in libavformat.a(rtpdec.o)
      _adf_read_header in libavformat.a(bintext.o)
      _xbin_read_header in libavformat.a(bintext.o)
      _bintext_read_header in libavformat.a(bintext.o)
      _idf_read_header in libavformat.a(bintext.o)
      _aiff_read_header in libavformat.a(aiffdec.o)
      ...
  "_av_mallocz", referenced from:
      _avformat_queue_attached_pictures in libavformat.a(utils.o)
      _ff_read_packet in libavformat.a(utils.o)
      _parse_packet in libavformat.a(utils.o)
      _av_read_frame in libavformat.a(utils.o)
      _avformat_find_stream_info in libavformat.a(utils.o)
      _av_new_program in libavformat.a(utils.o)
      _avpriv_new_chapter in libavformat.a(utils.o)
      ...
  "_av_md5_alloc", referenced from:
      _write_header in libavformat.a(md5enc.o)
      _framemd5_write_header in libavformat.a(md5enc.o)
      _md5_open in libavformat.a(md5proto.o)
      _handle_invoke_error.isra.11 in libavformat.a(rtmpproto.o)
      _flac_encode_init in libavcodec.a(flacenc.o)
      _ff_http_auth_create_response in libavformat.a(httpauth.o)
  "_av_md5_final", referenced from:
      _framemd5_write_packet in libavformat.a(md5enc.o)
      _write_trailer in libavformat.a(md5enc.o)
      _md5_close in libavformat.a(md5proto.o)
      _handle_invoke_error.isra.11 in libavformat.a(rtmpproto.o)
      _flac_encode_frame in libavcodec.a(flacenc.o)
      _ff_http_auth_create_response in libavformat.a(httpauth.o)
  "_av_md5_init", referenced from:
      _write_header in libavformat.a(md5enc.o)
      _framemd5_write_packet in libavformat.a(md5enc.o)
      _md5_open in libavformat.a(md5proto.o)
      _handle_invoke_error.isra.11 in libavformat.a(rtmpproto.o)
      _flac_encode_init in libavcodec.a(flacenc.o)
      _ff_http_auth_create_response in libavformat.a(httpauth.o)
  "_av_md5_sum", referenced from:
      _ff_rdt_calc_response_and_checksum in libavformat.a(rdt.o)
  "_av_md5_update", referenced from:
      _write_packet in libavformat.a(md5enc.o)
      _framemd5_write_packet in libavformat.a(md5enc.o)
      _md5_write in libavformat.a(md5proto.o)
      _handle_invoke_error.isra.11 in libavformat.a(rtmpproto.o)
      _flac_encode_frame in libavcodec.a(flacenc.o)
      _update_md5_strings in libavformat.a(httpauth.o)
  "_av_memcpy_backptr", referenced from:
      _decode_dsw1 in libavcodec.a(dfa.o)
      _decode_tsw1 in libavcodec.a(dfa.o)
      _tgv_decode_frame in libavcodec.a(eatgv.o)
      _g723_1_decode_frame in libavcodec.a(g723_1.o)
      _decode_frame in libavcodec.a(kgv1dec.o)
      _mszh_decomp in libavcodec.a(lcldec.o)
      _synth_superframe in libavcodec.a(wmavoice.o)
      ...
  "_av_mul_q", referenced from:
      _avi_write_header in libavformat.a(avienc.o)
      _mxf_read_seek in libavformat.a(mxfdec.o)
      _decode_chunks in libavcodec.a(mpeg12dec.o)
      _encode_init in libavcodec.a(mpeg12enc.o)
      _rv10_decode_frame in libavcodec.a(rv10.o)
      _ff_rv34_decode_frame in libavcodec.a(rv34.o)
  "_av_nearer_q", referenced from:
      _encode_init in libavcodec.a(mpeg12enc.o)
  "_av_opt_flag_is_set", referenced from:
      _sdp_write_media_attributes in libavformat.a(sdp.o)
      _ff_rtp_get_payload_type in libavformat.a(rtp.o)
  "_av_opt_free", referenced from:
      _avformat_free_context in libavformat.a(utils.o)
      _seg_write_trailer in libavformat.a(segment.o)
      _ffurl_open in libavformat.a(avio.o)
      _ffurl_closep in libavformat.a(avio.o)
      _ffurl_close in libavformat.a(avio.o)
      _avio_check in libavformat.a(avio.o)
      _avcodec_close in libavcodec.a(utils.o)
      ...
  "_av_opt_get", referenced from:
      _av_probe_input_buffer in libavformat.a(utils.o)
      _hls_read_header in libavformat.a(hls.o)
      _av_sdp_create in libavformat.a(sdp.o)
      _ff_rtp_chain_mux_open in libavformat.a(rtpenc_chain.o)
  "_av_opt_get_int", referenced from:
      _sdp_write_media_attributes in libavformat.a(sdp.o)
      _ff_rtp_get_payload_type in libavformat.a(rtp.o)
  "_av_opt_get_key_value", referenced from:
      _tee_write_header in libavformat.a(tee.o)
  "_av_opt_set", referenced from:
      _rtmp_http_open in libavformat.a(rtmphttp.o)
      _open_input.isra.0 in libavformat.a(hls.o)
      _hls_start in libavformat.a(hlsenc.o)
      _mmsh_open_internal.isra.0 in libavformat.a(mmsh.o)
      _ff_rtsp_connect in libavformat.a(rtsp.o)
      _seg_write_packet in libavformat.a(segment.o)
      _url_alloc_for_protocol in libavformat.a(avio.o)
      ...
  "_av_opt_set_bin", referenced from:
      _rtmp_http_send_cmd.isra.0 in libavformat.a(rtmphttp.o)
      _rtmp_http_close in libavformat.a(rtmphttp.o)
      _rtmp_http_open in libavformat.a(rtmphttp.o)
      _rtmp_open in libavformat.a(rtmpproto.o)
  "_av_opt_set_defaults", referenced from:
      _avformat_open_input in libavformat.a(utils.o)
      _url_alloc_for_protocol in libavformat.a(avio.o)
      _avcodec_open2 in libavcodec.a(utils.o)
      _avformat_alloc_output_context2 in libavformat.a(mux.o)
      _avformat_write_header in libavformat.a(mux.o)
      _avcodec_get_context_defaults3 in libavcodec.a(options.o)
      _avformat_alloc_context in libavformat.a(options.o)
      ...
  "_av_opt_set_defaults2", referenced from:
      _avcodec_get_context_defaults3 in libavcodec.a(options.o)
  "_av_opt_set_dict", referenced from:
      _avformat_open_input in libavformat.a(utils.o)
      _ffurl_open in libavformat.a(avio.o)
      _avcodec_open2 in libavcodec.a(utils.o)
      _avformat_write_header in libavformat.a(mux.o)
  "_av_parse_color", referenced from:
      _srt_decode_frame in libavcodec.a(srtdec.o)
  "_av_parse_ratio", referenced from:
      _vivo_read_header in libavformat.a(vivo.o)
  "_av_parse_time", referenced from:
      _concat_read_header in libavformat.a(concatdec.o)
      _ffm_write_header in libavformat.a(ffmenc.o)
      _rtsp_parse_range_npt in libavformat.a(rtsp.o)
      _seg_write_header in libavformat.a(segment.o)
  "_av_parse_video_rate", referenced from:
      _cdxl_read_header in libavformat.a(cdxl.o)
  "_av_pix_fmt_count_planes", referenced from:
      _get_buffer_internal in libavcodec.a(utils.o)
  "_av_pix_fmt_desc_get", referenced from:
      _write_packet in libavformat.a(img2enc.o)
      _write_header in libavformat.a(img2enc.o)
      _video_get_buffer in libavcodec.a(utils.o)
      _avcodec_align_dimensions in libavcodec.a(utils.o)
      _avpriv_color_frame in libavcodec.a(utils.o)
      _get_buffer_internal in libavcodec.a(utils.o)
      _avcodec_default_get_format in libavcodec.a(utils.o)
      ...
  "_av_pix_fmt_get_chroma_sub_sample", referenced from:
      _yuv4_write_packet in libavformat.a(yuv4mpeg.o)
      _video_get_buffer in libavcodec.a(utils.o)
      _h264_slice_header_init in libavcodec.a(h264.o)
      _ff_MPV_encode_picture in libavcodec.a(mpegvideo_enc.o)
      _ff_MPV_frame_start in libavcodec.a(mpegvideo.o)
  "_av_rc4_crypt", referenced from:
      _ff_asfcrypt_dec in libavformat.a(asfcrypt.o)
  "_av_rc4_init", referenced from:
      _ff_asfcrypt_dec in libavformat.a(asfcrypt.o)
  "_av_realloc", referenced from:
      _probe_codec.part.14 in libavformat.a(utils.o)
      _av_probe_input_buffer in libavformat.a(utils.o)
      _ff_program_add_stream_index in libavformat.a(utils.o)
      _avformat_new_stream in libavformat.a(utils.o)
      _rdt_parse_sdp_line in libavformat.a(rdt.o)
      _asf_write_trailer in libavformat.a(asfenc.o)
      _asf_write_packet in libavformat.a(asfenc.o)
      ...
  "_av_realloc_f", referenced from:
      _avi_read_header in libavformat.a(avidec.o)
      _avi_write_packet in libavformat.a(avienc.o)
      _ff_mov_write_packet in libavformat.a(movenc.o)
      _fourxm_read_header in libavformat.a(4xm.o)
      _gxf_write_map_packet in libavformat.a(gxfenc.o)
      _gxf_write_packet in libavformat.a(gxfenc.o)
      _alloc_array_elem in libavformat.a(sbgdec.o)
      ...
  "_av_reduce", referenced from:
      _dump_stream_format in libavformat.a(utils.o)
      _avformat_find_stream_info in libavformat.a(utils.o)
      _avpriv_set_pts_info in libavformat.a(utils.o)
      _av_guess_sample_aspect_ratio in libavformat.a(utils.o)
      _asf_read_header in libavformat.a(asfdec.o)
      _avi_write_header in libavformat.a(avienc.o)
      _dxa_read_header in libavformat.a(dxa.o)
      ...
  "_av_rescale", referenced from:
      _update_initial_timestamps.isra.15 in libavformat.a(utils.o)
      _compute_pkt_fields.part.16 in libavformat.a(utils.o)
      _ff_update_cur_dts in libavformat.a(utils.o)
      _ff_gen_search in libavformat.a(utils.o)
      _ff_seek_frame_binary in libavformat.a(utils.o)
      _seek_frame_internal in libavformat.a(utils.o)
      _avformat_find_stream_info in libavformat.a(utils.o)
      ...
  "_av_rescale_q", referenced from:
      _update_stream_timings in libavformat.a(utils.o)
      _ff_read_packet in libavformat.a(utils.o)
      _avformat_seek_file in libavformat.a(utils.o)
      _avformat_find_stream_info in libavformat.a(utils.o)
      _ff_write_chained in libavformat.a(utils.o)
      _ff_rtp_parse_packet in libavformat.a(rtpdec.o)
      _avi_read_seek in libavformat.a(avidec.o)
      ...
  "_av_rescale_q_rnd", referenced from:
      _parse_packet in libavformat.a(utils.o)
      _try_seek.isra.0 in libavformat.a(concatdec.o)
      _concat_seek in libavformat.a(concatdec.o)
      _rtp_write_header in libavformat.a(rtpenc.o)
      _ff_interleave_add_packet in libavformat.a(mux.o)
      _ff_interleave_packet_per_dts in libavformat.a(mux.o)
  "_av_rescale_rnd", referenced from:
      _compute_pkt_fields.part.16 in libavformat.a(utils.o)
      _avformat_seek_file in libavformat.a(utils.o)
      _ast_write_header in libavformat.a(astenc.o)
      _dv_write_pack in libavformat.a(dvenc.o)
      _dv_write_pack.constprop.1 in libavformat.a(dvenc.o)
      _dv_write_pack.constprop.2 in libavformat.a(dvenc.o)
      _mov_write_moov_tag in libavformat.a(movenc.o)
      ...
  "_av_sample_fmt_is_planar", referenced from:
      _update_frame_pool in libavcodec.a(utils.o)
      _avcodec_fill_audio_frame in libavcodec.a(utils.o)
      _get_buffer_internal in libavcodec.a(utils.o)
      _avcodec_encode_audio2 in libavcodec.a(utils.o)
      _avcodec_decode_audio4 in libavcodec.a(utils.o)
      _avcodec_decode_audio3 in libavcodec.a(utils.o)
      _alac_decode_frame in libavcodec.a(alac.o)
      ...
  "_av_samples_copy", referenced from:
      _avcodec_encode_audio2 in libavcodec.a(utils.o)
      _avcodec_decode_audio4 in libavcodec.a(utils.o)
  "_av_samples_fill_arrays", referenced from:
      _avcodec_fill_audio_frame in libavcodec.a(utils.o)
      _dca_decode_frame in libavcodec.a(dcadec.o)
      _flac_decode_frame in libavcodec.a(flacdec.o)
      _flac_decode_init in libavcodec.a(flacdec.o)
      _tak_decode_frame in libavcodec.a(takdec.o)
  "_av_samples_get_buffer_size", referenced from:
      _update_frame_pool in libavcodec.a(utils.o)
      _avcodec_fill_audio_frame in libavcodec.a(utils.o)
      _avcodec_encode_audio2 in libavcodec.a(utils.o)
      _avcodec_encode_audio in libavcodec.a(utils.o)
      _avcodec_decode_audio3 in libavcodec.a(utils.o)
      _dca_decode_frame in libavcodec.a(dcadec.o)
      _flac_decode_frame in libavcodec.a(flacdec.o)
      ...
  "_av_samples_set_silence", referenced from:
      _avcodec_encode_audio2 in libavcodec.a(utils.o)
  "_av_sha_alloc", referenced from:
      _mkv_write_header in libavformat.a(matroskaenc.o)
      _rtmp_validate_digest in libavformat.a(rtmpproto.o)
      _ff_rtmp_calc_digest.constprop.20 in libavformat.a(rtmpproto.o)
      _ff_rtmp_calc_digest.constprop.21 in libavformat.a(rtmpproto.o)
      _ff_rtmp_calc_digest in libavformat.a(rtmpproto.o)
  "_av_sha_final", referenced from:
      _mkv_write_header in libavformat.a(matroskaenc.o)
      _rtmp_validate_digest in libavformat.a(rtmpproto.o)
      _ff_rtmp_calc_digest.constprop.20 in libavformat.a(rtmpproto.o)
      _ff_rtmp_calc_digest.constprop.21 in libavformat.a(rtmpproto.o)
      _ff_rtmp_calc_digest in libavformat.a(rtmpproto.o)
  "_av_sha_init", referenced from:
      _mkv_write_header in libavformat.a(matroskaenc.o)
      _rtmp_validate_digest in libavformat.a(rtmpproto.o)
      _ff_rtmp_calc_digest.constprop.20 in libavformat.a(rtmpproto.o)
      _ff_rtmp_calc_digest.constprop.21 in libavformat.a(rtmpproto.o)
      _ff_rtmp_calc_digest in libavformat.a(rtmpproto.o)
  "_av_sha_update", referenced from:
      _mkv_write_header in libavformat.a(matroskaenc.o)
      _rtmp_validate_digest in libavformat.a(rtmpproto.o)
      _ff_rtmp_calc_digest.constprop.20 in libavformat.a(rtmpproto.o)
      _ff_rtmp_calc_digest.constprop.21 in libavformat.a(rtmpproto.o)
      _ff_rtmp_calc_digest in libavformat.a(rtmpproto.o)
  "_av_small_strptime", referenced from:
      _ff_iso8601_to_unix_time in libavformat.a(utils.o)
  "_av_strcasecmp", referenced from:
      _av_match_ext in libavformat.a(utils.o)
      _av_find_input_format in libavformat.a(utils.o)
      _av_probe_input_format3 in libavformat.a(utils.o)
      _av_probe_input_buffer in libavformat.a(utils.o)
      _av_guess_format in libavformat.a(utils.o)
      _ff_rtp_handler_find_by_name in libavformat.a(rtpdec.o)
      _avi_read_header in libavformat.a(avidec.o)
      ...
  "_av_strdup", referenced from:
      _ff_http_match_no_proxy in libavformat.a(utils.o)
      _ffm_read_header in libavformat.a(ffmdec.o)
      _http_read_header in libavformat.a(http.o)
      _http_open_cnx in libavformat.a(http.o)
      _img_read_header in libavformat.a(img2dec.o)
      _mkv_write_tag.isra.8 in libavformat.a(matroskaenc.o)
      _ebml_parse_elem in libavformat.a(matroskadec.o)
      ...
  "_av_strerror", referenced from:
      _tcp_open in libavformat.a(tcp.o)
      _tee_write_header in libavformat.a(tee.o)
      _log_net_error.constprop.3 in libavformat.a(udp.o)
      _udp_set_multicast_sources in libavformat.a(udp.o)
      _ff_udp_set_remote_url in libavformat.a(udp.o)
      _udp_open in libavformat.a(udp.o)
  "_av_stristart", referenced from:
      _http_open_cnx in libavformat.a(http.o)
      _rtsp_parse_range_npt in libavformat.a(rtsp.o)
      _ff_rtsp_parse_line in libavformat.a(rtsp.o)
      _ff_http_auth_handle_header in libavformat.a(httpauth.o)
  "_av_stristr", referenced from:
      _http_open_cnx in libavformat.a(http.o)
      _sami_decode_frame in libavcodec.a(samidec.o)
  "_av_strlcat", referenced from:
      _ff_url_join in libavformat.a(utils.o)
      _ff_make_absolute_url in libavformat.a(utils.o)
      _hls_write_header in libavformat.a(hlsenc.o)
      _matroska_convert_tag in libavformat.a(matroskadec.o)
      _matroska_convert_tag.constprop.7 in libavformat.a(matroskadec.o)
      _mmsh_open_internal.isra.0 in libavformat.a(mmsh.o)
      _mov_open_dref in libavformat.a(mov.o)
      ...
  "_av_strlcatf", referenced from:
      _ff_url_join in libavformat.a(utils.o)
      _ff_rdt_subscribe_rule in libavformat.a(rdt.o)
      _mov_write_udta_sdp in libavformat.a(movenc.o)
      _framecrc_write_packet in libavformat.a(framecrcenc.o)
      _http_open_cnx in libavformat.a(http.o)
      _handle_invoke_error.isra.11 in libavformat.a(rtmpproto.o)
      _ff_rtsp_send_cmd_with_content_async in libavformat.a(rtsp.o)
      ...
  "_av_strlcpy", referenced from:
      _dump_metadata.part.8.constprop.29 in libavformat.a(utils.o)
      _avformat_open_input in libavformat.a(utils.o)
      _av_url_split in libavformat.a(utils.o)
      _ff_make_absolute_url in libavformat.a(utils.o)
      _asf_read_header in libavformat.a(asfdec.o)
      _concat_open in libavformat.a(concat.o)
      _mov_write_moov_tag in libavformat.a(movenc.o)
      ...
  "_av_strncasecmp", referenced from:
      _av_find_input_format in libavformat.a(utils.o)
      _av_probe_input_buffer in libavformat.a(utils.o)
      _av_guess_format in libavformat.a(utils.o)
      _data_open in libavformat.a(data_uri.o)
      _http_read_header in libavformat.a(http.o)
      _http_open_cnx in libavformat.a(http.o)
      _jacosub_read_header in libavformat.a(jacosubdec.o)
      ...
  "_av_strstart", referenced from:
      _ff_make_absolute_url in libavformat.a(utils.o)
      _rdt_parse_sdp_line in libavformat.a(rdt.o)
      _ff_real_parse_sdp_a_line in libavformat.a(rdt.o)
      _cache_open in libavformat.a(cache.o)
      _concat_open in libavformat.a(concat.o)
      _crypto_open2 in libavformat.a(crypto.o)
      _data_open in libavformat.a(data_uri.o)
      ...
  "_av_strtod", referenced from:
      _parse_video_var in libavformat.a(mvdec.o)
  "_av_strtok", referenced from:
      _http_open_cnx in libavformat.a(http.o)
      _seg_write_header in libavformat.a(segment.o)
      _sami_decode_frame in libavcodec.a(samidec.o)
  "_av_tempfile", referenced from:
      _cache_open in libavformat.a(cache.o)
  "_av_timecode_adjust_ntsc_framenum2", referenced from:
      _ff_mpeg1_encode_picture_header in libavcodec.a(mpeg12enc.o)
  "_av_timecode_check_frame_rate", referenced from:
      _mov_write_header in libavformat.a(movenc.o)
  "_av_timecode_get_smpte_from_framenum", referenced from:
      _dv_write_pack in libavformat.a(dvenc.o)
      _dv_write_pack.constprop.0 in libavformat.a(dvenc.o)
      _mxf_write_packet in libavformat.a(mxfenc.o)
  "_av_timecode_init", referenced from:
      _dv_write_header in libavformat.a(dvenc.o)
      _mov_read_header in libavformat.a(mov.o)
      _mxf_write_header in libavformat.a(mxfenc.o)
      _mxf_read_header in libavformat.a(mxfdec.o)
  "_av_timecode_init_from_string", referenced from:
      _dv_write_header in libavformat.a(dvenc.o)
      _mov_write_header in libavformat.a(movenc.o)
      _mxf_write_header in libavformat.a(mxfenc.o)
      _encode_init in libavcodec.a(mpeg12enc.o)
  "_av_timecode_make_mpeg_tc_string", referenced from:
      _decode_chunks in libavcodec.a(mpeg12dec.o)
  "_av_timecode_make_smpte_tc_string", referenced from:
      _dv_read_header in libavformat.a(dv.o)
  "_av_timecode_make_string", referenced from:
      _mov_read_header in libavformat.a(mov.o)
      _mxf_read_header in libavformat.a(mxfdec.o)
  "_av_timegm", referenced from:
      _ff_iso8601_to_unix_time in libavformat.a(utils.o)
  "_av_tree_destroy", referenced from:
      _ff_nut_free_sp in libavformat.a(nut.o)
  "_av_tree_enumerate", referenced from:
      _ff_nut_free_sp in libavformat.a(nut.o)
  "_av_tree_find", referenced from:
      _read_seek in libavformat.a(nutdec.o)
      _nut_write_trailer in libavformat.a(nutenc.o)
      _nut_write_packet in libavformat.a(nutenc.o)
  "_av_tree_insert", referenced from:
      _ff_nut_add_sp in libavformat.a(nut.o)
  "_av_tree_node_alloc", referenced from:
      _ff_nut_add_sp in libavformat.a(nut.o)
  "_av_usleep", referenced from:
      _rtmp_http_read in libavformat.a(rtmphttp.o)
      _read_data in libavformat.a(hls.o)
      _hls_read in libavformat.a(hlsproto.o)
      _ffurl_read in libavformat.a(avio.o)
      _ffurl_read_complete in libavformat.a(avio.o)
      _ffurl_write in libavformat.a(avio.o)
  "_av_vlog", referenced from:
      _av_log_ask_for_sample in libavcodec.a(utils.o)
  "_avpriv_cga_font", referenced from:
      _decode_frame in libavcodec.a(ansi.o)
      _decode_init in libavcodec.a(bintext.o)
      _tmv_decode_frame in libavcodec.a(tmv.o)
  "_avpriv_evaluate_lls", referenced from:
      _ff_lpc_calc_coefs in libavcodec.a(lpc.o)
  "_avpriv_float_dsp_init", referenced from:
      _aac_decode_init in libavcodec.a(aacdec.o)
      _aac_encode_init in libavcodec.a(aacenc.o)
      _ac3_decode_init in libavcodec.a(ac3dec.o)
      _atrac1_decode_init in libavcodec.a(atrac1.o)
      _atrac3_decode_init in libavcodec.a(atrac3.o)
      _dca_decode_init in libavcodec.a(dcadec.o)
      _imc_decode_init in libavcodec.a(imc.o)
      ...
  "_avpriv_frame_get_metadatap", referenced from:
      _avcodec_decode_video2 in libavcodec.a(utils.o)
      _avcodec_decode_audio4 in libavcodec.a(utils.o)
      _add_doubles_metadata in libavcodec.a(tiff.o)
      _add_shorts_metadata in libavcodec.a(tiff.o)
      _tiff_decode_tag in libavcodec.a(tiff.o)
      _decode_frame in libavcodec.a(tiff.o)
  "_avpriv_init_lls", referenced from:
      _ff_lpc_calc_coefs in libavcodec.a(lpc.o)
  "_avpriv_report_missing_feature", referenced from:
      _parse_MP4SLDescrTag.isra.13 in libavformat.a(mpegts.o)
      _ogg_read_page in libavformat.a(oggdec.o)
      _rso_read_header in libavformat.a(rsodec.o)
      _ff_spdif_read_packet in libavformat.a(spdifdec.o)
      _write_header in libavformat.a(wvenc.o)
      _aac_adtstoasc_filter in libavcodec.a(aac_adtstoasc_bsf.o)
      _aac_decode_frame_int in libavcodec.a(aacdec.o)
      ...
  "_avpriv_request_sample", referenced from:
      _read_header in libavformat.a(anm.o)
      _ast_read_header in libavformat.a(astdec.o)
      _au_read_header in libavformat.a(au.o)
      _avr_read_header in libavformat.a(avr.o)
      _vid_read_packet in libavformat.a(bethsoftvid.o)
      _read_header in libavformat.a(brstm.o)
      _ea_read_packet in libavformat.a(electronicarts.o)
      ...
  "_avpriv_scalarproduct_float_c", referenced from:
      _apply_pitch_filters in libavcodec.a(qcelpdec.o)
      _qcelp_decode_frame in libavcodec.a(qcelpdec.o)
      _ra288_decode_frame in libavcodec.a(ra288.o)
      _decode_frame in libavcodec.a(sipr.o)
      _postfilter.constprop.4 in libavcodec.a(wmavoice.o)
      _synth_superframe in libavcodec.a(wmavoice.o)
      _ff_amr_set_fixed_gain in libavcodec.a(acelp_pitch_delay.o)
      ...
  "_avpriv_set_systematic_pal2", referenced from:
      _gif_write_header in libavformat.a(gif.o)
      _video_get_buffer in libavcodec.a(utils.o)
      _raw_init_decoder in libavcodec.a(rawdec.o)
      _bmp_encode_frame in libavcodec.a(bmpenc.o)
      _gif_encode_init in libavcodec.a(gif.o)
      _pcx_encode_frame in libavcodec.a(pcxenc.o)
  "_avpriv_solve_lls", referenced from:
      _ff_lpc_calc_coefs in libavcodec.a(lpc.o)
  "_avpriv_update_lls", referenced from:
      _ff_lpc_calc_coefs in libavcodec.a(lpc.o)
  "_avpriv_vga16_font", referenced from:
      _decode_frame in libavcodec.a(ansi.o)
      _decode_init in libavcodec.a(ansi.o)
      _decode_init in libavcodec.a(bintext.o)
  "_compress", referenced from:
      _encode_strip in libavcodec.a(tiffenc.o)
     (maybe you meant: _ff_mp3_header_compress_bsf)
  "_compress2", referenced from:
      _flashsv2_encode_frame in libavcodec.a(flashsv2enc.o)
      _flashsv_encode_frame in libavcodec.a(flashsvenc.o)
  "_crc32", referenced from:
      _png_write_chunk in libavcodec.a(pngenc.o)
      _encode_frame in libavcodec.a(pngenc.o)
  "_deflate", referenced from:
      _flashsv_decode_frame in libavcodec.a(flashsv.o)
      _flashsv2_encode_frame in libavcodec.a(flashsv2enc.o)
      _encode_frame in libavcodec.a(pngenc.o)
      _encode_frame in libavcodec.a(lclenc.o)
      _encode_frame in libavcodec.a(zmbvenc.o)
  "_deflateBound", referenced from:
      _flashsv_decode_frame in libavcodec.a(flashsv.o)
      _encode_frame in libavcodec.a(pngenc.o)
      _encode_frame in libavcodec.a(lclenc.o)
  "_deflateEnd", referenced from:
      _flashsv_decode_frame in libavcodec.a(flashsv.o)
      _flashsv2_encode_frame in libavcodec.a(flashsv2enc.o)
      _flashsv_encode_end in libavcodec.a(flashsvenc.o)
      _encode_frame in libavcodec.a(pngenc.o)
      _encode_end in libavcodec.a(lclenc.o)
      _encode_end in libavcodec.a(zmbvenc.o)
  "_deflateInit2_", referenced from:
      _encode_frame in libavcodec.a(pngenc.o)
  "_deflateInit_", referenced from:
      _flashsv_decode_frame in libavcodec.a(flashsv.o)
      _flashsv2_encode_frame in libavcodec.a(flashsv2enc.o)
      _encode_init in libavcodec.a(lclenc.o)
      _encode_init in libavcodec.a(zmbvenc.o)
  "_deflateReset", referenced from:
      _encode_frame in libavcodec.a(lclenc.o)
      _encode_frame in libavcodec.a(zmbvenc.o)
  "_ff_log2_tab", referenced from:
      _ebml_read_num.isra.1 in libavformat.a(matroskadec.o)
      _ff_rtsp_connect in libavformat.a(rtsp.o)
      _seqvideo_decode_frame in libavcodec.a(tiertexseqv.o)
      _decode_frame in libavcodec.a(xsubdec.o)
      _put_xsub_rle in libavcodec.a(xsubenc.o)
      _xsub_encode_rle in libavcodec.a(xsubenc.o)
      _ff_ps_read_data in libavcodec.a(aacps.o)
      ...
  "_inflate", referenced from:
      _matroska_decode_buffer.isra.4 in libavformat.a(matroskadec.o)
      _rtmp_open in libavformat.a(rtmpproto.o)
      _zlib_refill in libavformat.a(swfdec.o)
      _flashsv_decode_frame in libavcodec.a(flashsv.o)
      _decode_frame in libavcodec.a(lcldec.o)
      _decode_text_chunk.isra.4 in libavcodec.a(pngdec.o)
      _decode_frame in libavcodec.a(pngdec.o)
      ...
  "_inflateEnd", referenced from:
      _matroska_decode_buffer.isra.4 in libavformat.a(matroskadec.o)
      _rtmp_open in libavformat.a(rtmpproto.o)
      _swf_read_close in libavformat.a(swfdec.o)
      _flashsv_decode_end in libavcodec.a(flashsv.o)
      _decode_end in libavcodec.a(lcldec.o)
      _decode_text_chunk.isra.4 in libavcodec.a(pngdec.o)
      _decode_frame in libavcodec.a(pngdec.o)
      ...
  "_inflateInit_", referenced from:
      _matroska_decode_buffer.isra.4 in libavformat.a(matroskadec.o)
      _rtmp_open in libavformat.a(rtmpproto.o)
      _swf_read_header in libavformat.a(swfdec.o)
      _flashsv_decode_init in libavcodec.a(flashsv.o)
      _decode_init in libavcodec.a(lcldec.o)
      _decode_text_chunk.isra.4 in libavcodec.a(pngdec.o)
      _decode_frame in libavcodec.a(pngdec.o)
      ...
  "_inflateReset", referenced from:
      _flashsv_decode_frame in libavcodec.a(flashsv.o)
      _decode_frame in libavcodec.a(lcldec.o)
      _decode_frame in libavcodec.a(tscc.o)
      _zerocodec_decode_frame in libavcodec.a(zerocodec.o)
      _decode_frame in libavcodec.a(zmbv.o)
  "_inflateSync", referenced from:
      _flashsv_decode_frame in libavcodec.a(flashsv.o)
  "_uncompress", referenced from:
      _mov_read_cmov in libavformat.a(mov.o)
      _swf_read_packet in libavformat.a(swfdec.o)
      _decode_frame in libavcodec.a(cscd.o)
      _decode_frame in libavcodec.a(dxa.o)
      _decode_block in libavcodec.a(exr.o)
      _ff_id3v2_read in libavformat.a(id3v2.o)
      _svq3_decode_init in libavcodec.a(svq3.o)
      ...
ld: symbol(s) not found for architecture x86_64
collect2: error: ld returned 1 exit status

Maybe this will help somebody in the same situation.

Getting started with gtest in Eclipse Juno under Mac OS

As part of my project of trying to get in to test driven development I read this blog post by Grzegorz Gałęzowski which gives a brief introduction on how to use Eclipse Juno and C/C++ Unit. My experience was that it wasn’t quite as simple as described to get things running under Mac OS. This post aims to provide detailed instructions on how to get gtest and C/C++ Unit working in Eclipse under Mac OS.

Install C/C++ Unit

Eclipse doesn’t come with the C/C++ Unit plugin installed by default, fortunately Eclipse makes it easy to browse for and install new software. To install navigate to “Help” > “Install New Software…”.

For the “Work with” field select “Juno – http://download.eclipse.org/releases/juno&#8221; and wait for the list of available plugins. Under “Programming Languages” select “C/C++ Unit Testing Support” and click next until you’re done. Now click “Window” > “Show View” > “Other…” and find “C/C++ Unit” under “C/C++” and press “OK”. You should now see the C/C++ Unit view in your workspace.

Install gtest

Download gtest from here and extract the contents to a folder of your choice, I’m using ~/tmp. This will get you the header files (they are located in the include folder), but we also need to compile the libraries. Fortunately this is straight forward:

cd ~/tmp/gtest-1.6.0
./configure && make

The compiled libraries can be found under ~/tmp/gtest-1.6.0/lib/.lib/. The files of interest are libgtest.a and libgtest_main.a.

Let’s move the files we need to a common place, say ~/dev/frameworks/:

mkdir -p ~/dev/frameworks/
cd ~/dev/frameworks/
mkdir -p gtest/{lib,include}
cd gtest
cp ~/tmp/gtest-1.6.0/lib/.libs/*.a lib/
cp -R ~/tmp/gtest-1.6.0/include/ include/

Moving on!

Setting up Eclipse

The first step is to create a C++ project. This is done by pressing “File” > “New” > “C++ Project”. Select “empty project”, give your project a name and select a toolchain. I’m using “Cross GCC”.

Now right click on your project and click “Properties” and navigate to “C/C++ Build” > “Settings”. Under “Cross G++ Compiler” > “Includes” add ~/dev/frameworks/gtest/include as an include path. Under “Cross G++ Linker” > “Libraries” add gtest_main and gtest as libraries and ~/dev/frameworks/gtest/lib as library search path. If you placed your files under /usr/local/lib/ (or some other path already in the default search path) in the previous step you don’t need to specify a path. Anyway, you should now have something that looks like this:

Create a build target for running tests

With that sorted we’ll soon be ready to write some tests, but we still miss two things: the build and run configurations.

To create a test build target right click on your project and navigate to “Build configurations” > “Manage…”. Click “New” and give it an appropriate name, I’m calling mine “UnitTest” and choosing to copy settings from “Debug”. You should now have three build targets, namely Debug, Release and UnitTest:

Build configuration
Build configuration

Before we continue with creating the run configuration we need to create some basic directory structure and files. Create one folder named “test” that will contain our test code and one named “src” for application code that we want to test. Inside the “test” folder create an empty C++ file, I chose to name mine “first_test.cpp”. In the “src” directory create a empty file called “main.cpp”, this file will be the entry point to our application, aka house the infamous main function.

When building our product code we don’t want to build all our test code so we’ll exclude our test folder from the “Debug” and “Release” target. This is done by right clicking the “test” folder and selecting “Resource Configurations” > “Exclude from Build…” and check “Debug” and “Release”. Also, when running our tests the main function in main.cpp will interfere with the main function in gtest_main (this is why we included it). To fix this simply exclude main.cpp from the “UnitTest” target. Now build the “UnitTest” target as this is needed for the next step.

We are now ready for the final step: creating our run configuration. I though this was supposted to be done automatically by Eclipse, but it doesn’t look that way, at least not in Mac OS. For me Eclipse  was complaining about not finding the binary to run.

Click “Run” > “Run Configurations…” and click on “C/C++ Unit” in the menu. Now create a new configuration named “UnitTest” and browse to the location of your built binary under the “UnitTest” build folder, for me the path was ~/dev/workspace/TempProject/UnitTest/TempProject. Select your project and under “C/C++ Testing” select “Google Tests Runner” and press “Run”. Nothing will happen really, but you should not be getting any errors.

You might need to create a run configuration for your application code as well, if it doesn’t run by default. The process is exactly the same as described above, except that you don’t select a test runner. Now let’s try to get some tests running!

See it in action

Below is the source code i put in first_test.cpp. The tests doesn’t really test anything in particular, but they will tell us if C/C++ Unit is working.

#include <gtest/gtest.h>

TEST(MyFirstTest, AssertToFalse)
{
	ASSERT_FALSE(false);
}

TEST(MyFirstTest, AssertToTrue)
{
	ASSERT_TRUE(true);
}

TEST(MyFirstTest, TwoGreaterThanOne)
{
	ASSERT_GT(2, 1);
}

If the flying spaghetti monster is good you should see this:

How C/C++ Unit should look if the tests pass
How C/C++ Unit should look if the tests pass

That is, now go write some tests!